成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《Javascript數(shù)據(jù)結(jié)構(gòu)和算法》筆記-「字典和散列表」

wenyiweb / 2260人閱讀

摘要:我經(jīng)常在業(yè)務(wù)代碼中把數(shù)據(jù)處理成這種字典的數(shù)據(jù)結(jié)構(gòu)獲取的方法哈希表在學(xué)習(xí)了類之后,我們會(huì)學(xué)習(xí)散列表,也就是哈希表。

《Javascript數(shù)據(jù)結(jié)構(gòu)和算法》筆記-「字典和散列表」

集合、字典、散列表存儲(chǔ)的都是「不重復(fù)」的數(shù)據(jù)結(jié)構(gòu)

集合:我們更關(guān)注每一個(gè)元素的值,并把其作為主要元素

字典:我們用[鍵,值]的形式來存儲(chǔ)數(shù)據(jù)

散列表: 跟字典類似,也會(huì)是用[鍵,值]的形式來存儲(chǔ)數(shù)據(jù)

但是「字典」和「散列表」的實(shí)現(xiàn)方式略有不同。

字典

字典也稱作映射。我覺得這種數(shù)據(jù)結(jié)構(gòu),其實(shí)在業(yè)務(wù)代碼中的應(yīng)用很常見。

與Set類似,ES6同樣實(shí)現(xiàn)了一個(gè)Map類,即我們所說的字典

字典的大致骨架

    function Dictionary(){
        var items = {}
    }

    this.set = function(key,value){}
    this.get = function(key){}
    this.delete = function(key){}
    this.has = function(key){}
    this.clear = function(){}
    this.size = function(){}
    this.keys = function(){}  // 將字典所包含的所有鍵,以一個(gè)數(shù)組返回
    this.values = function(){}  // 將字典所包含的所有值,以一個(gè)數(shù)組返回

字典類的實(shí)現(xiàn),十分簡(jiǎn)單就直接粘貼全部代碼了。

我覺得在JS中,對(duì)象本身就可以作為字典來使用。我經(jīng)常在業(yè)務(wù)代碼中把數(shù)據(jù)處理成這種字典的數(shù)據(jù)結(jié)構(gòu)

        function Dictionary() {
            var items = {}

            this.has = function ( key ) {
                return items.hasOwnProperty( key )
            }

            this.set = function ( key, value ) {
                items[ key ] = value
            }

            this.delete = function ( key ) {
                if ( this.has( key ) ) {
                    delete items[ key ]
                    return true
                }
                return false
            }

            this.get = function ( key ) {
                if ( this.has( key ) ) {
                    return items[ key ]
                } else {
                    return undefined
                }
            }

            this.values = function(){
                return Object.values(items)
            }

            this.keys = function(){
                return Object.keys(items)
            }

            this.clear = function(){
                this.items = {}
            }

            this.size = function(){
                return this.keys().length
            }

            this.getItems = function(){   // 獲取items的方法
                return items
            }
        }

        var dictionary = new Dictionary()

        dictionary.set("Gandalf","[email protected]")
        dictionary.set("John","[email protected]")
        dictionary.set("Tyrion","[email protected]")

        console.log(dictionary.has("Gandalf"))
        console.log(dictionary.size())
        console.log(dictionary.keys())
        console.log(dictionary.values())
        console.log(dictionary.get("Tyrion"))
        dictionary.delete("John")
        console.log(dictionary.keys())
        console.log(dictionary.values())
        console.log(dictionary.getItems())
哈希表

在學(xué)習(xí)了Dictionary類之后,我們會(huì)學(xué)習(xí)散列表,也就是哈希表。它是Dictionary類的另外一種實(shí)現(xiàn)方式

我在讀到這里時(shí),對(duì)于「字典」和「哈希表」2個(gè)慨念之間的區(qū)別還沒弄清,當(dāng)然書中也沒有太多解釋。

所以這里,我寫記錄一下自己查閱資料后的個(gè)人理解

「字典」指的是Key-Value這種存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)

那么哈希表也是字典,但是它是用另外的一種實(shí)現(xiàn)方式來做的。

那么我們我為什么要使用這種方式來實(shí)現(xiàn)「字典」呢,是不是字典存在某種缺點(diǎn)呢?

是的,比如說這樣的一組字典數(shù)據(jù)

k1, k2, k3, k4, k4 ....
v1, v2, v3, v4, v5 ....

當(dāng)你輸入key,命令電腦查詢key對(duì)應(yīng)的value時(shí),電腦其實(shí)是沒法立刻找到key所對(duì)應(yīng)的value呢

看上去是直接根據(jù)key得到value,但實(shí)際上電腦還是需要遍歷k1、k2、k3去比較kn是否等于key。如果是的話就取出對(duì)應(yīng)的值

那么為了省去這個(gè)遍歷的過程,才想到用哈希表來實(shí)現(xiàn)「字典」

哈希表利用數(shù)組實(shí)現(xiàn)「字典」這種數(shù)據(jù)結(jié)構(gòu),那么用數(shù)組來實(shí)現(xiàn)字典的話,用戶傳入的key對(duì)應(yīng)哪個(gè)索引呢?所以我們需要一個(gè)「散列算法」

「散列算法」,可以求出這個(gè)key在數(shù)組里對(duì)應(yīng)的位置,用哈希表實(shí)現(xiàn)的目的就是盡可能快地在字典中找到一個(gè)值。

function HashTable(){
    let table = []

    // 散列算法
    var loseloseHashCode = function(key){
        var hash = 0;
        for(var i = 0 ; i
哈希表的key值沖突

我們哈希表的散列算法,是為求出用戶傳入的key所對(duì)應(yīng)的一個(gè)索引

那么這個(gè)索引是有可能重復(fù)的,一旦重復(fù)就會(huì)導(dǎo)致后面的值覆蓋前面的值。

這種情況,叫做哈希表的沖突。所以我們了解2種處理沖突的方法原理

分離鏈接: 把數(shù)組的每一個(gè)元素都實(shí)例成鏈表結(jié)構(gòu)。這樣key相同的值,也可以用單鏈表的形式不斷存儲(chǔ)。不會(huì)覆蓋

線性探查: 當(dāng)用散列算法求出的這個(gè)索引index重復(fù)時(shí),就index++,直到index不重復(fù)為止。

實(shí)現(xiàn)更好的散列函數(shù)

之前實(shí)現(xiàn)的"lose lose"散列函數(shù),用來求值其實(shí)是非常容易產(chǎn)生key沖突的。

如果經(jīng)常沖突的話,那么插入和查詢一個(gè)元素的時(shí)間就會(huì)變慢(性能變差)

所以一個(gè)優(yōu)秀的散列算法,應(yīng)該是可以盡可能少出現(xiàn)沖突的

這里給出一個(gè)比較好的社區(qū)的實(shí)現(xiàn)。至于為什么這種算法,可以減少?zèng)_突我也不太理解,

可能是hash是質(zhì)數(shù),然后質(zhì)數(shù)*33,最后在跟1013取模的話,不太會(huì)產(chǎn)生一樣的余數(shù),這個(gè)感覺是數(shù)學(xué)問題。

var djb2HashCode = function(key){
    var hash = 5381

    for(var i = 0 ; i < key.length ; i++){
        hash = hash*33 + key.charCodeAt(i)
    }

    return hash % 1013
}

簡(jiǎn)單回顧一下,集合、字典、哈希表吧

首先他們的元素都是不重復(fù)的

集合: 是無序的,[value value]的形式的一組數(shù)據(jù)結(jié)構(gòu)

字典: 是由一對(duì)對(duì) [key-value] 組成的數(shù)據(jù)結(jié)構(gòu)

哈希表: 是字典的另外一種實(shí)現(xiàn)方式,優(yōu)點(diǎn)在于可能更快的根據(jù)key取到value

記錄一下書中沒搞清楚的小疑問:

《javascript數(shù)據(jù)結(jié)構(gòu)和算法》中多次提到「順序數(shù)據(jù)結(jié)構(gòu)」和「非順序數(shù)據(jù)結(jié)構(gòu)」的慨念,并表示

- 「順序數(shù)據(jù)結(jié)構(gòu)」:棧、隊(duì)列、數(shù)組、鏈表、集合
- 「非順序數(shù)據(jù)結(jié)構(gòu)」: 散列表 、 樹

可是我覺得鏈表、集合是無序的,數(shù)組是有序的呀

這個(gè)「順序數(shù)據(jù)結(jié)構(gòu)」似乎并不是指的在內(nèi)存中存儲(chǔ)形式。問題先記下,回頭再查把

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108733.html

相關(guān)文章

  • JavaScript數(shù)據(jù)結(jié)構(gòu)算法筆記——第7章 字典列表

    摘要:在字典中,存儲(chǔ)的是鍵,值,集合可以看作值,值的形式存儲(chǔ)元素,字典也稱為映射方法描述備注向字典中添加新元素通過某個(gè)鍵值從字典中移除對(duì)應(yīng)的數(shù)據(jù)值判斷某個(gè)鍵值是存在于這個(gè)字典中通過鍵值獲取對(duì)應(yīng)的數(shù)據(jù)值返回字典所有元素的數(shù)量刪除字典中所有元素將字典 在字典中,存儲(chǔ)的是[鍵,值],集合可以看作[值,值]的形式存儲(chǔ)元素,字典也稱為映射 方法 描述 備注 set(key,...

    zorro 評(píng)論0 收藏0
  • CSS技巧

    摘要:技巧使你的更加專業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...

    DangoSky 評(píng)論0 收藏0
  • CSS技巧

    摘要:技巧使你的更加專業(yè)這是上關(guān)于技巧的一篇譯文,另外你也可以在本項(xiàng)目看到原文。列舉了一些很實(shí)用的技巧,比如給空內(nèi)容的標(biāo)簽添加內(nèi)容,逗號(hào)分隔列表等等。排序算法看源碼,把它背下來吧排序算法的封裝。主要幫助初學(xué)者更好的掌握排序算法的實(shí)現(xiàn)。 成為專業(yè)程序員路上用到的各種優(yōu)秀資料、神器及框架 成為一名專業(yè)程序員的道路上,需要堅(jiān)持練習(xí)、學(xué)習(xí)與積累,技術(shù)方面既要有一定的廣度,更要有自己的深度。 Java...

    zgbgx 評(píng)論0 收藏0
  • CSS技巧 - 收藏集 - 掘金

    摘要:筆者作為一位,將工作以來用到的各種優(yōu)秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤,此前端知識(shí)點(diǎn)大百科全書前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計(jì)算數(shù)組的極值技巧使你的更加專業(yè)前端掘金一個(gè)幫你提升技巧的收藏集。 CSS 樣式畫各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經(jīng)常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會(huì)用到。會(huì)持續(xù)更新… 一、...

    Jonathan Shieber 評(píng)論0 收藏0
  • CSS技巧 - 收藏集 - 掘金

    摘要:筆者作為一位,將工作以來用到的各種優(yōu)秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤,此前端知識(shí)點(diǎn)大百科全書前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計(jì)算數(shù)組的極值技巧使你的更加專業(yè)前端掘金一個(gè)幫你提升技巧的收藏集。 CSS 樣式畫各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經(jīng)常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會(huì)用到。會(huì)持續(xù)更新… 一、...

    SHERlocked93 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<