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

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

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

前言

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

張三:這個商品多少錢

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

收銀員:88元,給你湊個整。

(滴。。。付款成功)

成功支付90元。

hash表

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

有人說可以遍歷暴力查詢,總能找到項目。

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

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

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

我們想一個辦法把它變成一個數(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

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

這里我們只是添加了字母對應的ascii下標。僅供參考和學習。一個好的哈希算法應該盡量避免下標過多和下標分散過大,還要處理和解決哈希沖突。

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

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

實現(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];
        }

實現(xiàn) set 功能

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

做個測試

        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'))

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

相關文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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