簡體   English   中英

這個 function 中的 storage[index][i][0] 是什么意思?

[英]What does storage[index][i][0] mean in this function?

這是代碼。 我試圖了解 storage[index][i][0] 在“this.add”function 中的含義。 我知道 storage[index] 是指在運行 hash function 之后存儲鍵/值對的數組,但是 [i] 和 [0] 呢? 在這種情況下它們是什么意思?

如果它只是 storage[index][i] 我會認為它指的是 storage[index] 中的迭代器,但是 0(以及下一行中的 1)讓我失望。 請盡可能簡單地解釋一下,因為我對數據結構和編碼很陌生

 var hash = (string, max) => { var hash = 0; for (var i = 0; i < string.length; i++) { hash += string.charCodeAt(i); } return hash % max; }; let HashTable = function() { let storage = []; const storageLimit = 14; this.print = function() { console.log(storage) } this.add = function(key, value) { var index = hash(key, storageLimit); if (storage[index] === undefined) { storage[index] = [ [key, value] ]; } else { var inserted = false; for (var i = 0; i < storage[index].length; i++) { if (storage[index][i][0] === key) { storage[index][i][1] = value; inserted = true; } } if (inserted === false) { storage[index].push([key, value]); } } }; this.remove = function(key) { var index = hash(key, storageLimit); if (storage[index].length === 1 && storage[index][0][0] === key) { delete storage[index]; } else { for (var i = 0; i < storage[index].length; i++) { if (storage[index][i][0] === key) { delete storage[index][i]; } } } }; this.lookup = function(key) { var index = hash(key, storageLimit); if (storage[index] === undefined) { return undefined; } else { for (var i = 0; i < storage[index].length; i++) { if (storage[index][i][0] === key) { return storage[index][i][1]; } } } }; }; console.log(hash('quincy', 10)) let ht = new HashTable(); ht.add('beau', 'person'); ht.add('fido', 'dog'); ht.add('rex', 'dinosour'); ht.add('tux', 'penguin') console.log(ht.lookup('tux')) ht.print();

Hash 表是一種以關聯方式存儲數據的數據結構。 在 hash 表中,數據以數組格式存儲,其中每個數據值都有自己唯一的索引值。 如果您運行代碼片段,您將看到 ht.print() 將打印一個數組(在您的示例 Array(14) 中),該數組又存儲一個數組(因為這是一個哈希表)。

因此 storage[index] 會在該索引處為您提供一個數組(將其命名為 array1,在您的示例中,它類似於 [Array(2)])。 現在這個數組(即array1)也是一個哈希表,它根據它們的索引存儲數組。

因此,現在當您執行 storage[index][i] 時,您將獲得一個包含您插入到哈希表中的值的數組,即根據您的示例,您將獲得 ["tux", "penguin"]。 因此,要打印或獲取實際值,您必須再次添加特定索引(即您需要執行 storage[index][i][0] 或 storage[index][i][1])以獲得“tux”或“企鵝”。

存儲定義為一個數組,其鍵是使用提供的鍵計算的具有值

添加時,他們首先檢查是否有為計算的 hash 存儲的任何值,如果沒有,則按如下方式添加

 storage[index] = [
    [key, value]
 ];

可以讀為

  1. 創建一個數組,說obj有兩個元素,第 0 個索引將具有鍵,第 1 個索引將具有值
  2. 現在將在第一步中創建的obj存儲為新數組的第 0 個元素
  3. 這導致 ins storage[index][[key,value]

現在,如果在存儲中找到索引,這意味着您必須添加新鍵,例如key2value2 ,如下所示

storage[index] = [
   [key, value],
   [key2, value2]
];

如果 i 為1 ,則可以將其讀取為storage[index][1][0] ,本質上是將新項目推送到存儲沖突索引的數組中。

本質上,這是一種避免沖突的機制,當兩個或多個鍵最終具有相同的 hash 時,使用 hash 作為鍵向存儲添加元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM