알고리즘 스터디 탐색

Preview:

Citation preview

탐색

DevRookie

프로모션(권승진)

목차

• 탐색의 의미

• 순차 탐색

• 이진 탐색

• 이진 탐색 트리

• 레드 블랙 트리

탐색의 의미

• 탐색– 드러나지 않은 사물을 찾아내기 위하여 살피어 찾음

– 컴퓨터에서는 ‘데이터’를 찾아내는 과정

탐색의 의미

• 탐색– 드러나지 않은 사물을 찾아내기 위하여 살피어 찾음

– 컴퓨터에서는 ‘데이터’를 찾아내는 과정

탐색의 의미

• 종류– 비정렬 데이터에서의 검색

– 정렬 “

– 탐색을 위해 자료구조 자체를 새로 구성

순차 탐색

순차 탐색

[0] [1] [2] [3] [4] [5] ……

배열

여기 있니???

없구나. 다음

순차 탐색

[0] [1] [2] [3] [4] [5] ……

배열

그럼 여기 있니???

없구나. 다음

순차 탐색

[0] [1] [2] [3] [4] [5] ……

배열

그럼 여기 있니???

여기있네!!!!?

순차 탐색

• 처음부터 끝까지 모든 요소를 검사

• 정렬되지 않는 데이터 집합에서

사용 가능한 유일한 탐색 방법

순차 탐색

• 코드로 치면 이런 식..

순차 탐색

• 최악의 경우

– 수행시간은 O(n)

[0] [1] [2] [3] [4] [n]……

아~이런! 제일

마지막에 있었구나!

순차 탐색

• 순차도 조금 최적화를 해보고 싶다!

• 자주 찾는 물건은 시작점에 가까운 곳으로!

순차 탐색

• 자기 구성 순차 탐색

– 전진 이동법

– 전위법

– 빈도 계수법

순차 탐색

• 자기 구성 순차 탐색

– 전진 이동법(Move to front method)

• hit 했을 때 제일 앞으로 옮김.

• 예) 40 검색 시

10 20 50 40 15 20013

찾았다 40! 다음에 빨리 찾도록

맨 앞으로 옮겨놔야지!!!!

순차 탐색

• 자기 구성 순차 탐색

– 전진 이동법(Move to front method)

10 2040 15 2001350

한번 탐색된 항목이 또 다시 검색될 가능성이 높은 데이터 집합에만 사용

순차 탐색

• 자기 구성 순차 탐색

– 전진 이동법(Move to front method)

• 한번 탐색된 항목이 또 다시 검색될 가능성이 높은

데이터 집합에만 사용

• 배열에서는 엄청 비효율적일 듯…

순차 탐색

• 자기 구성 순차 탐색

– 전위법(Transpose method)

• hit 했을 때 한 칸 앞자리로 옮김.

• 예) 40 검색 시

10 20 50 40 15 20013

찾았다 40!

40의 우선순위를 올려야겠어!!

순차 탐색

• 자기 구성 순차 탐색

– 전위법(Transpose method)

• hit 했을 때 한 칸 앞자리로 옮김.

• 예) 40 검색 시

10 20 15 200135040

순차 탐색

• 자기 구성 순차 탐색

– 전위법(Transpose method)

• 탐색이 여러 번 진행되면?

순차 탐색

• 자기 구성 순차 탐색

– 계수법

• 탐색횟수를 별도의 공간에 저장해두고, 그것을 토

대로 재구성 하는 알고리즘.

• 엄청 민주적이지만, 비용이…

순차 탐색

• 정리

– 처음부터 끝까지!

– 정렬되지 않는 집합에서 탐색은 이 방법밖에!!

– 자기 구성 순차 탐색

순차 탐색

• 한가지 더 짚고 넘어갈 것??

이진 탐색

집합이 정렬되어 있다면

순차보다 좋은 방법이 있다!!!

이진 탐색

• 정렬된 데이터라면 ‘범위’라는

개념으로 줄여나갈 수 있다.

– 예) 15을 찾는다면,

10 13 15 20 40 50 200

배열 정중앙을 보니 20이네!!

정렬된 데이터니까 0~정중앙 사이에 있겠네!!?

이진 탐색

• 정렬된 데이터라면 ‘범위’라는

개념으로 줄여나갈 수 있다.

– 예) 15을 찾는다면,

10 13 15 20 40 50 200

이진 탐색

• ‘범위’의 개념을 이용한 이진 탐색

1. 중앙 요소를 고른다.

10 13 15 20 40 50 200

예) 15을 찾는다면,

배열크기 : 7

절반 : 3

이진 탐색

• ‘범위’의 개념을 이용한 이진 탐색

2. 중앙의 값와 Target값을 비교

10 13 15 20 40 50 200

예) 15을 찾는다면,

15 < 20

이진 탐색

• ‘범위’의 개념을 이용한 이진 탐색3. 값을 찾을 때까지 절반이 된 범위에 1~3적용

10 13 15 20 40 50 200

배열크기 : 3

절반 : 1

이진 탐색

• ‘범위’의 개념을 이용한 이진 탐색

3. 값을 찾을 때까지 절반이 된 범위에 1~3적용

예) 15을 찾는다면,

10 13 15 20 40 50 200

15 > 13

이진 탐색

• ‘범위’의 개념을 이용한 이진 탐색

3. 값을 찾을 때까지 절반이 된 범위에 1~3적용

예) 15을 찾는다면,

10 13 15 20 40 50 200

15 == 15

이진 탐색

• 한번 비교할 때마다 범위가 절반씩 주네!!!

배열의 크기가 N일 때 탐색시마다 범위는???

N/2 N/4 N/16첫 탐색 시 두 번째 탐색 시 세번째 탐색 시

이진 탐색

• 한번 비교할 때마다 범위가 절반씩 주네!!!

배열의 크기가 N이고, 탐색횟수를 x라 했을때

x번째에 데이터 범위 =

이진 탐색

• 한번 비교할 때마다 범위가 절반씩 주네!!!

최악의 경우는

= 1일 경우

이진 탐색

이진 탐색

• 즉, 최악의 시간은 log2n

• 예를 들자면,• 100만개의 데이터에서 20회

• 1,000만 개의 데이터에서 23회

이진 탐색

• 정렬 할 수만 있다면…

– 순차와 비교도 안 되는 압도적인 속도

이진 탐색

• 코드로 보면..

이진 탐색

• 코드로 보면..

링크드 리스트의 정 중앙에 어떻게 접근해..

이진 탐색

• 동적으로 크기가 변경되는 자료구조여야 한다면..

이진 탐색 트리

이진 트리

• 종류– 비정렬 데이터에서의 검색

– 정렬 “

–탐색을 위해 자료구조

자체를 새로 구성

이진 트리

• 개념

–데이터를 한번 가공(자료구조

셋팅) 후 삽입, 삭제, 탐색이

용이하도록 만듬

이진 트리

• 특성– 루트가 있고, 2개의 자식을 가짐

– 어떤 노드의 키 값은 왼쪽 자식보다 크고, 오른쪽 자식보다 작다.

– 키 중복 불가

이진 트리

• 특성

– 35를 탐색한다?

음 30보다 크군 그럼 오른쪽으로

< 35

> 35

음 40보다 작군 그럼 왼쪽으로

이진 트리

• 삽입 과정

이진 트리

• 삭제 과정 (지우는 노드가 리프 노드인 경우)

이진 트리

• 삭제 과정(지우는 노드의 자식 노드가 하나인 경우)

• 자식을 링크시켜준다.

이진 트리

• 삭제 과정(지우는 노드의 자식 노드가 둘인 경우)

• 트리 안에서 자기 자신과 가장 가까운 수를

매치시킨다.

• 오른쪽 노드중 가장 큰 수나

• 왼쪽 노드중 가장 작은 수

이진 트리따지고 보면 30은 다른 자리로 가고, 이 자리도 없어지는거나 마찬가지

이 노드에 대한 삭제 알고리즘도 이뤄져야 한다. 결국은 재귀적

이진 트리

저장과 검색에 평균 Θ(log n)시간이 소요되지만,

최악의 경우 Θ(n)에 근접한 시간이 소요될수 있다.

> 35

이진 트리

40

30

3520

10 25

??

40

30

35

20

10

25

?

?

이진 트리

• 이진 트리 자체가

동적 데이터를 위해 기획된 것

• 어떤 데이터가 어떤 순서로

들어올지 아무도 모른다.

40

30

35

20

25

10

레드 블랙 트리

레드 블랙 트리1. 모든 노드는 빨간색or검은색 둘중 하나다.

2. 루트 노드는 검은 색이다.

3. 잎 노드는 검은 색이다.

4. 빨간 노드의 자식들은 모두 검은색이다.

하지만 검은색 노드의 자식이 빨간색일 필요는

없다.

……

……

등등의 많은 규칙들로 이루어져 있다??

레드 블랙 트리

레드 블랙 트리

이진 트리의 규칙균형 유지를 위한

새로운 규칙

레드 블랙 트리

균형 유지를 위한

새로운 규칙

삽입 될 때마다 지들이 요리조리

자리를 바꿔서 균형이

잘 유지되는 방법이 없을까????

레드 블랙 트리

균형 유지를 위한

새로운 규칙

해서 고안된

방법 중 하나가 색깔 개념을 도입하여

균형 유지를 하는

레드 블랙 트리

레드 블랙 트리

균형 유지를 위한

새로운 규칙

1. 모든 노드는 빨간색or검은색 둘 중 하나다.

2. 루트 노드는 검은 색이다.

3. 잎 노드는 검은 색이다.

4. 빨간 노드의 자식들은 모두 검은색이다.

빨간 노드의 부모는 반드시 검은색이다.

5. 루트 노드에서의 모든 잎 노드 사이에

있는 검은색 노드의 수는 모두 동일하다.

레드 블랙 트리4. 빨간 노드의 자식들은 모두 검은색이다.

빨간 노드의 부모는 반드시 검은색이다.

5. 루트 노드에서의 모든 잎 노드 사이에

있는 검은색 노드의 수는 모두 동일하다.

이 규칙이 적용되면

루트 노드부터 가장 먼 경로까지의 거리가,

가장 가까운 경로까지의 거리의

두 배 보다 항상 작다.

레드 블랙 트리

• 무슨 말 인가하면…

Root

Leaf

Leaf

가장 가까운 경로

레드 블랙 트리

• 무슨 말 인가하면…

Root

Leaf

Leaf

가장 먼 경로

레드 블랙 트리

• 그래서 규칙이 지켜지면

– 개략적(roughly)으로

– 균형이 잡혀 있다(balanced)

는 사실을 보장된다고 말하는 것

레드 블랙 트리

• 이론이 정립 됬으면

– 다음은 탐색, 삽입, 삭제를 알아보는 것

– 탐색은 색깔 개념이 필요 없다.

– 그냥 이진 트리 탐색처럼 찾으면 끝.

레드 블랙 트리

• 회전의 개념

– 자식을 부모의 위치로 올림.

• 왼쪽자식을 부모 위치로 -> 우회전

• 오른쪽자식을 부모 위치로 -> 좌회전

8

5

3

9

6

8

5

3

96

레드 블랙 트리

• 회전의 개념

– 자식을 부모의 위치로 올림.

8

5

3

9

6

8

5

3

96

8

5

3

96

레드 블랙 트리

• 회전의 개념

– 자식을 부모의 위치로 올림.

8

5

3

9

6

8

5

3

9

6

8

5

3

96

레드 블랙 트리

• 삽입의 개념

– 작업 1. 이진 트리와 같이 삽입(기본 레드)

– 작업 2. 레드 블랙 규칙을 맞춤

레드 블랙 트리

• 삽입의 개념

1. 모든 노드는 빨간색or검은색 둘 중 하나다.

2. 루트 노드는 검은 색이다.

3. 잎 노드는 검은 색이다.

4. 빨간 노드의 자식들은 모두 검은색이다.

빨간 노드의 부모는 반드시 검은색이다.

5. 루트 노드에서의 모든 잎 노드 사이에

있는 검은색 노드의 수는 모두 동일하다.

레드 블랙 트리

• 삽입의 개념

– 경우

• 삽입할 자리의 부모 노드가 검은색일 때

– 규칙 유지

• 삽입할 자리의 부모 노드가 빨간색일 때

– 규칙 위반

레드 블랙 트리13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL NIL

레드 블랙 트리

• 12를 추가13

8 17

1 11 15 25

NIL 6 NIL

NILNIL NIL

NIL NIL 22 27

NIL NIL NIL NIL

12

NIL

레드 블랙 트리

• 삽입의 개념

– 경우

• 삽입할 자리의 부모 노드가 빨간색일 때

– 규칙 위반

– 또다시 3가지 경우 (부모노드가 할아버지 노드의 오른쪽 자식일때)

» 삼촌도 빨간색

» 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 오른쪽

» 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 왼쪽

레드 블랙 트리

규칙 위반??

OK

부모 노드가

할아버지노드

의 오른쪽??

삼촌이

빨강??

삼촌이

빨강??

아니 위반

오른쪽 왼쪽

응 빨강

아니 검정

옆에꺼

방향반대로..삽입 노드

가 오른쪽?왼쪽

오른쪽

레드 블랙 트리

• 삽입의 개념

– 경우• 삽입할 자리의 부모 노드가 빨간색일 때

– 규칙 위반

– 또다시 3가지 경우

»삼촌도 빨간색» 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 오른쪽

» 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 왼쪽

레드 블랙 트리

• 30을 추가13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL 30

레드 블랙 트리

• 30을 추가13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL 30

위반!

레드 블랙 트리

• 삽입의 개념

– 또다시 3가지 경우

• 삼촌도 빨간색– 부모와 삼촌을 검정으로 칠하고, 할아버지를 빨강으로.

– 재귀

레드 블랙 트리

• 30을 추가13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL 30

레드 블랙 트리

• 30을 추가13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL 30

레드 블랙 트리

• 30을 추가13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL 30

레드 블랙 트리

• 30을 추가13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL 30

위반!

레드 블랙 트리

• 30을 추가13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL 30

레드 블랙 트리

• 삽입의 개념

– 경우

• 삽입할 자리의 부모 노드가 빨간색일 때

– 규칙 위반

– 또다시 3가지 경우

» 삼촌도 빨간색

» 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 오른쪽

» 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 왼쪽

레드 블랙 트리

• 삽입의 개념

– 또다시 3가지 경우• 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 오른쪽

– 부모 노드를 검은색, 할아버지를 빨강으로 칠한 후

– 할아버지 노드를 부모와 회전

레드 블랙 트리13

8 17

1 11 15 25

NIL 6 NILNIL

NIL NIL

NIL NIL 22 27

NIL NIL NIL NIL

레드 블랙 트리13

8 17

1 11 15 25

NIL 6 NILNIL

NIL

NIL NIL 22 27

NIL NIL NIL NIL

7을 삽입

7

위반!

레드 블랙 트리13

8 17

1 11 15 25

NIL 6 NILNIL

NIL

NIL NIL 22 27

NIL NIL NIL NIL

7을 삽입

7

레드 블랙 트리13

8 17

1 11 15 25

NIL 6 NILNIL

NIL

NIL NIL 22 27

NIL NIL NIL NIL

7을 삽입

7

레드 블랙 트리13

8 17

1

11 15 25

NIL

6

NILNIL

NIL

NIL NIL 22 27

NIL NIL NIL NIL

7을 삽입

7

회전

NILNIL

레드 블랙 트리13

8 17

1

11 15 25

NIL

6

NILNIL

NIL

NIL NIL 22 27

NIL NIL NIL NIL

7을 삽입

7

회전

NILNIL

레드 블랙 트리

• 삽입의 개념

– 경우

• 삽입할 자리의 부모 노드가 빨간색일 때

– 규칙 위반

– 또다시 3가지 경우

» 삼촌도 빨간색

» 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 오른쪽

» 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 왼쪽

레드 블랙 트리

• 삽입의 개념

– 또다시 3가지 경우• 삼촌이 검은색이며, 새로 삽입한 노드가 부모의 왼쪽

– 부모 노드를 오른쪽으로 회전하면,

– 경우 2 같은 상황이 됨.

레드 블랙 트리13

8 17

1 11 15 25

NIL

6

NILNIL

NIL NIL 22 27

NIL NIL NIL NIL

5을 삽입

5

상황 2

NIL

레드 블랙 트리

• 삽입에도 시간이 log2n만큼 걸린다.

레드 블랙 트리

• 삭제는 숙제로…

레드 블랙 트리

• 정리– 레드 블랙 트리는 색깔 규칙으로 유지된다.

– 규칙이 유지되면, 루트에서 제일 가까운 노드와 루트에서 제일 먼 노드의 길이가 2배이상 차이 나지못한다.

– 그래서 개략적으로 균형이 잡힌다.

결론

• 순차 탐색

• 이진 탐색

• 이진 트리

• 레드 블랙 트리

QnA

참고 자료

• 뇌를 자극하는 알고리즘 도서

• 레드블랙트리 위키• http://ko.wikipedia.org/wiki/%EB%A0%88%EB%93%9C-

%EB%B8%94%EB%9E%99_%ED%8A%B8%EB%A6%AC

Recommended