일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 게시글 이미지
- 3계층구조
- 환경변수
- N+1문제
- Winston
- JWT 쓰는 방법
- 패스파라미터
- 이미지가 포함된 게시글
- 쿼리스트링
- 메뉴바
- secret코드
- unnest
- element.style
- 메뉴바 한번에
- 포트번호
- JWT
- 스테이지어스
- 알림생성모듈
- JWT 쓰는이유
- N+1
- 알림생성
- 게시글 이미지 업로드
- route 53
- 레포지토리
- 네비게이션 한번에
- 토큰
- 부트캠프
- JSON Web Token
- .env
- getComputedStyle
- Today
- Total
기주
6.너비우선탐색(BFS) / 깊이우선탐색(DFS) 본문
두가지 방식 모두 그래프를 이용하여 표현
1. 깊이우선탐색(DFS : depth first search)
-하나씩 자식노드들을 끝까지 파고 내려간다
-재귀함수로 구현하면 더 간단해진다
-스택사용
2. 너비우선탐색(BFS : Breadth first search)
-노드들을 단계별로 나누어 한단계씩 탐색해나간다
-같은 레벨에 있는 노드들끼리 탐색한다
(루트 - 첫번째 자식 노드들 - 두번째자식 노드들 - 세번째자식 노드들)
-큐사용
-너비우선탐색을 이용하면 최단 경로를 찾을 수 있다
최단 경로는 여러 의미로 사용될 수 있다
ex)
1: 체스 게임에서 가장 적은 수로 승리하는 방법 (최소한의 수)
2.맞춤법 검사기(가장 적은 개수의 글자를 고쳐서 올바른 단어를 만드는 방법찾기)
3.현재 네트워크에서 가장 가까운 의사찾기
<출발지에서 금문교까지의 최단 경로찾기>
출발지에서 1단계만에 갈 수있는 노드들 확인 -> 금문교 도착확인 (yes or no)
-> (no) 2단계만에 갈 수있는 노드들 확인 -> 금문교 도착확인 (yes or no)
-> (no) 3단계만에 갈 수있는 노드들 확인 -> 금문교 도착확인 (yes or no)
-> (yes : 금문교 도착) 금문교 도착까지의 최단거리는 3단계
출발지에서 금문교까지 가는데에는 최소한으로 가면 3단계가 걸린다
위와같이 그래프로 모형화 한뒤에 너비우선탐색으로 해결할 수 있다
너비우선탐색으로
1. 경로가 존재하는가?
2. 최단경로는 무엇인가?
를 알 수 있다
<망고 판매상 찾기>
나의 친구가 3명일때 한명씩 망고 판매상인지 확인한다. 맞으면 바로 종료 아니면 다른 사람확인 반복
나의 친구(1단계 친구) : (프로도, 네오, 튜브)
망고 판매상이 아니라면, 그 사람의 친구들도 탐색목록에 추가한다.
(1단계 친구에서)망고 판매상이 없을 시 친구의 친구까지 확인한다
친구의 친구(2단계친구) : (라이언, 무지,제이지, 콘)
반복시 친구의 친구들까지 전체 그래프를 탐색하게 된다.
이러한 방식으로 너비우선탐색은
1.경로가 존재하는지(나의 네트워크에 망고 판매상이 존재하는지)
2. 최단경로가 무엇인지(누가 가장 가까운 망고판매상인지)
를 알 수 있게 해준다.
1단계 친구들을 먼저 확인해보고 없는 경우에만, 2단계 친구들을 확인한다.
그렇기에 너비 우선탐색이 진행될수록 탐색범위는 출발점에서 멀어진다
1단계친구들 확인 - 2단계친구들 확인 - 3단계친구들 확인
이렇게 순서대로 찾기때문에 자료구조 큐(선입선출)를 사용한다
<망고판매상 찾기 알고리즘>
1. 확인할 사람의 명단을 넣을 큐를 준비한다(프로도, 네오, 튜브)
2. 큐에서 한 사람을 꺼낸다
3.이 사람이 망고 판매상인지 확인한다(yes or no)
(yes) : 끝
(no) : 그 사람의 이웃을 모두 큐에 추가한다.
4.반복문 수행
5. 큐가 비어있다면 네트워크에 망고판매상이 존재하지 않는다
알고리즘이 종료되는 2가지 경우
1.망고판매상을 발견한 경우
2.큐가 비게되는 경우 (망고판매상이 존재하지 않는경우)
*조심해야할 부분
무지가 2명이서 함께 알고있는 친구인 경우, 무지가 망고 판매상인지 한번만 확인하면 된다.
그렇기 때문에 한번 확인한 사람은 다시 탐색되지 않도록 설정해야한다.
그렇지 않으면 무한루프에 빠질 수 있다
(나 - 무지 - 나 - 무지)
코드 구현)
<너비우선탐색의 실행시간>
1.네트워크를 전체 탐색함(= 모든 정점을 따라 움직임)
-> O(간선의 개수)
2.탐색할 사람을 저장하는 큐가 있어야한다
큐에 사람을 추가하는데 걸리는 시간
-> O(1) (상수시간)
총 실행시간 O(사람(정점)의 수 + 간선의 수)
정리)
-너비우선탐색은 A에서 B까지가는 경로가 있는지 알려준다
-경로가 존재한다면 최단경로도 찾아준다
-그래프로 모형화하기
- 방향 그래프, 무방향 그래프 둘다 있을 수 있음
-탐색 목록에 추가된 순서대로 사람을 확인해야한다
- 한번 확인이 된 사람은 다시 확인이 되지 않게 해야한다
그렇지 않으면 무한루프에 빠질 위험이 있다
'알고리즘' 카테고리의 다른 글
[알고리즘] java 좌표정렬 (compareTo) (0) | 2024.11.17 |
---|---|
[알고리즘] 삽입정렬 (0) | 2024.11.14 |
[알고리즘] 버블정렬 (0) | 2024.11.13 |
[알고리즘] 선택정렬 (0) | 2024.11.13 |
[TIL]자료구조 - 이진트리 (0) | 2024.10.20 |