字典和散列表

字典(也被稱為映射)和散列表是用來存儲唯一值的數(shù)據(jù)結構统倒。
在字典和散列表中都是用[鍵寨典,值]的形式存儲數(shù)據(jù)的。其中鍵名是用來查詢特定元素的房匆。
在ECMAScript 6中包含了Map類的實現(xiàn)耸成,也就是字典。在ECMAScript 6中的Map類型是一種存儲著許多鍵值對的有序列表坛缕,其中鍵名和對應的值支持所有的類型墓猎。和對象不太一樣,不會將鍵名強制轉換為字符串類型赚楚。
以ECMAScript 6中的Map類為基礎實現(xiàn)一個字典類毙沾。

function Dictionaries() {
    var items = {};

    this.set = function (key, value) {
        //向字典中添加新元素
        return items[key] = value;
    };
    this.remove = function (key) {
        //通過鍵值從字典中移除元素
        if(this.has(key)) {
            delete items[key];
            return true;
        }
        return false;
    };
    this.has = function (key) {
        //判斷鍵值是否存在
        return items.hasOwnProperty(key);
    };
    this.get = function (key) {
        //通過鍵值獲取元素
        return this.has(key) ? items[key] : undefined;
    };

    this.clear = function () {
        //將字典中所有元素全部刪除
        items = {};
    };
    this.size = function () {
        //獲取字典所包含元素的數(shù)量
        //有兼容問題
        // return Object.keys(items).length;
        //通用
        var count = 0;
        for(var key in items) {
            if(items.hasOwnProperty(key)) {
                count++;
            }
        }
        return count;
    };

    this.keys = function () {
        //獲取字典所包含的所有鍵值以數(shù)組形式返回
        //有兼容問題
        // return Object.keys(items);
        //通用
        var keys = [];
        for (var key in items) {
            if (items.hasOwnProperty(key)) {
                keys.push(key);
            }
        }
        return keys;
    };
    this.values = function () {
        //獲取字典中所有包含的數(shù)值以數(shù)組形式返回
        var values = [];
        for (var key in items) {
            if(items.hasOwnProperty(key)) {
                values.push(items[key]);
            }
        }
        return values;
    };
}

var dictionaries = new Dictionaries();

dictionaries.set('name', 'Jason');
dictionaries.set('age', 23);
dictionaries.set('hobby', 'short story');

console.log(dictionaries.size());  //3
console.log(dictionaries.keys()); //[ 'name', 'age', 'hobby' ]
console.log(dictionaries.values()); //[ 'Jason', 23, 'short story' ]

散列表
HashTable類,也叫HashMap類宠页,是Dictionary類的一種散列表實現(xiàn)方式左胞。
散列算法的作用:是盡可能快的在數(shù)據(jù)結構中找到一個值寇仓。在數(shù)組中,通常獲得一個值烤宙,需要遍歷整個數(shù)據(jù)結構來找到他遍烦。如果使用散列函數(shù),就能知道值的具體位置躺枕,因此能夠快速檢索到該值服猪。散列函數(shù)的作用是給定一個鍵值,然后返回值在表中的地址拐云。
創(chuàng)建一個散列表

function HashTable() {
    var table = [];

    var hashFunction = function (key) {
        //散列函數(shù)罢猪,根據(jù)每個字符串的ASCII碼值的和得到
        // 一個數(shù)字做為散列表項的Key值
        var hash = 5381;
        for (var i=0; i < key.length; i++) {
            hash = hash * 33 + key.charCodeAt(i);
        }

        return hash % 1013;
    };

    this.put = function (key, value) {
        //向散列表增加一個新的項目或者更新項
      var position = hashFunction(key);
      table[position] = value;
    };
    this.remove = function (key) {
        //移除散列表中的某個項
        table[hashFunction(key)] = undefined;
    };
    this.get = function (key) {
        //獲取散列表中的某個項
        return table[hashFunction(key)];
    };

}

var hash = new HashTable();

hash.put('Jason', 'jason@email.com');

console.log(hash.get('Jason')); //jason@email.com

處理散列表中的沖突
哈希沖突:每一個鍵都對應有散列值,當不同的值在散列表中對應相同位置的時候叉瘩,就會產(chǎn)生沖突膳帕。
處理沖突的方法有:
分離鏈接:為散列表的每一個位置創(chuàng)建一個鏈表并將元素存儲在里面。
線性探查:當想向表中某個位置加入一個新元素時薇缅,如果索引為index的位置以及被占據(jù)危彩,就嘗試index+1的位置,如果也被占據(jù)就繼續(xù)+1泳桦,以此類推汤徽。
雙散列法。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蓬痒,一起剝皮案震驚了整個濱河市泻骤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梧奢,老刑警劉巖狱掂,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異亲轨,居然都是意外死亡趋惨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門惦蚊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來器虾,“玉大人,你說我怎么就攤上這事蹦锋≌咨常” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵莉掂,是天一觀的道長葛圃。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么库正? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任曲楚,我火速辦了婚禮,結果婚禮上褥符,老公的妹妹穿的比我還像新娘龙誊。我一直安慰自己,他們只是感情好喷楣,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布趟大。 她就那樣靜靜地躺著,像睡著了一般抡蛙。 火紅的嫁衣襯著肌膚如雪护昧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天粗截,我揣著相機與錄音,去河邊找鬼捣炬。 笑死熊昌,一個胖子當著我的面吹牛,可吹牛的內容都是我干的湿酸。 我是一名探鬼主播婿屹,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼推溃!你這毒婦竟也來了昂利?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤铁坎,失蹤者是張志新(化名)和其女友劉穎蜂奸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硬萍,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡扩所,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了朴乖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祖屏。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖买羞,靈堂內的尸體忽然破棺而出袁勺,到底是詐尸還是另有隱情,我是刑警寧澤畜普,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布期丰,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏咐汞。R本人自食惡果不足惜盖呼,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望化撕。 院中可真熱鬧几晤,春花似錦、人聲如沸植阴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掠手。三九已至憾朴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喷鸽,已是汗流浹背众雷。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留做祝,地道東北人砾省。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓秤掌,卻偏偏與公主長得像屎飘,于是被迫代替她去往敵國和親戏自。 傳聞我的和親對象是個殘疾皇子晒他,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • 字典和散列表 集合斤贰、字典和散列表可以存儲不重復的值 集合以[值意蛀,值]的形式存儲元素傍妒,字典和散列表以[鍵留瞳,值]的形式...
    陳左夕閱讀 211評論 0 0
  • 說明:該系列博客整理自《算法導論(原書第二版)》悯嗓,但更偏重于實用件舵,所以晦澀偏理論的內容未整理,請見諒绅作。另外本人能力...
    黑夜0411閱讀 1,464評論 0 2
  • 散列表(hash table)是實現(xiàn)字典操作的一種有效數(shù)據(jù)結構芦圾,盡管最壞情況下,散列表中的查找一個元素的時間與鏈表...
    Mrsunup閱讀 1,336評論 0 2
  • 孟嘗君俄认,戰(zhàn)國四公子之一个少。王安石,唐宋八大家之一眯杏。王安石評價孟嘗君是雞鳴狗盜之徒夜焦,,即黑社會老大岂贩,這個評價不是很入耳...
    賀云上閱讀 1,961評論 0 1
  • 以前總想著去找個工資高茫经,輕松,而且讓自己感覺有價值的工作。在剛出來工作那幾年里卸伞,總想著努力掙錢抹镊,然后想跟父母一起的...
    Anny_see閱讀 1,560評論 7 21