第六周 筆記

侯老師語錄
六大部件


各類數(shù)據(jù)結構

1、stack 和 queue 都是在Deque基礎上實現(xiàn)的,屬于一種適配

2、set也是在map基礎上實現(xiàn)的,僅僅用到了map的key【java里 hashset與hashmap區(qū)別:hashset靠hashmap實現(xiàn),只有沒有用object,只用key】

3、【這里多提到一個線程安全的概念,java里線程安全的版本是在普通集合的基礎上,重新包裝每個方法,并加上“Synchronized”關鍵字實現(xiàn)的】

4、Unordered的 map和set版本基于hash表實現(xiàn)的【java里,bean對象重載hashCode和equals方法可以實現(xiàn)hash表的功能,oc同理】

5、hash表有兩種實現(xiàn)方法,侯老師講的是拉鏈式

1、拉鏈式:

????????將大小為M的數(shù)組的每一個元素指向一條鏈表,鏈表中的每一個節(jié)點都存儲一個哈希值為該索引的鍵,對采用拉鏈法的哈希實現(xiàn)的查找:首先是根據(jù)哈希值找到對應的鏈表【hashCode】,然后沿著鏈表順序找到相應的鍵【equals】。(使用鏈接法在最壞的情況下,也就是將所有的key映射到同一個槽中了,這樣哈希表就退化成一個鏈表,這樣的話,操作鏈表的時間復雜度則變成了O(n),這樣哈希表的性能優(yōu)勢就沒有了,所以選擇一個合適的哈希函數(shù)是最為關鍵的)

2、開放尋址

? ??使用開放尋址法是槽本身直接存放數(shù)據(jù),在插入數(shù)據(jù)時如果key所映射到的索引已經有數(shù)據(jù)了,這說明發(fā)生了沖突,這時會尋找下一個槽,如果該槽也被占用了則繼續(xù)尋找下一個槽,直到找到沒有被占用的槽,在查找時也使用同樣的策略來進行。

????由于開放尋址法處理沖突的時候占用的是其他槽的位置,這可能導致后續(xù)的key在插入的時候更加容易出現(xiàn)哈希沖突,所以采用開放尋址法的哈希表的裝載因子不能太高,否則容易出現(xiàn)性能下降。

????裝載因子是哈希表保存的元素數(shù)量和哈希表容量的比,通常采用鏈接法解決哈希沖突的哈希表的裝載因子最好不要大于1,而采用開放尋址法的哈希表最好不要大于0.5.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容