新聞中心
了解數(shù)據(jù)結(jié)構(gòu)的人應(yīng)該都聽說(shuō)過(guò)哈希表這種數(shù)據(jù)結(jié)構(gòu),它是一種典型的利用鍵值對(duì)存儲(chǔ)并檢索數(shù)據(jù)的一種非線性結(jié)構(gòu),又稱散列表或雜湊法。在一般的線性表結(jié)構(gòu)中,數(shù)據(jù)的相對(duì)位置是隨機(jī)的,即數(shù)據(jù)和用于檢索的關(guān)鍵字之間不存在確定的關(guān)系,檢索數(shù)據(jù)時(shí)往往需要進(jìn)行一系列的比較,最終找到要檢索的數(shù)據(jù),這種方法往往建立在循環(huán)比較的機(jī)制上,利用時(shí)間的代價(jià)節(jié)省了空間,實(shí)現(xiàn)了數(shù)據(jù)的存儲(chǔ)和檢索功能。而哈希表則使用鍵值對(duì)進(jìn)行數(shù)據(jù)的存儲(chǔ),在數(shù)據(jù)的存儲(chǔ)位置和它的關(guān)鍵字之間建立了一一對(duì)應(yīng)的關(guān)系,從而使每個(gè)關(guān)鍵字和結(jié)構(gòu)中的一個(gè)***的存儲(chǔ)位置相對(duì)應(yīng),所以在檢索數(shù)據(jù)時(shí),只需要根據(jù)這個(gè)對(duì)應(yīng)關(guān)系便可快速定位到要查找的數(shù)據(jù)。

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到西盟網(wǎng)站設(shè)計(jì)與西盟網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋西盟地區(qū)。
事實(shí)上,我們通常并不關(guān)心數(shù)據(jù)是如何存儲(chǔ)的,而關(guān)心的是我們?cè)谑褂脭?shù)據(jù)的時(shí)候是否方便,例如對(duì)數(shù)據(jù)進(jìn)行排序、查找、替換等操作,由于這種操作是貫穿在整個(gè)應(yīng)用程序始終的,因此對(duì)效率的要求也就很高了。一般的高級(jí)語(yǔ)言,如C和C的變種,都提供了用于存儲(chǔ)哈希表的數(shù)據(jù)結(jié)構(gòu),但在弱類型語(yǔ)言中,如javascript等腳本語(yǔ)言,本身并沒(méi)有直接提供類似于哈希表的這種結(jié)構(gòu),不過(guò)我們可以從數(shù)組出發(fā),按照哈希表的原理自己打造一個(gè)腳本語(yǔ)言專有的哈希表數(shù)據(jù)結(jié)構(gòu)。
我們知道,在數(shù)據(jù)中,可以通過(guò)下標(biāo)直接定位到相應(yīng)數(shù)據(jù),也就是用于存儲(chǔ)數(shù)據(jù)的空間,數(shù)組的這種特性本身就決定了它可以被用來(lái)實(shí)現(xiàn)哈希算法,不過(guò)在C語(yǔ)言中,數(shù)組的下標(biāo)只能是從0開始的整數(shù),而不能為其它類型的數(shù)據(jù),但在javascript中,我們可以借用“對(duì)象”這個(gè)概念,按照數(shù)組的特性來(lái)模擬哈希算法。因?yàn)樵趈avascript中,對(duì)象其實(shí)就是屬性或方法的一個(gè)集合,于是我們可以構(gòu)造一個(gè)Hashtable對(duì)象,它有key和value兩個(gè)屬性,自己編寫代碼來(lái)模擬一個(gè)完整的哈希表。下面是一段在javascript中實(shí)現(xiàn)哈希表的代碼:
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 }
實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,我們?cè)趂unction中定義了一個(gè)_hash對(duì)象,該對(duì)象有一個(gè)屬性key,我們可以給這個(gè)屬性賦值,hasOwnProperty方法是javascript提供的方法,用于返回指定的對(duì)象中是否包含某個(gè)屬性。同時(shí)我們?cè)谠揻unction中還定義了一個(gè)_count對(duì)象,用于記錄Hashtable中的數(shù)據(jù)個(gè)數(shù),因?yàn)槲覀儾幌朊看潍@取Hashtable中的數(shù)據(jù)個(gè)數(shù)時(shí)都要通過(guò)一個(gè)內(nèi)置的循環(huán)來(lái)計(jì)數(shù),這樣開銷就會(huì)小一些,前面說(shuō)了,哈希算法的一個(gè)基本特性就是效率高。delete語(yǔ)句在javascript中用于銷毀一個(gè)對(duì)象。
下面是使用該Hashtable的一些例子:
1 var hashCompany = new Hashtable();
2
3 //向Hashtable中添加鍵值對(duì)
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 }
代碼比較簡(jiǎn)單,這里就不再多加說(shuō)明了,其中用到了一個(gè)trim函數(shù),下面補(bǔ)上。
//采用正則表達(dá)式去除字符串兩端的空格,匿名函數(shù)用于擴(kuò)展String對(duì)象的方法 |
哈希表在代碼中使用頻率很高,靈活使用哈希表可以簡(jiǎn)化代碼并提供諸多方便,尤其是在存儲(chǔ)類似于數(shù)組的數(shù)據(jù)并且希望之后能夠方便檢索。將代碼保存于此,以備日后使用。
網(wǎng)頁(yè)題目:在Javascript中實(shí)現(xiàn)偽哈希表
網(wǎng)頁(yè)網(wǎng)址:http://m.5511xx.com/article/cdhsdip.html


咨詢
建站咨詢
