在Javascript中實現偽雜湊表

來源:互聯網
上載者:User

     瞭解資料結構的人應該都聽說過雜湊表這種資料結構,它是一種典型的利用索引值對儲存並檢索資料的一種非線性結構,又稱散列表或雜湊法。在一般的線性表結構中,資料的相對位置是隨機的,即資料和用於檢索的關鍵字之間不存在確定的關係,檢索資料時往往需要進行一系列的比較,最終找到要檢索的資料,這種方法往往建立在迴圈比較的機制上,利用時間的代價節省了空間,實現了資料的儲存和檢索功能。而雜湊表則使用索引值對進行資料的儲存,在資料的儲存位置和它的關鍵字之間建立了一一對應的關係,從而使每個關鍵字和結構中的一個唯一的儲存位置相對應,所以在檢索資料時,只需要根據這個對應關係便可快速定位到要尋找的資料。

    事實上,我們通常並不關心資料是如何儲存的,而關心的是我們在使用資料的時候是否方便,例如對資料進行排序、尋找、替換等操作,由於這種操作是貫穿在整個應用程式始終的,因此對效率的要求也就很高了。一般的進階語言,如C和C的變種,都提供了用於儲存雜湊表的資料結構,但在弱類型語言中,如javascript等指令碼語言,本身並沒有直接提供類似於雜湊表的這種結構,不過我們可以從數組出發,按照雜湊表的原理自己打造一個指令碼語言專有的雜湊表資料結構。

    我們知道,在資料中,可以通過下標直接定位到相應資料,也就是用於儲存資料的空間,數組的這種特性本身就決定了它可以被用來實現雜湊演算法,不過在C語言中,數組的下標只能是從0開始的整數,而不能為其它類型的資料,但在javascript中,我們可以借用“對象”這個概念,按照數組的特性來類比雜湊演算法。因為在javascript中,對象其實就是屬性或方法的一個集合,於是我們可以構造一個Hashtable對象,它有key和value兩個屬性,自己編寫代碼來類比一個完整的雜湊表。下面是一段在javascript中實現雜湊表的代碼:

1 function Hashtable() 
2 {
3   this._hash = {};
4   this._count = 0;
5   this.add = function(key, value) 
6   {
7       if (this._hash.hasOwnProperty(key)) return false;
8       else { this._hash[key] = value; this._count++; return true; }
9   }
10   this.remove = function(key) { delete this._hash[key]; this._count--; }
11   this.count = function() { return this._count; }
12   this.items = function(key) { if (this.contains(key)) return this._hash[key]; }
13   this.contains = function(key) { return this._hash.hasOwnProperty(key); }
14   this.clear = function() { this._hash = {}; this._count = 0; }
15 }

    實現起來很簡單,我們在function中定義了一個_hash對象,該對象有一個屬性key,我們可以給這個屬性賦值,hasOwnProperty方法是javascript提供的方法,用於返回指定的對象中是否包含某個屬性。同時我們在該function中還定義了一個_count對象,用於記錄Hashtable中的資料個數,因為我們不想每次擷取Hashtable中的資料個數時都要通過一個內建的迴圈來計數,這樣開銷就會小一些,前面說了,雜湊演算法的一個基本特性就是效率高。delete語句在javascript中用於銷毀一個對象。

    下面是使用該Hashtable的一些例子:

 1 var hashCompany = new Hashtable();
 2 
 3 //向Hashtable中添加索引值對
 4 function FillData(arr) {
 5     hashCompany.clear();
 6 
 7     for (var i = 0; i < arr.length - 1; i++) {
 8         if (arr[i] != "") {
 9             t = arr[i].split("`");
10             if (t.length > 2) {
11                 if (!hashCompany.contains(t[0].trim())) {
12                     hashCompany.add(t[0].trim(), t[1]);
13                 }
14             }
15         }
16     }
17 }
18 
19 //遍曆Hashtable並取出值
20 function GetDataFromHash() {
21     var s;
22     if (hashCompany.count > 0) {
23         for (var i in hashCompany._hash) {
24             s += i + "|";
25         }
26     }
27 
28     if (s.length > 0) {
29         s = s.substring(0, s.length - 2);
30     }
31 
32     return s;
33 }

    代碼比較簡單,這裡就不再多加說明了,其中用到了一個trim函數,下面補上。

//採用Regex去除字串兩端的空格,匿名函數用於擴充String對象的方法
String.prototype.trim = function() { return this.replace(/(^\s*)|(\s*$)/g, ""); }

    雜湊表在代碼中使用頻率很高,靈活使用雜湊表可以簡化代碼並提供諸多方便,尤其是在儲存類似於數組的資料並且希望之後能夠方便檢索。將代碼儲存於此,以備日後使用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.