線性表:
數據排成一條線一樣的機構,每個線性表上的數據最多只有前后兩個方向,
包括 數組,鏈表,隊列,棧。
非線性表 :
數據之間並不是簡單的前后關系,有二叉樹、圖等。
散列表(基於 數組支持按照下標訪問數據的特性,是數組的一種擴展)
通過散列函數把元素的鍵值 映射為 下標,然后將數據存儲在數組中對應下標的位置。
當按照鍵值查詢元素時時,用同樣的散列函數,將鍵值轉化數組下表,從對應的數組下表的位置取數據。
散列表源於數組,他借助散列函數對數組這種數據結構進行擴展,利用的是數組支持 按照下標
隨機訪問元素的特性,散列表的兩個核心問題是 散列函數設計和散列函數沖突
散列表僅支持 添加 、查、 刪 不支持修改。
散列函數 可以定義為 hash(key),key表示元素的鍵值,hash(key)的值表示經過散列函數計算得到散列值。
解決散列沖突的方法
1 開放尋址法
如果出現了散列沖突(就是經過計算完放入的table 有值的情況)就從這個table 往后 找到空位置,插入。
探測新的位置的方法有 線性探測、二次探測、雙重探測。
線性探測:存儲位置被占用,從當前位置向后查找,有空位置就插入。
缺點 :如果數據越來越多,耗費的時間就越來越多
二次探測:探測的步長變成了原來的"二次方"
雙重探測:用一組散列函數,如果第一個散列函數計算的位置被占了,就用第二個散列函數計算。
2 鏈表法
散列表中,每個桶或槽 會對應一條鏈條,所有散列值相同的 元素 我們都放到相同槽位對應的鏈表中
插入的時候只需要通過計算散列函數計算出對應的散列槽位,將其插入到對應鏈表中即可。
當查找、刪除一個元素時,同樣通過散列函數計算出對應的槽,然后遍歷鏈表查找或者刪除。