使用javascript類比常見資料結構(三)

來源:互聯網
上載者:User

標籤:元素   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類比常見資料結構(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.