高階程式設計師必備資料結構演算法之雜湊表

2021-10-11 01:40:38 字數 3246 閱讀 1409

雜湊表有稱為雜湊表,是一種空間換結構的資料結構。為每個資料加入鍵元素,通過鍵進行檢索。

雜湊表的組成:

鍵(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,都有指定的庫函式,導致我們對基礎演算...