#javascript #binary #hashtable
#javascript #двоичный #хэш-таблица
Вопрос:
Я изучаю структуры данных и пытаюсь реализовать расширяемое хеширование с нуля в Javascript, и я в замешательстве. Вот пример, который я использую в качестве справочной хэш-таблицы с двоичными метками
Пример: для хранения «john»:35 в таблице размером: 8 индексов / глубина 3 (последние 3 цифры двоичного хэша)
- «джон» преобразуется в хэш, пример: 13,
- 13 преобразуется в двоичный файл: 1101
- найдите, к какому индексу таблицы относится 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]