iOS 字典實現原理


在目前的開發中,NSDictionary是經常被使用,不過很少人會研究字典NSDictionary底層的實現,下面我們來一起看一下NSDictionary的實現原理。

 

一、字典原理

字典通過使用- (void)setObject:(id)anObject forKey:(id)aKey;方法,用Hash表來實現key和value之間映射和存儲的。

 

二、哈希原理

哈希概念:哈希表本質是一個數組,每一個元素稱為一個箱子,而箱子里面的存放的是鍵值對。

 

哈希表(Hash Table)也叫做散列表,這是根據關鍵碼(key vlaue)而直接進行訪問的數據結構。換句話說,通過把關鍵碼映射到表里面的一個位置來訪問記錄,用來加快查找的速度。映射的函數就叫做散列函數,存放記錄的數組也叫做散列表。

 

給定表M(稱為哈希表),存在函數f(key)(函數稱為哈希函數),給定任意的key值,然后代入函數之后能得到包含改關鍵字的記錄在表中的具體位置。

 

三、哈希存儲過程

3.1 首先根據key計算出它的哈希值h

3.2 如果箱子的個數為n,那么key值是應該放在第(h%n)個箱子中

3.3 如果該箱子已經有了值,就使用開放尋址法或者拉鏈法進行解決沖突。

如果我們在使用拉鏈法解決哈希沖突時候,每個箱子都是一個鏈表,屬於同一個箱子的所有鍵值都會排列在鏈表中。

 

》〉》拓展

哈希表有一個比較重要的屬性:負載因子(load factor):是用來衡量哈希表的空/滿程度,公式如下:

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

如果負載因子越大,意味着哈希表越滿,也就越容易導致沖突,性能也就是越低。在日常開發中,當負載因子大於某個常數(1或者0.75)時,哈希表就會自動擴展。

 

哈希表的擴容雖然可以解決部分問題,但並不總是有效的解決負載因子過大的問題。假如所有的哈希值都一樣,即使擴容之后,位置也不會發生改變,雖然負載因子降低,但不能提高哈希表的查找性能。

 

綜上:發現哈希表有兩個問題:

1.如果哈希表中箱子鍵值本來就很多,僅僅擴容移動數據,性能影響較大。

2. 如果哈希函數設計不是很合理,那么在極端的情況下會變成線性表,性能非常低

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM