iOS NSDictionary 字典 實現原理

2021-08-23 12:03:12 字數 1087 閱讀 9954

1.nsdictionary(字典)是使用 hash表來實現key和value之間的對映和儲存的, hash函式設計的好壞影響著資料的查詢訪問效率。

- (void)setobject:(id)anobject forkey:(id )akey;

2.objective-c 中的字典 nsdictionary 底層其實是乙個雜湊表,實際上絕大多數語言中字典都通過雜湊表實現,

二、雜湊的原理

雜湊概念:雜湊表的本質是乙個陣列,陣列中每乙個元素稱為乙個箱子(bin),箱子中存放的是鍵值對。

三、雜湊表的儲存過程:

1. 根據 key 計算出它的雜湊值 h。

2. 假設箱子的個數為 n,那麼這個鍵值對應該放在第 (h % n) 個箱子中。

3. 如果該箱子中已經有了鍵值對,就使用開放定址法或者拉鍊法解決衝突。

在使用拉鍊法解決雜湊衝突時,每個箱子其實是乙個鍊錶,屬於同乙個箱子的所有鍵值對都會排列在鍊錶中。

雜湊表還有乙個重要的屬性: 負載因子(load factor),它用來衡量雜湊表的 空/滿 程度,一定程度上也可以體現查詢的效率,計算公式為:

負載因子 = 總鍵值對數 / 箱子個數

負載因子越大,意味著雜湊表越滿,越容易導致衝突,效能也就越低。因此,一般來說,當負載因子大於某個常數(可能是 1,或者 0.75 等)時,雜湊表將自動擴容。

重雜湊概念:    

雜湊表在自動擴容時,一般會建立兩倍於原來個數的箱子,因此即使 key 的雜湊值不變,對箱子個數取餘的結果也會發生改變,因此所有鍵值對的存放位置都有可能發生改變,這個過程也稱為重雜湊(rehash)。

雜湊表的擴容並不總是能夠有效解決負載因子過大的問題。假設所有 key 的雜湊值都一樣,那麼即使擴容以後他們的位置也不會變化。雖然負載因子會降低,但實際儲存在每個箱子中的鍊錶長度並不發生改變,因此也就不能提高雜湊表的查詢效能。

四、總結,細心的讀者可能會發現雜湊表的兩個問題:

1. 如果雜湊表中本來箱子就比較多,擴容時需要重新雜湊並移動資料,效能影響較大。

2. 如果雜湊函式設計不合理,雜湊表在極端情況下會變成線性表,效能極低。

145 Python字典(dict)底層實現原理

字典也被稱為關聯陣列,還稱為雜湊陣列等。也就是說,字典也是乙個陣列,但陣列的索引是鍵經過雜湊函式處理後得到的雜湊值。雜湊函式的目的是使鍵均勻地分布在陣列中,並且可以在記憶體中以o 1 的時間複雜度進行定址,從而實現快速查詢和修改。雜湊表中雜湊函式的設計困難在於將資料均勻分布在雜湊表中,從而儘量減少雜...

python 原組 字典 集合

day10.元組.字典.集合 1 回顧 程序池程序間的通訊 2.列表 list 定義 list簡單來說就是兩個中括號 包起來的有序集合,裡面的元素可以使任意型別 a 1 2 b 3 4 方法 a.insert 0,100 100,1 2 1,2,3,4 a.extend b 1 2,3 4 del ...

ConcurrentHashMap實現原理

concurrenthashmap實現原理 在jdk1.7中 concurrenthashmap是通過segment陣列 hashentry陣列 單鏈表的結構進行儲存資料。segment陣列中存放的是hashentry陣列的首位址,hashentry中存放的是乙個單鏈表 首節點位址 put 我們通過...