在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/C  HTML/ JavaScript的散列函數(shù)問題

JavaScript的散列函數(shù)問題

    var loseloseHashCode = function (key) {
        var hash = 0;
        for (var i = 0; i < key.length; i++) {
            hash += key.charCodeAt(i);
        }
        return hash % 37;
    };
    
    this.put = function(key, value) {
        var position = loseloseHashCode(key); //{5}
        console.log(position + ' - ' + key); //{6}
        table[position] = value; //{7}
    };

問題:看到某本書上的散列函數(shù)最后return hash %37,我測(cè)試這樣會(huì)出現(xiàn)覆蓋啊。比如當(dāng)key='Abc'key='fbc'的時(shí)候,因?yàn)锳bc的ASCII碼值之和=262,而fbc的ASCII值之和=299。他們兩個(gè)各自Mod37=3。所以都會(huì)在position=3這個(gè)位置上插入一個(gè)值,最后結(jié)果產(chǎn)生覆蓋。書上上是為了比較小的數(shù)值,但這樣會(huì)產(chǎn)生覆蓋啊,這樣是散列函數(shù)的本義嗎?

回答
編輯回答
別逞強(qiáng)

可能是為就是為了單純舉個(gè)例子吧,沖突是不可避免的,有解決沖突的相應(yīng)方法。


沖突

  • 數(shù)組不可能無限長,生成的索引相同會(huì)產(chǎn)生沖突。

解決方法

  • 拉鏈法,索引存鏈表,鏈表中存鍵和值和next。同時(shí)又有一個(gè)問題,散列函數(shù)的重要性,應(yīng)將所有的鍵均勻映射。
  • 拉鏈法變種,不存鏈表,存樹或hash表。
  • 開放尋址,沖突則找下一個(gè)不沖突的位置,在滿容后會(huì)進(jìn)行擴(kuò)容。
2018年1月10日 21:34