Day 8,雜湊表的原理及字典簡單實現

2021-10-04 18:29:51 字數 1868 閱讀 4346

構建乙個確定的對映,它能把關鍵字對映到乙個唯一的儲存位置,此處的對映就叫做雜湊函式,通過這種對映得到的表就叫做雜湊表。

那麼hash表有什麼優勢呢,相比於陣列有什麼優勢呢?

舉個例子:

假設此時有 a = 這樣乙個陣列,我們要找出其中的3是在第幾個位置此時該怎麼做?

我們需要通過遍歷整個a陣列,找到值等於3的索引。

如果我們使用hash表進行儲存該資料:此時我們假設對映函式時y=k%11(暫時不用去理會這個函式是怎麼產生的),我們把a陣列的值帶入可以得到 y = ,此時可以構造乙個表叫做hash,那麼hash[2] = 2

hash[3] = 3

hash[5] = 5

hash[7] = 7

hash[4] = 4

hash[9] = 9

hash[0] = 11

現在,同樣我們要找出值等於3的值,只需要通過y=k%11把k=3帶入,就可以得到 hash[3] = 3,時間複雜度是o(1) ,這就是hash表的妙用,可以構造出乙個key_value的關係,通過key快速找到value

如果此時 a = 那麼2,13這兩個值通過上述函式得到的都是2,此時該怎麼辦?

①更改對映方式,比如y=k%13

②定義乙個新規則,當空間被佔據(hash索引已經被使用),找到下乙個最近沒被使用的hash空間,將這個值賦值給這個空間

……總而言之,更改對映方式

#include

#include

using

namespace std;

struct key_value};

class

batch

int current_batchsize;

public

: key_value k_v[50]

;};class

direction

int&

operator

(int i)

;//對過載

int&

operator=(

int value)

;//對=過載

batch* batch[10]

;int currentkey;

public

:void

init()

;int

hash

(int);

};void direction::

init()

}int

& direction::

operator

(int key)}}

int& direction::

operator=(

int value)}}

int direction::

hash

(int input)

intmain()

; direction direction;

for(

int i=

0;i<

sizeof

(a)/

sizeof

(*a)

;i++

) direction[a[i]

]=a[i]

; cout<

("pause");

return0;

}

上述方法還存在問題,但是基本是按照hash的思想實現了字典。

如果方法有誤,或者其他好方法,歡迎私聊 謝謝! ^ v ^

DAY8 字典與集合

no.6 字典與集合 一 字典 對映型別 1 語法 dict e.g.dict1 print 李寧的口號是 dict1 李寧 李寧的口號是 一切皆有可能 e.g.dict2 dict 高爾基 海燕啊海燕 戴望舒 丁香一樣的結著愁怨的姑娘 dict2 若要給字典新增一對鍵 key 與值 value 則...

day8 字串作業

輸入乙個字串,列印所有奇數字上的字元 下標是1,3,5,7 位上的字元 例如 輸入 abcd1234 輸出 bd24 str1 abcd1234 list1 y for x,y in enumerate str1 if x 2 0 print join list1 輸入使用者名稱,判斷使用者名稱是否...

day8 字串作業

輸入乙個字串,列印所有奇數字上的字元 下標是1,3,5,7 位上的字元 例如 輸入 abcd1234 輸出 bd24 str1 abcd1234 str2 for a in range len str1 if a 1 str2 str1 a print str2 輸入使用者名稱,判斷使用者名稱是否合...