Bảng băm là một cấu trúc dữ liệu được sử dụng để lưu trữ các cặp khóa-giá trị. Hàm băm được sử dụng bởi bảng băm để tính một chỉ mục vào một mảng trong đó một phần tử sẽ được chèn hoặc tìm kiếm. Thăm dò bậc hai là một kỹ thuật giải quyết xung đột trong các bảng băm bổ sung được mở. Nó hoạt động bằng cách lấy chỉ số băm ban đầu và thêm các giá trị liên tiếp của một đa thức bậc hai tùy ý cho đến khi tìm thấy một vị trí mở.
Đây là một chương trình C ++ để triển khai các bảng băm với phép dò bậc hai.
Thuật toán
Đối với tìm kiếm, một giá trị chính:
Begin Khai báo hàm SearchKey (int k, HashTable * ht) int pos =HashFunc (k, ht-> s) intialize collisions =0 while (ht-> t [pos] .info! =Emp and ht-> t [pos] .e! =k) pos =pos + 2 * ++ va chạm -1 if (pos> =ht-> s) pos =pos - ht-> s return posEnd.
Đối với Chèn:
Begin Khai báo hàm Insert (int k, HashTable * ht) int pos =SearchKey (k, ht) if (ht-> t [pos] .info! =Legi) ht-> t [pos] .info =Legi ht-> t [pos] .e =kEnd.
Đối với màn hình:
Begin Khai báo hiển thị hàm (HashTable * ht) for (int i =0; is; i ++) int value =ht-> t [i] .e if (! value) print "Vị trí:" in vị trí hiện tại In "Phần tử:Null" khác in "Vị trí:" in vị trí hiện tại In "Phần tử:" In phần tử.End.
Đối với chức năng Rehash:
Begin Khai báo hàm Rehash (HashTable * ht) int s =ht-> s HashTableEntry * t =ht-> t ht =InitiateTable (2 * s) for (int i =0; iMã mẫu
#include#include #define T_S 10using namespace std; enum EntryType {Legi, Emp, Del}; struct HashTableEntry {int e; thông tin enum EntryType; }; struct HashTable {int s; HashTableEntry * t; }; bool isPrime (int n) {if (n ==2 || n ==3) return true; if (n ==1 || n% 2 ==0) return false; for (int i =3; i * i <=n; i + =2) if (n% i ==0) return false; return true;} int nextPrime (int n) {if (n <=0) n ==3; if (n% 2 ==0) n ++; for (;! isPrime (n); n + =2); return n;} int HashFunc (int k, int s) {return k% s;} HashTable * InitiateTable (int s) {HashTable * ht; if (s s =nextPrime (s); ht-> t =new HashTableEntry [ht-> s]; if (ht-> t ==NULL) {cout <<"Kích thước bảng quá nhỏ" < s; i ++) {ht-> t [i] .info =Emp; ht-> t [i] .e =NULL; } return ht;} int SearchKey (int k, HashTable * ht) {int pos =HashFunc (k, ht-> s); va chạm int =0; while (ht-> t [pos] .info! =Emp &&ht-> t [pos] .e! =k) {pos =pos + 2 * ++ va chạm -1; if (pos> =ht-> s) pos =pos - ht-> s; } return pos;} void Insert (int k, HashTable * ht) {int pos =SearchKey (k, ht); if (ht-> t [pos] .info! =Legi) {ht-> t [pos] .info =Legi; ht-> t [pos] .e =k; }} HashTable * Rehash (HashTable * ht) {int s =ht-> s; HashTableEntry * t =ht-> t; ht =InitiateTable (2 * s); for (int i =0; i s; i ++) {int value =ht-> t [i] .e; if (! value) cout <<"Vị trí:" <> c; switch (c) {case 1:cout <<"Nhập kích thước của Bảng băm:"; cin>> s; ht =InitiateTable (s); cout <<"Kích thước của Bảng băm:" <ht-> s) {cout <<"Table is Full, Rehash the table" < > v; Chèn (v, ht); i ++; phá vỡ; case 3:display (ht); phá vỡ; trường hợp 4:ht =Rehash (ht); phá vỡ; case 5:exit (1); default:cout <<"\ nNhập đúng tùy chọn \ n"; }} trả về 0;} Đầu ra
1. Khởi tạo kích thước của bảng2. Chèn phần tử vào bảng3. Hiển thị bảng băm4.Rehash The Table5.ExitNhập kích thước của bạn:1 Kích thước bảng là quá nhỏ the table2.Insert phần tử vào bảng3.Hiển thị Hash Table4.Rehash The Table5.ExitNhập sự lựa chọn của bạn:1Nhập kích thước của bảng băm:10Kích thước bảng băm:111.Kích thước ban đầu của bảng2. chèn phần tử vào bảng3. hiển thị bảng băm4 .Rehash The Table5.ExitEnter sự lựa chọn của bạn:2Enter phần tử sẽ được chèn:11. Kích thước khởi tạo của bảng2.Insert phần tử vào bảng3.Display Hash Table4.Rehash The Table5. kích thước của bảng2. Chèn phần tử vào bảng3. Hiển thị bảng băm4. .ExitEnter sự lựa chọn của bạn:Phần tử 2Enter để được trong lỗi:41. Khởi tạo kích thước của bảng2. Chèn phần tử vào bảng3. Hiển thị bảng băm4. Table4.Rehash The Table5.ExitEnter sự lựa chọn của bạn:2Enter phần tử sẽ được chèn:61.Kích thước khởi tạo của table2.Insert phần tử vào bảng3.Display Hash Table4.Rehash The Table5.ExitEnter sự lựa chọn của bạn:2Enter phần tử sẽ được chèn:71. Kích thước khởi tạo của bảng 2. Chèn phần tử vào bảng3. Hiển thị bảng băm4. Table5.ExitEnter your choice:2Enter element to be insert:91. Khởi tạo kích thước của bảng2.Insert phần tử vào table3.Display Hash Table4.Rehash The Table5.ExitEnter your choice:2Enter element to be insert:101. Khởi tạo kích thước của table2.Insert phần tử vào table3.Display Hash Table4.Rehash The Table5.ExitNhập sự lựa chọn của bạn:2Nhập phần tử sẽ được chèn:111.Kích thước ban đầu của bảng2.Insert phần tử vào bảng3.Hiển thị Hash Table4.Rehash The Table5.ExitEnter sự lựa chọn của bạn:2Table là đầy đủ, Rehash bảng 1. Khởi tạo kích thước của bảng2. Chèn phần tử vào bảng3.Hiển thị Hash Table4.Rehash The Table5.Exit Nhập lựa chọn của bạn:3 Vị trí:1 Phần tử:11 Vị trí:2 Phần tử:1 Vị trí:3 Phần tử:2 Vị trí:4 Phần tử:3 Vị trí:5 Phần tử:4 Vị trí:6 Phần tử:5 Vị trí:7 Phần tử:6 Vị trí:8 Phần tử:7 Vị trí:9 Phần tử:8 Vị trí:10 Phần tử:9 Vị trí:11 Phần tử:101 Khởi tạo kích thước của bảng2 Chèn phần tử vào bảng3 Hiển thị bảng băm4 .Rehash The Table5.ExitEnter your choice:41 Khởi tạo kích thước của bảng2.Insert phần tử vào bảng3.Display Hash Table4.Rehash The Table5.ExitEnter your choice:3Position:1 Element:NullPosition:2 Element:1 Vị trí:3 Phần tử:2 Vị trí:4 Phần tử:3 Vị trí:5 Phần tử:4 Vị trí :6 Phần tử:5 Vị trí:7 Phần tử:6 Vị trí:8 Phần tử:7 Vị trí:9 Phần tử:8 Vị trí:10 Phần tử:9 Vị trí:11 Phần tử:10 Vị trí:12 Phần tử:11 Vị trí:13 Phần tử:Null Vị trí:14 Phần tử:Null Vị trí:15 Phần tử:Null :16 Phần tử:Null Vị trí:17 Phần tử:Null Vị trí:18 Phần tử:NullPosition:19 Phần tử:NullPosition:20 Phần tử:NullPosition:21 Phần tử:Null Vị trí:22 Phần tử:Null Vị trí:23 Phần tử:Null1. Khởi tạo kích thước của bảng2 Chèn phần tử vào the table3.Display Hash Table4.Rehash The Table5.ExitEnter your choice:2Enter element to be insert:201. Khởi tạo kích thước của table2.Insert phần tử vào table3.Display Hash Table4.Rehash The Table5.ExitEnter your choice:5