Datawhale程式設計 雜湊表

2022-08-03 03:42:13 字數 2672 閱讀 2550

雜湊表就是一種以 鍵-值(key-indexed) 儲存資料的結構,我們只要輸入待查詢的值即key,即可查詢到其對應的值。

雜湊的思路很簡單,如果所有的鍵都是整數,那麼就可以使用乙個簡單的無序陣列來實現:將鍵作為索引,值即為其對應的值,這樣就可以快速訪問任意鍵的值。這是對於簡單的鍵的情況,我們將其擴充套件到可以處理更加複雜的型別的鍵。

使用雜湊查詢有兩個步驟:

使用雜湊函式將被查詢的鍵轉換為陣列的索引。在理想的情況下,不同的鍵會被轉換為不同的索引值,但是在有些情況下我們需要處理多個鍵被雜湊到同乙個索引值的情況。所以雜湊查詢的第二個步驟就是處理衝突

處理雜湊碰撞衝突。有很多處理雜湊碰撞衝突的方法,如拉鍊法和線性探測法。

雜湊表是乙個在時間和空間上做出權衡的經典例子。如果沒有記憶體限制,那麼可以直接將鍵作為陣列的索引。那麼所有的查詢時間複雜度為o(1);如果沒有時間限制,那麼我們可以使用無序陣列並進行順序查詢,這樣只需要很少的記憶體。雜湊表使用了適度的時間和空間來在這兩個極端之間找到了平衡。只需要調整雜湊函式演算法即可在時間和空間上做出取捨。

這裡需注意,返回值為[index_a,index_b],內部都是序列值。這道題用暴力解法行不通,用首尾遞進的解法,時間複雜度為o(nlogn)。用雜湊表可以達到最佳效果。

這是個人用雜湊表解決

class solution:

def twosum(self, nums, target):

""":type nums: list[int]

:type target: int

:rtype: list[int]

"""dnums = {}

for i, n in enumerate(nums):

dnums[n] = i

for i, n in enumerate(nums):

m = target - n

if m in dnums.keys() and i != dnums[m]:

return [i, dnums[m]]

上面理論上的時間複雜度為o(2n),實際上和首尾遞進的解法差不多了。這裡,答案告訴我們存在o(n)的解法,如下:

這道題要求我們取number上的各位數字的平方並相加。從這個條件裡,可以很快反應到,19和91在本題裡是沒有差別的

然後,在自己額外造用例時發現,一些數字會產生自迴圈,如58-89-145-42-2-4-16-37-58,這種數字肯定不是hpnnum。

通過上面的規律探索,可以開始思考**流程。**的思路很簡單,一邊算一邊存,如果算出來的結果和之前重複,返回false;如果最終得到1,則返回true

這是我用雜湊表寫出來的

class solution:

""":type n: int

:rtype: bool

"""hashmap = {}

n_lst = [int(i) for i in str(n)]

while n_lst not in hashmap.values():

hashmap[index] = n_lst

n = sum([i**2 for i in n_lst])

n_lst = [int(i) for i in str(n)]

if n_lst == [1]:

return true

else:

return false

上面有很多值得優化的地方,不過最值得優化的重點不是這個,是用雜湊表明顯浪費了一半的記憶體空間。這道題可以用集合會更好。整體優化過的**如下:

class solution:

""":type n: int

:rtype: bool

"""collection = set()

while n not in collection:

collection.add(n)

n = sum(int(i)**2 for i in str(n))

if n == 1:

return true

else:

return false

Datawhale程式設計 佇列

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。建立順序佇列結構必須為其靜態分配或動態申請一片連續的儲存空間,並設定兩個指標進行管理。乙...

Datawhale 程式設計打卡 2

氣泡排序 def maopao paixu a l len a for i in range l 1 遍歷的是排好序的個數 for j in range l i 1 遍歷的是待排序的個數 if a j a j 1 temp a j a j a j 1 a j 1 temp print a retur...

雜湊表 雜湊表

一 定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式...