欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript Map實(shí)現(xiàn)原理與底層結(jié)構(gòu)詳解

 更新時(shí)間:2022年09月26日 11:15:37   作者:十九(一拖再拖)  
哈希表(也稱為哈希表)是一種基于鍵直接訪問內(nèi)存存儲位置的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過計(jì)算一個(gè)鍵值函數(shù)來加速查找,該函數(shù)將要查詢的數(shù)據(jù)映射到表中的某個(gè)位置。該映射函數(shù)稱為散列函數(shù),記錄數(shù)組稱為散列表

前言

比如,有一天,我們?nèi)ベ徫锏曩I了一件新的、不熟悉的商品。

張三:這個(gè)商品多少錢

收銀員:(在鍵盤上噼啪作響。。。)

收銀員:88元,給你湊個(gè)整。

(滴。。。付款成功)

成功支付90元。

hash表

收銀員如何在數(shù)千件商品中如此迅速地找到這件商品的價(jià)格。

有人說可以遍歷暴力查詢,總能找到項(xiàng)目。

如果有一百萬種產(chǎn)品,需要多少時(shí)間?雖然始終可以從頭到尾查詢,但我們追求更好的性能,這就是我們的哈希表存儲。

我們需要做的就是將商品轉(zhuǎn)化為下標(biāo)形式的數(shù)字,并對應(yīng)數(shù)組的下標(biāo),這樣下次遇到這個(gè)商品,就可以直接根據(jù)下標(biāo)獲取我們需要的信息了。

就像我們有一根香蕉?? banana(香蕉)

我們想一個(gè)辦法把它變成一個(gè)數(shù)字:

        function getHash(str) {
            let _hash = 0;
            for (let i = 0; i < str.length; i++) {
                const charCode = str.charCodeAt(i);
                _hash += charCode;
            }
            return _hash;
        }
        console.log(getHash('banana')) //609

這里我們計(jì)算出它對應(yīng)的數(shù)字是609。

這里我們只是添加了字母對應(yīng)的ascii下標(biāo)。僅供參考和學(xué)習(xí)。一個(gè)好的哈希算法應(yīng)該盡量避免下標(biāo)過多和下標(biāo)分散過大,還要處理和解決哈希沖突。

所以我們可以將數(shù)組下標(biāo)到位置 609 并添加價(jià)格,arr[609] = 66,這里設(shè)置66元。

下次查詢香蕉的價(jià)格,還是可以通過 getHash 算出609,直接取數(shù)組的下標(biāo)就可以得到我們的價(jià)格,只需要O(1)的時(shí)間。

實(shí)現(xiàn) get 功能

        function get(key){
            let _hash = getHash(key);
            //這里的 arr 代表我們存儲數(shù)據(jù)的數(shù)組
            if(!this.arr[_hash]){
                //如果沒查到數(shù)據(jù),返回undefined
                return undefined;
            }
            return this.arr[_hash];
        }

實(shí)現(xiàn) set 功能

        function set(key,value){
            let _hash = getHash(key);
            //這里的 arr 代表我們存儲數(shù)據(jù)的數(shù)組
            this.arr[_hash] = value;
        }

做個(gè)測試

        class MyHash {
            constructor(){
                this.arr = [];
            }
            get(key) {
                let _hash = getHash(key);
                //這里的 arr 代表我們存儲數(shù)據(jù)的數(shù)組
                if (!this.arr[_hash]) {
                    //如果沒查到數(shù)據(jù),返回undefined
                    return undefined;
                }
                return this.arr[_hash];
            }
            set(key, value) {
                let _hash = getHash(key);
                //這里的 arr 代表我們存儲數(shù)據(jù)的數(shù)組
                this.arr[_hash] = value;
            }
        }
        let myhash = new MyHash();
        myhash.set('banana', '88')
        console.log(myhash.get('banana'))

到此這篇關(guān)于JavaScript Map實(shí)現(xiàn)原理與底層結(jié)構(gòu)詳解的文章就介紹到這了,更多相關(guān)JS Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 推薦4個(gè)原生javascript常用的函數(shù)

    推薦4個(gè)原生javascript常用的函數(shù)

    這篇文章主要介紹了推薦4個(gè)原生javascript常用的函數(shù),需要的朋友可以參考下
    2015-01-01
  • JS target與currentTarget區(qū)別說明

    JS target與currentTarget區(qū)別說明

    target在事件流的目標(biāo)階段;currentTarget在事件流的捕獲,目標(biāo)及冒泡階段。只有當(dāng)事件流處在目標(biāo)階段的時(shí)候,兩個(gè)的指向才是一樣的,而當(dāng)處于捕獲和冒泡階段的時(shí)候,target指向被單擊的對象而currentTarget指向當(dāng)前事件活動的對象(一般為父級)。
    2011-08-08
  • javascript性能優(yōu)化之分時(shí)函數(shù)的介紹

    javascript性能優(yōu)化之分時(shí)函數(shù)的介紹

    本篇文章主要介紹了javascript性能優(yōu)化之分時(shí)函數(shù)的介紹,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • Javascript事件的捕獲方式和冒泡方式詳解

    Javascript事件的捕獲方式和冒泡方式詳解

    這篇文章主要為大家介紹了Javascript事件的捕獲方式和冒泡方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 原生JS實(shí)現(xiàn)獲取及修改CSS樣式的方法

    原生JS實(shí)現(xiàn)獲取及修改CSS樣式的方法

    這篇文章主要介紹了原生JS實(shí)現(xiàn)獲取及修改CSS樣式的方法,結(jié)合實(shí)例形式簡單分析了JavaScript針對頁面元素屬性動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-09-09
  • JS保留小數(shù)點(diǎn)(四舍五入、四舍六入)實(shí)現(xiàn)思路及實(shí)例

    JS保留小數(shù)點(diǎn)(四舍五入、四舍六入)實(shí)現(xiàn)思路及實(shí)例

    保留兩位小數(shù):將浮點(diǎn)數(shù)四舍五入,取小數(shù)點(diǎn)后2位;如:2,會在2后面補(bǔ)上00.即2.00,感興趣的朋友看下具體的實(shí)現(xiàn)思路及代碼
    2013-04-04
  • js正則表達(dá)式常用方法梳理(附代碼案例)

    js正則表達(dá)式常用方法梳理(附代碼案例)

    正則表達(dá)式在我們?nèi)粘痰墓ぷ黜?xiàng)目中,應(yīng)該是一個(gè)經(jīng)常用到的技能,在做一些字符的匹配和處理的過程中,發(fā)揮了很大的作用,這篇文章主要給大家介紹了關(guān)于js正則表達(dá)式常用方法的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • 最新評論