雜湊表有稱為雜湊表,是一種空間換結構的資料結構。為每個資料加入鍵元素,通過鍵進行檢索。
雜湊表的組成:
鍵(key):是自己新增的用於檢索的資料,一般為整型,也可以為其他型別;
值(value):用於儲存資料的地方;
索引:陣列的下標;
雜湊桶:連線在雜湊表陣列上的陣列或鍊錶;
雜湊函式:將鍵值對映到索引上(陣列下標),一般採用求餘法;
如圖:
過程:建立結構體,把資料加上鍵,鍵通過對求餘,判斷和哪個陣列下標一致,就鏈結到哪個下標,這個過程稱為對映。通過對映,當我們要尋找這個資料時,提供鍵值,一求餘,就可以求出在哪個雜湊桶,然後挨個檢索,就可以迅速找到。(當雜湊通的數量越多,檢索的速度越快)。
注雜湊桶的實現也可以用順序表。
#include
#include
#include
using
namespace std;
#define max_size 16
typedef
char
* type;
typedef
struct _hashnodehashnode;
typedef hashnode* hashlist;
typedef
struct _hashtable hashtable;
static
int debug =0;
//求出每個節點對應的 位置
inthash
(int key,
int max_size)
//初始化雜湊表
bool
inithash
(hashtable *hash_t,
int max_size)
hash_t-
>hash_size = max_size;
if(max_size <=0)
hash_t-
>hlist =
new hashnode[hash_t-
>hash_size];if
(hash_t-
>hlist ==
null
)for
(int i =
0; i < hash_t-
>hash_size; i++
)return
true;}
//在雜湊表中查詢指定鍵是否存在
hashnode*
find
(hashtable *hash_t,
int key)
if(key <0)
e =hash
(key, hash_t-
>hash_size);if
(hash_t-
>hlist[e]
.next ==
null
)else
doif
(hn-
>next ==
null
) hn = hn-
>next;
}while(1
);return
null;}
//向指定雜湊表中插入資料
bool
insert
(hashtable *hash_t,
int key,
void
*elem)
if(key <0)
if(find
(hash_t, key)
) hashnode* hn =
newhashnode()
; hn-
>data =
(const type)elem;
hn->key = key;
e =hash
(key, hash_t-
>hash_size);if
(debug)
if(hash_t-
>hlist[e]
.next==
null
)return
true;}
hn->next = hash_t-
>hlist[e]
.next;
hash_t-
>hlist[e]
.next = hn;
return
true;}
//刪除雜湊表根據鍵指定的元素
bool
deleteelems
(hashtable *hash_t,
int key)
if(key <0)
if(find
(hash_t, key)
)while(1
)else
} hh = hn;
hn = hn-
>next;
}return
false;}
else
}//刪除雜湊表
bool
deletehash
(hashtable *hash_t)
for(
int i =
0; i < hash_t-
>hash_size; i++
) hn = hn-
>next;
delete hh;
}while(1
);}delete hash_t;
return
true;}
void
*getdata
(hashnode* e)
return e-
>data;
}int
main()
;insert
(&hash_,3,
(void
*)arry[0]
);insert
(&hash_,4,
(void
*)arry[1]
);insert
(&hash_,5,
(void
*)arry[2]
);deleteelems
(&hash_,3)
; hashnode* e;
for(
int i =
0; i <
6; i++)}
if(e)
else
}system
("pause");
}
Java程式設計師必備 資料結構與演算法之快速排序(一)
關於快速排序演算法這個問題,也可以等價於乙個對分治演算法實現的典型例子,首先通過乙個基準數將一串未排序序列分成左右兩個序列s1和s2,其中s1的元素都比基準數小,s2的元素都比基準數大,然後再對左右兩個序列分別再次進行快速排序,對於s1 s2的基準數可以隨便尋找,並不一定每一次都把最低位設定為基準數...
Java程式設計師必備 資料結構與演算法之快速排序(二)
public void change object r,int low,int high r low temp return low public void quicksort object r,int low,int high 快速排序演算法的執行時間依賴於劃分是否平衡,根據基準數元素將序列劃分為...
PHP 程式設計師學資料結構與演算法之《棧》
介紹 要成高手,必練此功 要成為優秀的程式設計師,資料結構和演算法是必修的內容。而現在的web程式設計師使用傳統演算法和資料結構都比較少,因為很多演算法都是包裝好的,不用我們去操心具體的實現細節,如php的取棧操作array pop,進棧操作array push,都有指定的庫函式,導致我們對基礎演算...