Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 Open Addressing Linear Probing을 사용하여 자체 해시 테이블 구현

<시간/>

해시 테이블은 키-값 쌍을 저장하는 데 사용되는 데이터 구조입니다. 해시 함수는 해시 테이블에서 요소를 삽입하거나 검색할 배열의 인덱스를 계산하는 데 사용됩니다.

선형 프로빙은 Open Addressed Hash 테이블의 충돌 해결 기술입니다. 이 방법에서 해시 테이블의 각 셀은 단일 키-값 쌍을 저장합니다. 이미 다른 키가 점유하고 있는 해시 테이블의 셀에 새 키를 매핑하여 충돌이 발생한 경우. 이 메서드는 다음과 같은 가장 가까운 빈 위치에 대해 테이블을 검색하고 거기에 새 키를 삽입합니다.

Linear Probing으로 해시 테이블을 구현하는 C++ 프로그램입니다.

알고리즘

Begin Declare function Insert(int k, int v) 정수 포인터에 hash_val, init, delindex를 선언합니다. hash_val =HashFunc(k) 초기화 init =-1 초기화 delindex =-1 동안 (hash_val !=init 및 (ht[hash_val] ==DelNode::getNode() 또는 ht[hash_val] !=NULL 및 ht[hash_val] 초기화) ->k !=k)) if (init ==-1) init =hash_val if (ht[hash_val] ==DelNode::getNode()) delindex =hash_val hash_val =HashFunc(hash_val + 1) if (ht[hash_val ] ==NULL 또는 hash_val ==초기화) if(delindex !=-1) ht[delindex] =new HashTable(k, v) else ht[hash_val] =new HashTable(k, v) if(init !=hash_val) if (ht[hash_val] !=DelNode::getNode()) if (ht[hash_val] !=NULL) if (ht[hash_val]->k==k) ht[hash_val]->v =v else ht[ hash_val] =새로운 HashTable(k, v)End.

키 값 검색:

시작 함수 선언 SearchKey(int k) 정수 데이터 유형의 초기화인 hash_val을 선언합니다. hash_val =HashFunc(k) 초기화 init =-1 동안 (hash_val !=init 및 (ht[hash_val] ==DelNode::getNode() 또는 ht[hash_val] !=NULL 및 ht[hash_val]->k!=) k if (init ==-1) init =hash_val hash_val =HashFunc(hash_val + 1) if (ht[hash_val] ==NULL 또는 hash_val ==init) return -1 else return ht[hash_val]->vEnd. 

삭제:

Begin Declare Function Remove(int k) 정수 데이터 유형의 초기화인 hash_val을 선언합니다. hash_val 초기화 =HashFunc(k) 초기화 초기화 =-1 동안 (hash_val !=초기화 및 (ht[hash_val] ==DelNode::getNode() 또는 ht[hash_val] !=NULL 및 ht[hash_val]->k!=k)) if (init ==-1) init =hash_val hash_val =HashFunc(hash_val + 1) if (hash_val !=init 및 ht[hash_val] !=NULL) ht[hash_val] ht[hash_val] =DelNode::getNode() 종료.

예시 코드

#include #include #include 네임스페이스 사용 std;const int T_S =5;class HashTable { public:int k; 정수 v; HashTable(int k, int v) { this->k =k; 이것->v =v; }}; 클래스 DelNode:공개 HashTable { 비공개:정적 DelNode *en; DelNode():HashTable(-1, -1) {} 공개:정적 DelNode *getNode() { if (en ==NULL) en =new DelNode(); 리턴 엔; }};DelNode *DelNode::en =NULL;class HashMapTable { 개인:HashTable **ht; 공개:HashMapTable() { ht =새로운 HashTable* [T_S]; for (int i =0; i k !=k)) { if (초기 ==-1 ) 초기화 =해시_발; if (ht[hash_val] ==DelNode::getNode()) delindex =hash_val; 해시_발 =HashFunc(해시_발 + 1); } if (ht[hash_val] ==NULL || hash_val ==초기화) { if(delindex !=-1) ht[delindex] =new HashTable(k, v); 그렇지 않으면 ht[hash_val] =새로운 HashTable(k, v); } if(초기화 !=hash_val) { if (ht[hash_val] !=DelNode::getNode()) { if (ht[hash_val] !=NULL) { if (ht[hash_val]->k==k) ht [해시_발]->v =v; } } 그렇지 않으면 ht[hash_val] =새로운 HashTable(k, v); } } int 검색 키(int k) { int hash_val =HashFunc(k); 정수 초기화 =-1; while (hash_val !=초기화 &&(ht[hash_val] ==DelNode::getNode() || ht[hash_val] !=NULL &&ht[hash_val]->k!=k)) { if (초기 ==-1 ) 초기화 =해시_발; 해시_발 =HashFunc(해시_발 + 1); } if (ht[hash_val] ==NULL || hash_val ==초기화) return -1; 그렇지 않으면 ht[hash_val]->v를 반환합니다. } 무효 제거(int k) { int hash_val =HashFunc(k); 정수 초기화 =-1; while (hash_val !=초기화 &&(ht[hash_val] ==DelNode::getNode() || ht[hash_val] !=NULL &&ht[hash_val]->k!=k)) { if (초기 ==-1 ) 초기화 =해시_발; 해시_발 =HashFunc(해시_발 + 1); } if (hash_val !=초기화 &&ht[hash_val] !=NULL) { ht[hash_val] 삭제; ht[hash_val] =DelNode::getNode(); } } ~HashMapTable() { 삭제[] ht; }};int main() { HashMapTable 해시; 정수 k, v; 정수 c; while(1) { cout<<"1.테이블에 요소 삽입"<>c; switch(c) { case 1:cout<<"삽입할 요소를 입력하세요:"; 신>>v; cout<<"삽입할 요소를 입력하십시오:"; cin>>k; 해시.삽입(k, v); 부서지다; case 2:cout<<"검색할 요소의 키를 입력하세요:"; cin>>k; if(hash.SearchKey(k) ==-1) { cout<<"키에 요소가 없습니다. "<>k; 해시.제거(k); 부서지다; 사례 4:exit(1); 기본값:cout<<"\n올바른 옵션을 입력하세요\n"; } } 반환 0;}

출력

1.테이블에 요소 삽입2.키에서 요소 검색3.키에서 요소 삭제4.종료 선택:1삽입할 요소 입력:10삽입할 요소 키 입력:21.테이블에 요소 삽입2. 키에서 요소 검색3.키에서 요소 삭제4.Exit선택 사항을 입력하십시오:1삽입할 요소를 입력하십시오:7삽입할 요소에서 키를 입력하십시오:61.테이블에 요소를 삽입하십시오2.키에서 요소를 검색하십시오3.키에서 요소를 삭제하십시오4 .Exit선택 항목을 입력하십시오:1삽입할 요소를 입력하십시오:4삽입할 요소에 키를 입력하십시오. 12요소를 삽입할 위치에 키 입력:31.테이블에 요소 삽입2.키에서 요소 검색3.키에서 요소 삭제4.종료선택 사항을 입력하십시오. 키의 요소4.ExitEnter 선택:1Enter 삽입할 요소:15삽입할 요소의 키 입력:81.테이블에 요소 삽입2.키에서 요소 검색3.키에서 요소 삭제4.종료 선택 항목을 입력:2검색할 요소의 키를 입력:6요소 키 6:71.테이블에 요소를 삽입2.키에서 요소를 검색합니다.3.키에서 요소를 삭제합니다.4.Exit선택 사항을 입력합니다. 3삭제할 요소의 키를 입력합니다. 21.테이블에 요소를 삽입합니다. 키에 있는 요소4.Exit선택 사항을 입력하십시오:2검색할 요소의 키를 입력하십시오:2키에 요소가 없습니다. 사전>