[Algorithm]탐색2
📚레드-블랙 트리
📄레드-블랙 트리
레드-블랙 트리는 이진 탐색 트리이면서 균형 탐색 트리이다. 그리고 다음과 같은 성질을 가진다.
- 모든 노드는 검정이거나 빨강이다.
- 루트 노드와 리프 노드는 검정이다.(모든 리프 노드는 NULL 노드이다.)
- 빨강 노드의 부모 노드는 항상 검정이다.(빨강 노드가 연달아 나타날 수 없다.)
- 임의의 노드로부터 리프 노드까지의 경로상에는 동일한 개수의 검정 노드가 존재한다.
- 이진 탐색 트리 성질
- 이진 탐색 트리 성질
📄탐색 연산
이진 탐색 트리의 탐색 방법과 동일하다. 키 값을 루트 노드 부터 비교를 시작해서 키 값이 루트 보다 작으면 왼쪽, 크면 오른쪽으로 경로를 따라 내려간다.
📄삽입 연산
탐색이 실패한 NULL 노드에 빨강 노드를 추가하고, 두 자식 노드를 NULL 노드로 만든다. 빨강 노드가 연달아 나타나면 루트 노드 쪽으로 올라가면서 노드의 구조와 색깔을 조정해서 레드-블랙 트리의 성질을 만족시켜야 한다.
- 빨강 노드가 연달아 나타나는 경우에 적용하는 규칙은 다음과 같다.
-
부모 노드의 형제 노드가 빨강인 경우 -> 부모 노드, 부모 노드의 형제노드, 부모 노드의 부모노드의 색깔을 모두 변경
-
부모 노드의 형제 노드가 검정이고, 현재 노드의 키 값이 부모 노드와 부모 노드의 부모 노드의 키 값의 사이인 경우 -> 현재 노드와 부모 노드를 회전시킴
-
부모 노드의 형제 노드가 검정이고 현재 노드의 키 값보다 부모 노드와 부모 노드의 부모 노드의 키 값이 큰(또는 작은) 경우 -> 부모 노드와 부모 노드의 부모 노드를 회전시키고 색깔을 변경
📄성능과 특징
균형 탐색 트리
- 어떤 두 리프 노드의 레벨 차이가 2배를 넘지 않는 균형 탐색 트리
- 성질3 -> 루트 노드에서 리프 노드의 경로상에는 빨강 노드의 개수 < 검정 노드의 개수
- 성질4 -> 루트 노드에서 리프 노드의 경로상에는 동일한 개수의 검정 노드가 존재
- 탐색, 삽입, 삭제 연산의 시간 복잡도: O(logn)
- 최악의 경우 트리의 높이 O(logn)
- 사실상 이진 탐색 트리
- 탐색 연산은 이진 탐색 트리와 같다.
- 삼입 연산은 회전과 색깔 변경과 같은 추가 연산이 필요하다.
- 2-3-4 트리를 이진 탐색 트리로 표현한 것이 레드-블랙 트리이다. 빨강 노드를 부모 노드와 묶어서 2-3-4 트리 하나의 노드로 표현할 수 있다.
📚B-트리
📄B-트리
B-트리는 균형 탐색 트리이면서 다음과 같은 성질을 가진다.
- 루트 노드는 1개 이상 2t개 미만의 오름차순으로 정렬된 키를 가진다.
- 루트 노드가 아닌 모든 노드는 (t-1)개 이상 2t개 미만의 오름차순으로 정렬된 키를 가짐
- 내부 노드는 자신이 가진 키의 개수보다 하나 더 많은 자식 노드를 가짐
- 각 노드의 한 키의 왼쪽 서브트리에 있는 모든 키 값은 그 키값보다 작음
- 각 노드의 한 키의 오른쪽 서브트리에 있는 모든 키 값은 그 키값보다 큼
- 모든 리프 노드의 레벨은 동일함
📄탐색 연산
이진 탐색 트리의 탐색 연산과 유사하게 루트 노드에서부터 탐색 키를 가진 원소를 찾아 나가는 방식이다.
📄삽입 연산
루트 노드에서부터 탐색을 수행하여 리프 노드에도 존재하지 않으면 해당 노드에 추가한다.
2-3-4 트리와 유사하게 노드 분할이 필요하다. B-트리에서의 노드 분할은 2-3-4 트리 노드 분할을 일반화 시킨 것으로 이해.
- 탐색 과정에서 (2t-1)개의 키를 갖는 노드를 만나면, 이 노드를 (t-1)개의 키를 갖는 2개의 노드와 1개의 키를 갖는 노드로 분할
- 삽입으로 인해 노드의 키의 개수가 2t개가 되는 것을 방지
📄성능과 특징
-
탐색, 삽입, 삭제 연산의 시간 복잡도: O(logn)
-
내부 탐색과 외부 탐색에 모두 활용 가능하다.
📚해시 테이블
📄해싱
키 값을 기반으로 데이터의 저장 위치를 직접 계산함으로써 상수 시간 내에 데이터를 저장, 삭제, 탐색할 수 있는 방법
-
해시 테이블: 각 위치마다 주소가 부여되어 있는 저장공간. 배열 형태.
-
슬롯: 해시 테이블에서 각각의 공간.
📄해시 함수
키 값을 해시 테이블의 주소로 변환하는 함수
제산 잔여법, 비닝, 중간 제곱법 등 여러 종류가 있다.
- 바람직한 해시 함수
- 계산이 용이해야 함
- 적은 충돌 발생 -> 각 키를 테이블의 각 슬롯에 균등하게 사상시킬 수 있어야 함
📄충돌
서로 다른 키 값들이 같은 해시 함수 값을 갖는 경우.
-
충돌 해결 방법
-
개방해싱(연쇄법): 충돌된 데이터를 테이블 밖의 별도의 장소에 저장/관리 -> 연결 리스트 사용
-
폐쇄해싱(개방 주소법): 해시 테이블 내의 다른 슬롯에 충돌된 데이터를 저장/관리 (버킷 해싱, 선형 탐사, 이차 탐사, 이중 해싱)
📄충돌 해결 방법
-
개방 해싱: 해시 테이블의 각 슬롯을 연결 리스트의 헤더로 사용. 해시 테이블과 연결 리스트가 주기억장치 내에 유지될때 적합.
-
폐쇄 해싱
-
버킷 해싱: 해시 테이블 슬롯을 버킷으로 묶어 버킷 단위로 해싱. 디스크에 저장된 해시 테이블 구현에 적합.
-
선형 탐사: p(K, i) = (h(K) + i) mod M. 홈 위치가 사용 중이면 빈 슬롯을 찾을 때까지 테이블의 다음 슬롯으로 순차적으로 이동. 가장 간단하지만 최악의 방법.
-
선형 탐사는 모든 슬롯이 새로운 데이터가 삽입될 후보가 된다. 긴 탐사 순서를 만들어 평균 탐색 시간의 증가를 초래한다.(1차 클러스터링 문제: 데이터들이 연속된 위치를 점유하여 클러스터를 형성하고 점점 커지는 현상)
-
이차 탐사: 충돌이 발생하는 횟수의 제곱 형태로 탐사 순서를 결정. 서로 다른 홈 위치를 갖는 두 키는 서로 다른 탐사 순서를 가진다.
-
이차 탐사는 모든 슬롯이 탐사 순서에 사용되지 않는 문제. 동일한 홈 위치를 갖는 두 키는 동일한 탐사 순서를 가지는 문제.(2차 클러스터링 문제: 특정 홈 위치에 대한 클러스터를 만드는 현상)
-
이중해싱: 1차, 2차 클러스터링 문제 해결. 서로 다른 두 키의 홈 위치가 동일해도 서로 다른 탐사 순서를 가진다.
-
📄삭제 연산
-
두 가지 고려 사항
-
데이터의 삭제가 차후의 탐색을 방해하지 말아야 한다.(단순히 빈 슬롯으로 두면 탐색이 해당 슬롯에서 종료되므로 그 이후의 데이터는 고립된다.)
-
삭제로 생긴 빈 슬롯은 나중에 삽입 과정에서 사용되어야 한다.
-
-
비석
삭제된 데이터의 위치에 비석이라는 특별한 표시를 하는 방법.
탐색: 탐색하는 동안 비석을 만나면 계속 탐색
삽입: 비석이 표시된 위치를 빈 위치로 간주 -> 새 데이터 삽입
비석의 개수가 증가 -> 평균 탐색 거리 증가
Leave a comment