7、散列表
一、什麽是散列表?
問題:現在我們需要為一家超市建立一個結賬系統,我們應該考慮用哪一種數據結構?
思考:由於結賬系統多用於查詢,我們可以考慮使用數組。在數組中需要同時儲存商品名和對應的價格,我們可以再數組中內嵌子數組,把一個商品名和對應價格同時保存在一個子數組中,最後對所有數組排序。查詢是速度為O(log2n)。
反思:①數組無法儲存具有映射關系的數據;②超市中的商品成千上萬,即使查詢速度為對數速度,當記錄的項目多時查詢起來也非常耗時。
針對反思中的兩點,我們想:如果有一種數據結構,能夠儲存具有映射關系的數據,而且無論項目有多少,其查詢數據的速度都是1該有多好。散列表就是實現了這種功能的數據結構。它能夠儲存具有映射關系的數據,而且查詢速度永遠是1.
二、散列函數
在數組中,利用索引來查找數據這一操作是瞬間完成的事情。散列函數能夠把一個數據轉化成一個具體的數字,而這個數字就是儲存數據的數組中的索引,這樣我們就可以把數據保存在數組中索引的位置了。查找數據時只要用散列函數得出索引,查找的速度就永遠是1了。
所以,散列表是散列函數與數組相互配合工作的:散列函數轉化數據,數組儲存數據。
這樣看來,散列函數必須足夠強大,能夠把數據轉換成互不相同的數字。
三、散列表與數組、鏈表
散列表是我們在數組、鏈表之後學習的第一種有額外邏輯的數據結構:數組、鏈表都是把數據直接映射到內存裏,而散列表是使用散列函數確定數據的儲存位置。
散列表是一種會被我們廣泛引用的數據結構,一般一門語言中通常都提供了散列表的實現,在python中的散列表是字典。
四、散列表的應用
1、用於具有映射關系和快速查找的應用,如電話簿、商品價格列表、DNS解析表;
2、用於防止重復的應用,如投票系統。
五、沖突
沖突:給兩個鍵分配的相同的儲存位置;
原因:散列函數不夠完美,不能做到對不同數據生成不同的數字;
解決方法:在分配到相同的同一位置,用鏈表儲存數據。
7、散列表