Что означает хранилище [index] [i] [0] в этой функции? - PullRequest
0 голосов
/ 29 апреля 2020

Это код. Я пытаюсь понять, что означает хранилище [index] [i] [0] в функции this.add. Я знаю, что хранилище [index] относится к массиву, в котором пары ключ / значение хранятся после выполнения функции ha sh, но как насчет [i] и [0]? что они означают в этом контексте?

Если бы это было просто хранилище [index] [i], я бы подумал, что оно ссылается на итератор в хранилище [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();

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Ха sh Таблица - это структура данных, в которой данные хранятся ассоциативно. В таблице ha sh данные хранятся в формате массива, где каждое значение данных имеет свое уникальное значение индекса. Если вы запустите свой фрагмент кода, вы увидите, что ht.print () напечатает массив (в вашем примере Array (14)), который, в свою очередь, хранит массив (потому что это hashTable).

Итак storage [index] даст вам массив (назовите его как array1, а в вашем примере это что-то вроде [Array (2)]) с этим индексом. Теперь этот массив (т.е. array1) также является хеш-таблицей, в которой хранятся массивы в соответствии с их индексами.

Так что теперь, когда вы делаете хранилище [index] [i], вы получите массив, содержащий ваши значения, которые вы вставили в хеш-таблицу, т.е. в соответствии с вашим примером вы получите ["смокинг", "пингвин"]. Таким образом, чтобы напечатать или получить фактическое значение, вам снова нужно добавить указатель c (т.е. вам нужно сделать хранилище [индекс] [i] [0] или хранилище [индекс] [i] [1]), чтобы получить " смокинг "или" пингвин ".

0 голосов
/ 29 апреля 2020

Хранилище определяется как массив, ключом которого являются значения, вычисленные с использованием предоставленного ключа.

При добавлении они сначала проверяют, есть ли какое-либо значение, сохраненное для этого вычисленного га sh, если не они добавив его следующим образом

 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]
];

, который можно прочитать как storage[index][1][0], если я равен 1, по сути, нажав новый элемент в массиве индекса столкновения хранилища.

По сути, это механизм предотвращения столкновений при добавлении элементов в хранилище, использующий ключ ha sh в качестве ключа, когда два или более ключей имеют одинаковое значение ha sh.

...