如何解决在JavaScript中实现可扩展哈希表:如何使用二进制数作为索引
我正在研究数据结构,并试图在Javascript中从头开始实现可扩展哈希,我感到困惑。这是我用作参考hash table with binary labels
的示例示例:将“ john”:35存储在一个大小为8的索引/深度3(二进制哈希的最后3位数字)的表中
- “ john”被转换为哈希,例如:13,
- 13转换为二进制:1101
- 通过查看最后3个数字“ 101”来查找表1101的索引属于哪个
这就是我被困住的地方。我是否想将101转换回十进制形式(即5),然后通过执行array [5]访问索引?有没有一种方法可以用像array [101]这样的二进制格式来标记数组索引(但是使用对象不是更好吗?)?这似乎是很多不必要的额外步骤,可以避免仅使用模(13%8),我是否缺少某些东西?此实现在非JavaScript语言中有用吗?
第一篇文章-预先感谢!
解决方法
在内部,计算机中的所有数据都以二进制形式存储,因此您不能从十进制“转换”为二进制,因为所有内容都已经是二进制(仅显示为用作十进制)。如果要出于调试目的以二进制形式打印数字,可以执行以下操作:
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)
实际上在表中存储任何内容;它只能用于调试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。