(轉自leetcode,https://leetcode-cn.com/leetbook/read/hash-table/xh8uld/)算法
哈希表的原理:數組
哈希表的關鍵思想是使用哈希函數將鍵映射到存儲桶。更確切地說,函數
1.當咱們插入一個新的鍵時,哈希函數將決定該鍵應該分配到哪一個桶中,並將該鍵存儲在相應的桶中;
2.當咱們想要搜索一個鍵時,哈希表將使用相同的哈希函數來查找對應的桶,並只在特定的桶中進行搜索。spa
咱們使用 y = x % 5 做爲哈希函數。讓咱們使用這個例子來完成插入和搜索策略:設計
1.插入:咱們經過哈希函數解析鍵,將它們映射到相應的桶中。
例如,1987 分配給桶 2,而 24 分配給桶 4。
2.搜索:咱們經過相同的哈希函數解析鍵,並僅在特定存儲桶中搜索。
若是咱們搜索 1987,咱們將使用相同的哈希函數將1987 映射到 2。所以咱們在桶 2 中搜索,咱們在那個桶中成功找到了 1987。
例如,若是咱們搜索 23,將映射 23 到 3,並在桶 3 中搜索。咱們發現 23 不在桶 3 中,這意味着 23 不在哈希表中。3d
哈希表的設計:code
1.哈希函數blog
哈希函數是哈希表中最重要的組件,該哈希表用於將鍵映射到特定的桶。在上一篇文章中的示例中,咱們使用 y = x % 5 做爲散列函數,其中 x 是鍵值,y 是分配的桶的索引。索引
散列函數將取決於鍵值的範圍
和桶的數量。
leetcode
下面是一些哈希函數的示例:
2.衝突解決
理想狀況下,若是咱們的哈希函數是完美的一對一映射,咱們將不須要處理衝突。不幸的是,在大多數狀況下,衝突幾乎是不可避免的。例如,在咱們以前的哈希函數(y = x % 5)中,1987 和 2 都分配給了桶 2,這是一個衝突。
衝突解決算法應該解決如下幾個問題:
如何組織在同一個桶中的值?
若是爲同一個桶分配了太多的值,該怎麼辦?
如何在特定的桶中搜索目標值?
根據咱們的哈希函數,這些問題與桶的容量和可能映射到同一個桶的鍵的數目有關。
讓咱們假設存儲最大鍵數的桶有 N 個鍵。
一般,若是 N 是常數且很小,咱們能夠簡單地使用一個數組將鍵存儲在同一個桶中。若是 N 是可變的或很大,咱們可能須要使用高度平衡的二叉樹來代替.。