標籤:元素 com tab 行儲存 pre ash 建立 ict seh
六、字典和散列表
我們已經知道,集合表示一組互不相同的元素(不重複元素)。在字典中,儲存的是索引值對,其中索引值是用來查詢特定的元素的。字典和集合是很相似的,集合採用[值,值]的方式儲存,而字典則是以[鍵,值]的方式來進行儲存的。字典也稱作映射。
首先,我們還是用函數來建立一個字典,在es6中新增了map類,其表示的就是字典這種資料結構。
function Dictionary(){ var items = {}; }
嗯,然後其實還是老規矩,有一些方法來操作這個字典,包括set,remove,has,get,clear等等。
this.has = function(key){ return key in items;}
this.set = function(key,value){ items[key] = value }
this.remove = function(key){ if(this.has(key)){ delete items[key]; return true } return null }
this.get = function(){ return this.has[key]?item[key]:undefined;}
嗯,主要就是上述這些方法,其實簡單來說就是個對象。。。。
下面主要來說一下散列表,叫做HashTable或者HashMap,散列表可以明顯提高字典的尋找速度,簡而言之就是它不需要去遍曆鍵。對於沒喲個鍵名,它使用了一種演算法來進行編碼,編碼的值記錄了值的地址,嗯,像下面這張圖一樣。
嗯,上面這張圖是根據鍵名每個字母的ASCⅡ碼的和來進行的,實際情況其實要比這複雜的多。
然後我們可以根據loselose演算法來進行鍵名和散列值的對應:
var loseloseHashCode = function (key) { var hash = 0; for (var i = 0; i < key.length; i++) { hash += key.charCodeAt(i); } return hash % 37; };
嗯,這樣就變成了這個樣子了。
嗯,這樣需要的數組的長度就比上面小的多了,並且,如果我們需要尋找一個key,那麼就可以很容易的通過上面的演算法直接找到其對應的值,而不用遍曆整個字典了。
另外,在散列表中大家也可以很容易的想到,如果鍵名產生了同樣的散列值怎麼樣,比如Tyrion 和Aaron會產生同樣的散列值16,這樣後輸入的索引值就會覆蓋前面的索引值,為瞭解決這個問題,我們可以使用分離鏈表來解決。如:
這樣在一個散列表的每一個值的位置我們都儲存一個鏈表,就不會發生上面說的那種情況了,這種方法叫做分離鏈表。
使用javascript類比常見資料結構(三)