>[success] # 散列表
~~~
1.散列表英文叫HashTable,散列表用的是數組支持按照下標隨機訪問數據的特性,
所以散列表其實就是數組的一種擴展,由數組演化而來
2.其實js 的對象就是'基于哈希表結構的'
~~~
[js 的對象就是'基于哈希表結構的'](https://zhuanlan.zhihu.com/p/24291761)
>[danger] ##### 散列函數
~~~
1.這里要舉一個例子:
當在一些運動項目的時候,經常看到運動員身上的編號,這些編號相當于表示一個運動員這樣,方便
我們快速找到,這個就很像 js的對象這種數據結構,key,value的形式
2.上面的例子和散列函數有什么關系,在簡單的情況下確實只要記住就是對應的key即可,但是復雜的情況下
我們需要對這個key 進行轉換,從而進行一些鍵值對的映射,這種轉換的方法就是'散列函數',計算出來的
這種key 就叫'散列值'或者叫'哈希值'
~~~
* 引用極客時間王爭數據結構與算法文章的圖

>[danger] ##### 散列函數設計的基本要求
~~~
1.散列函數計算得到的散列值是一個非負整數;
2.如果 key1 = key2,那 hash(key1) == hash(key2);
3.如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。
注:其中的第三條在本質上是無法避免的,這個舉個例子說明,例如我們的'散列函數'是將傳入進來的值轉換
成對應的asii 碼,通過這個asii碼作為'散列值'不同的單詞通過字母組合可能會出現相同的asii碼。這時候雖然
滿足 key1 ≠ key2,但不滿足 hash(key1) ≠ hash(key2),這個就叫散列沖突
~~~
>[danger] ##### 解決散列沖突的方法
~~~
1.開放尋址法:開放尋址法的核心思想是,如果出現了散列沖突,我們就重新探測一個空閑位置,將其插入
2.鏈表法:在散列表中,每個'桶(bucket)'或者'槽(slot)'會對應一條鏈表,所有散列值相同的元素
我們都放到相同槽位對應的鏈表中
~~~
* 鏈表法如圖

- 接觸數據結構和算法
- 數據結構與算法 -- 大O復雜度表示法
- 數據結構與算法 -- 時間復雜度分析
- 最好、最壞、平均、均攤時間復雜度
- 基礎數據結構和算法
- 線性表和非線性表
- 結構 -- 數組
- JS -- 數組
- 結構 -- 棧
- JS -- 棧
- JS -- 棧有效圓括號
- JS -- 漢諾塔
- 結構 -- 隊列
- JS -- 隊列
- JS -- 雙端隊列
- JS -- 循環隊列
- 結構 -- 鏈表
- JS -- 鏈表
- JS -- 雙向鏈表
- JS -- 循環鏈表
- JS -- 有序鏈表
- 結構 -- JS 字典
- 結構 -- 散列表
- 結構 -- js 散列表
- 結構 -- js分離鏈表
- 結構 -- js開放尋址法
- 結構 -- 遞歸
- 結構 -- js遞歸經典問題
- 結構 -- 樹
- 結構 -- js 二搜索樹
- 結構 -- 紅黑樹
- 結構 -- 堆
- 結構 -- js 堆
- 結構 -- js 堆排序
- 結構 -- 排序
- js -- 冒泡排序
- js -- 選擇排序
- js -- 插入排序
- js -- 歸并排序
- js -- 快速排序
- js -- 計數排序
- js -- 桶排序
- js -- 基數排序
- 結構 -- 算法
- 搜索算法
- 二分搜索
- 內插搜索
- 隨機算法
- 簡單
- 第一題 兩數之和
- 第七題 反轉整數
- 第九題 回文數
- 第十三題 羅馬數字轉整數
- 常見一些需求
- 把原始 list 轉換成樹形結構