이 섹션에서는 개방 주소 지정에 의한 해싱이 무엇인지 볼 것입니다. 개방형 주소 지정은 충돌 해결을 위한 또 다른 기술입니다. 연결과 달리 다른 데이터 구조에 요소를 삽입하지 않습니다. 해시 테이블 자체에 데이터를 삽입합니다. 해시 테이블의 크기는 키의 수보다 커야 합니다. 개방형 주소 지정 기술에는 세 가지 널리 사용되는 방법이 있습니다. 이러한 방법은 - 선형 프로빙 2차 프로빙 더블 해싱 이 기법에서는 다른 해시 기법과 마찬가지로 해시 함수를 사용합니다. 장소가 비어 있으면 해당 위치에 요소를 삽입합니다
이 섹션에서는 개방형 주소 지정 방식에서 선형 탐색 기술이 무엇인지 살펴보겠습니다. 일반적인 해시 함수 h(x)가 있습니다. U → {0, 1, . . ., m – 1}. 개방형 주소 지정 방식에서 실제 해시 함수 h(x)는 일반 해시 함수 h(x)에 다른 부분을 추가하여 하나의 선형 방정식을 만듭니다. h(𝑥) =𝑥 𝑚𝑜𝑑 𝑚 ℎ(𝑥, 𝑖) =(ℎ´(𝑥) + 𝑖)𝑚𝑜𝑑 𝑚 i|의 값 =0, 1, . . ., m – 1. 그래서 우리는 i =0에서 시작하여 하나의 여유 공간을 얻을 때까지 이것을 늘립니
이 섹션에서는 개방형 주소 지정 방식에서 2차 탐색 기술이 무엇인지 살펴보겠습니다. 일반적인 해시 함수 h(x)가 있습니다. U → {0, 1, . . ., m – 1}. 개방형 주소 지정 방식에서 실제 해시 함수 h(x)는 일반 해시 함수 h(x)에 다른 부분을 추가하여 하나의 이차 방정식을 만듭니다. h =(𝑥) =𝑥 𝑚𝑜𝑑 𝑚 ℎ(𝑥, 𝑖) =(ℎ´(𝑥) + 𝑖2 )𝑚𝑜𝑑 𝑚 일부 상수를 사용하여 다른 이차 방정식을 넣을 수도 있습니다. i의 값 =0, 1, . . ., m – 1. 그래서 우리
이 섹션에서는 개방형 주소 지정 방식에서 Double Hashing 기술이 무엇인지 살펴보겠습니다. 일반적인 해시 함수 h(x)가 있습니다. U → {0, 1, . . ., m – 1}. 개방형 주소 지정 방식에서 실제 해시 함수 h(x)는 공간이 비어 있지 않을 때 일반 해시 함수 h(x)를 취한 다음 삽입할 공간을 확보하기 위해 다른 해시 함수를 수행합니다. $$h_{1}(x)=x\:mod\:m$$ $$h_{2}(x)=x\:mod\:m^{\prime}$$ $$h(x,i)=(h^{1}(x)+ih^{2})\:mod\:m$$
이 섹션에서는 개방 주소 해싱과 관련된 Brent의 방법이 무엇인지 볼 것입니다. 이 방법은 휴리스틱입니다. 이것은 해시 테이블에서 성공적인 검색을 위한 평균 시간을 최소화하려고 시도합니다. 이 방법은 원래 이중 해싱 기술에 적용되었지만 선형 및 2차 프로빙과 같은 모든 개방형 주소 지정 기술에 사용할 수 있습니다. 요소 x의 나이는 공개 주소 지정 해시 테이블에 저장되며, x가 A[xi에 배치되도록 최소값 i입니다. ] Brent의 방법은 모든 요소의 총 수명을 최소화하려고 합니다. 요소 x를 삽입하면 몇 가지 단계를 따릅니다.
여기에서 균형 이진 검색 트리가 무엇인지 볼 수 있습니다. 이진 검색 트리(BST)는 왼쪽 자식에 더 작은 요소가 있고 오른쪽 자식에 더 큰 요소가 있는 이진 트리입니다. BST에서 요소를 검색하는 평균 시간 복잡도는 O(log n)입니다. 이진 탐색 트리의 높이에 따라 다릅니다. 이진 검색 트리의 속성을 유지하기 위해 트리가 왜곡되는 경우가 있습니다. 따라서 기울어진 나무는 다음과 같이 보일 것입니다 - 이것은 실제로는 트리지만 연결된 목록처럼 보입니다. 이러한 종류의 트리의 경우 검색 시간은 O(n)입니다. 바이너리 트리
이 섹션에서는 비대칭 해싱 기술이 무엇인지 살펴보겠습니다. 이 기술에서 해시 테이블은 d개의 블록으로 분할됩니다. 각 분할의 길이는 n/d입니다. 프로브 값 xi, 0 ≤ i ≤ d는 $$\lbrace\frac{i*n}{d},...,\frac{(i+1)*n}{d-1}에서 균일하게 추출됩니다. \r중괄호$$. 객관식 해싱과 마찬가지로 x를 삽입하기 위해 알고리즘은 목록 A[x0의 길이를 확인합니다. ], A[x1 ], . . ., A[xd – 1 ]. 그런 다음 이러한 목록 중 가장 짧은 항목에 x를 추가합니다. 동점인 경우 인덱스가
이 섹션에서는 LCFS 해싱이 무엇인지 볼 것입니다. 이것은 충돌 해결 전략을 변경하는 개방형 주소 지정 전략 중 하나입니다. 개방형 주소 체계에서 해싱 알고리즘을 확인하면 두 요소가 충돌하면 우선 순위가 더 높은 요소가 테이블에 삽입되고 후속 요소가 계속 이동해야 함을 알 수 있습니다. 따라서 개방형 주소 지정 방식의 해싱이 FCFS 기준임을 알 수 있습니다. LCFS(Last Come First Serve) 방식으로. 작업은 정확히 반대 방식으로 수행됩니다. 하나의 요소를 삽입하면 x0 위치에 배치됩니다. . 장소가 이미 요소
그래프가 하나의 비선형 데이터 구조라는 것을 알고 있습니다. 이 데이터 구조에서 우리는 일부 값을 노드에 입력하고 노드는 다른 가장자리를 통해 연결됩니다. 데이터를 그래프 구조에 저장할 수 있으므로 그래프에서 요소를 검색하여 사용할 수도 있습니다. 그래프 검색에는 두 가지 방법이 있습니다. 너비 우선 탐색과 깊이 우선 탐색 기법. 너비 우선 검색(BFS) BFS(Breadth First Search) 탐색은 주어진 그래프의 모든 노드를 방문하는 데 사용되는 알고리즘입니다. 이 탐색 알고리즘에서는 하나의 노드를 선택한 다음 모든
그래프에 대한 깊이 우선 검색은 유사합니다. 그러나 Digraphs 또는 방향 그래프의 경우 몇 가지 유형의 간선을 찾을 수 있습니다. DFS 알고리즘은 DFS 트리라는 트리를 형성합니다. −라고 하는 네 가지 유형의 모서리가 있습니다. 트리 에지(T) - DFS 트리에 존재하는 가장자리 포워드 에지(F) − 트리 에지 세트와 평행합니다. (작은 DFS 번호에서 큰 DFS 번호로, 큰 DFS 완료 번호에서 작은 DFS 완료 번호로) 백워드 에지(B) − 큰 DFS 번호에서 작은 DFS 번호로, 작은 DFS 완료 번호
이 섹션에서는 오일러 및 해밀턴 그래프를 볼 것입니다. 그러나 그 내용에 대해 알아보기 전에 먼저 그래프에서 트레일이 무엇인지 확인해야 합니다. 아래와 같은 그래프가 있다고 가정해 보겠습니다. - 트레일은 모든 꼭짓점(v1, v2, … , vk)이 구별되지 않을 수 있는 가장자리(v1, v2), (v2, v3), … , 그러나 모든 가장자리는 구별됩니다. 이 예에서 하나의 흔적은 {(B, A), (A, C), (C, D), (D, A), (A, F)}입니다. 이것은 흔적입니다. 그러나 이것은 정점 A를 두 번 방문하므로 단순한
이항 힙은 이항 트리의 모음입니다. 이항 트리 Bk는 재귀적으로 정의된 순서 트리입니다. 이항 트리 B0은 단일 노드로 구성됩니다. 이항 트리 Bk는 두 개의 이항 트리 Bk-1로 구성됩니다. 서로 연결되어 있는 것입니다. 하나의 루트는 다른 루트의 가장 왼쪽 자식입니다. 일부 이항 힙은 다음과 같습니다. - 이항 트리의 일부 속성은 다음과 같습니다. - Bk가 있는 이항 트리 2k가 있습니다. 노드. 나무의 높이는 k입니다. 범위 0에서 k까지의 모든 i에 대해 깊이 i에 정확히 $$\left(\beg
이항 힙과 마찬가지로 피보나치 힙은 트리 모음입니다. 느슨하게 이항 힙을 기반으로 합니다. 이항 힙이 있는 트리와 달리 피보나치 힙 내의 정렬된 트리는 루트가 있지만 정렬되지 않습니다. 피보나치 힙의 각 노드 x에는 부모에 대한 포인터 p[x]와 자식 중 하나에 대한 포인터 자식[x]가 포함되어 있습니다. x의 자식은 x의 자식 목록으로 알려진 순환 이중 연결 목록에서 함께 연결됩니다. 자식 목록의 각 자식 y에는 각각 y의 왼쪽 및 오른쪽 형제를 가리키는 왼쪽[y] 및 오른쪽[y] 포인터가 있습니다. 노드 y가 유일한 자식이면
여기서 바이너리 최대 힙 데이터 구조에서 및 요소를 삽입하는 방법을 볼 것입니다. 초기 트리가 아래와 같다고 가정 - 삽입 알고리즘 insert(heap, n, item) − Begin if heap is full, then exit else n := n + 1 for i := n, i > 1, set i := i / 2 in each iteration, do &nbs
여기서 바이너리 최대 힙 데이터 구조에서 요소를 삭제하는 방법을 볼 것입니다. 초기 트리가 아래와 같다고 가정 - 삭제 알고리즘 delete(heap, n) − Begin if heap is empty, then exit else item := heap[1] last := heap[n] n := n – 1 for
여기서 정수 키가 있는 해시 테이블에 대해 설명합니다. 여기서 키 값 𝑥은 𝑈 ={0, 1, … , 𝑢 – 2, 𝑢 – 1}과 같은 우주 𝑈에서 가져옵니다. 해시 함수는 ℎ입니다. 이 해시 함수의 도메인은 𝑈입니다. 범위는 {0, 1, … , 𝑚 – 1} 및 𝑚 ≤ 𝑢 세트에 있습니다. 해시 함수 h는 모든 𝑥 ∈ 𝑆에 대해 ℎ(𝑥)가 고유한 경우 집합 𝑆 ⊆ 𝑈에 대한 완벽한 해시 함수라고 합니다. 𝑚 =|𝑆|인 경우 𝑆에 대한 완벽한 해시 함수 ℎ는 최소입니다. 따라서 ℎ는 S와 {0, 1, … ,
여기서 나누기를 사용한 해싱에 대해 설명합니다. 이를 위해 해시 함수 −를 사용합니다. ℎ(𝑥) = 𝑥 𝑚𝑜𝑑 𝑚 이 해시 함수를 사용하기 위해 배열 A[0, … m – 1]을 유지합니다. 배열의 각 요소는 연결 목록의 헤드에 대한 포인터입니다. 연결 리스트 Li는 배열 요소 A[i]를 가리키며 h(x) =i가 되도록 모든 요소 x를 보유합니다. 이 기술은 연결에 의한 해싱으로 알려져 있습니다. 이러한 해시 테이블에서 요소 x를 늘리려면 O(1) 시간이 걸립니다. 인덱스 i =h(x)를 계산합니다. 그런 다음 목록 L
여기에서는 곱셈 방법을 사용한 해싱에 대해 설명합니다. 이를 위해 해시 함수 −를 사용합니다. ℎ(𝑥) = ⌊𝑚𝑥𝐴⌋ 𝑚𝑜𝑑 𝑚 여기서 A는 실수 상수입니다. 이 방법의 장점은 m 값이 그렇게 중요하지 않다는 것입니다. m을 2의 거듭제곱으로 취할 수도 있습니다. A의 값은 해시 함수를 제공하지만 A의 일부 값은 다른 값보다 낫습니다. Knuth에 따르면 A에 대한 황금 비율을 사용할 수 있으므로 A는 다음과 같습니다. $$A=\frac{\sqrt5-1}{2}=0.61803398$$ 물
때로는 동적 메모리 할당을 사용하여 배열을 생성합니다. 동적 메모리 할당 기술을 사용하여 배열을 할당하는 경우 몇 가지 작업을 수행하여 배열 크기를 두 배로 늘릴 수 있습니다. 초기 배열 크기가 5라고 가정합니다. 배열 0 1 2 3 4 요소 1 요소 2 요소 3 요소 4 요소 5 배열을 두 배로 늘리면 크기는 -입니다. 0 1 2 3 4 5 6 7 8 9 요소 1 요소 2 요소 3 요소 4 요소 5 요소 6 요소 7 요소 8
알다시피 배열은 정의상 동질적입니다. 따라서 같은 유형의 데이터를 배열에 넣어야 합니다. 그러나 다른 유형의 데이터를 저장하려는 경우 트릭은 무엇입니까? 오래된 언어와 같은 C에서는 공용체를 사용하여 다른 유형을 하나의 유형으로 인위적으로 합칠 수 있습니다. 그런 다음 이 새로운 유형에 대한 배열을 정의할 수 있습니다. 여기서 배열 요소가 실제로 포함하는 객체의 종류는 태그에 의해 결정됩니다. 다음과 같은 구조를 봅시다 - struct Vehicle{ int id; union { &nb