【问题标题】:What does storage[index][i][0] mean in this function?storage[index][i][0] 在这个函数中是什么意思?
【发布时间】:2020-08-13 00:26:06
【问题描述】:

这是代码。我试图了解 storage[index][i][0] 在“this.add”函数中的含义。我知道 storage[index] 是指通过哈希函数运行后存储键/值对的数组,但是 [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();

【问题讨论】:

    标签: javascript arrays data-structures hashmap hashtable


    【解决方案1】:

    哈希表是一种以关联方式存储数据的数据结构。在哈希表中,数据以数组格式存储,其中每个数据值都有自己唯一的索引值。 如果您运行代码 sn-p,您将看到 ht.print() 将打印一个数组(在您的示例 Array(14) 中),该数组又存储一个数组(因为这是一个哈希表)。

    因此 storage[index] 将在该索引处为您提供一个数组(将其命名为 array1,在您的示例中,它类似于 [Array(2)])。现在这个数组(即array1)也是一个哈希表,根据它们的索引存储数组。

    所以现在当您执行 storage[index][i] 时,您将获得一个包含您插入到哈希表中的值的数组,即按照您的示例,您将获得 ["tux", "penguin"]。因此,要打印或获取实际值,您必须再次添加特定索引(即您需要执行 storage[index][i][0] 或 storage[index][i][1])以获得“tux”或“企鹅”。

    【讨论】:

      【解决方案2】:

      存储被定义为一个数组,其键是使用提供的键计算的具有值

      添加时,他们首先检查是否有为计算的哈希存储的任何值,如果没有,则按如下方式添加它

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

      可以读作

      1. 创建一个包含两个元素的数组,例如 obj,第 0 个索引将具有键,第 1 个索引将具有值
      2. 现在将在第一步中创建的 obj 存储为新数组的第 0 个元素
      3. 导致ins storage[index][[key,value]

      现在,如果在存储中找到索引,这意味着您必须添加新键,例如 key2 和 value2,如下所示

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

      如果我是1,则可以读作storage[index][1][0],本质上是将一个新项目推送到存储冲突索引的数组中。

      本质上,这是一种避免冲突的机制,当两个或多个键最终具有相同的散列时,使用散列作为键将元素添加到存储中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-12
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多