Реализация расширяемой хэш-таблицы в javascript: как использовать двоичное число в качестве индекса

#javascript #binary #hashtable

#javascript #двоичный #хэш-таблица

Вопрос:

Я изучаю структуры данных и пытаюсь реализовать расширяемое хеширование с нуля в Javascript, и я в замешательстве. Вот пример, который я использую в качестве справочной хэш-таблицы с двоичными метками

Пример: для хранения «john»:35 в таблице размером: 8 индексов / глубина 3 (последние 3 цифры двоичного хэша)

  1. «джон» преобразуется в хэш, пример: 13,
  2. 13 преобразуется в двоичный файл: 1101
  3. найдите, к какому индексу таблицы относится 1101, посмотрев на последние 3 цифры «101».

Вот где я застрял. Должен ли я преобразовать 101 обратно в десятичную форму (которая будет равна 5), чтобы затем получить доступ к индексу, выполнив array[5]? Есть ли способ пометить индексы массива в двоичном формате, например array[101] (но тогда не было бы лучше использовать объект?)? Это похоже на множество ненужных дополнительных шагов, чтобы избежать использования только по модулю (13%8), я что-то упускаю? Полезна ли эта реализация на языке, отличном от javascript?

Первый пост — заранее спасибо!

Ответ №1:

Внутренне все данные на компьютере хранятся в двоичном формате, поэтому вы не можете «преобразовать» из десятичного в двоичный, поскольку все уже является двоичным (просто показано, что оно используется как десятичное). Если вы хотите распечатать число в двоичном виде для целей отладки, вы можете сделать:

 console.log((5).toString(2)); // will print "101"
  

.toString(2) Метод преобразует число в строку с двоичным представлением числа.

Вы также можете записывать числа в двоичном формате, начав его с 0b :

 let x = 0b1101; // == 13
  

Если вы хотите получить последние несколько двоичных цифр числа, используйте оператор по модулю, равный 2, в степени количества цифр, которое вы хотите:

 (0b1101 % (2**3)).toString(2) // "101"
  

При выбранной таблице вы, вероятно, захотите использовать остальную часть числа, которое вы еще не использовали, в качестве индекса в таблице. Для этого мы можем использовать оператор сдвига битов, >> :

 (0b1101 >> 3).toString(2) // "1", right three bits cut off
  

С более длинным числом:

 // Note that underscores don't mean anything, they are just used for spacing
(0b1101_1101 >> 3).toString(2) // "11011" you can see that the right three bits have been cut off
  

Имейте в виду, что вам, вероятно, не следует использовать .toString(2) для фактического хранения чего-либо в таблице; его следует использовать только для отладки.

Комментарии:

1. Спасибо, это упростило часть моего кода. Чтобы уточнить — на изображении профессор помечает индексы таблицы в двоичном формате для теоретических целей? Чтобы фактически получить доступ к массиву [‘101’], все равно нужно было бы просто использовать array [5]?

2. Да, я так считаю (хотя поверьте мне на слово, я не в вашем классе). Если бы вы действительно хотели, вы могли бы написать array[0b101] , который компьютер прочитал бы как array[5]