如何减少哈希表槽中的指针/地址宽度
How to reduce the pointer/address width in a hash table slot?
假设我们有一个使用链接(链表)来解决哈希冲突的哈希表。每个哈希表槽都有一个指针字段,指向链表的第一个节点。此指针将占用4或8个字节,具体取决于x86或x64操作系统。
对于一些有数百万个插槽的大型哈希表,指针将消耗巨大的内存资源。对于硬件实现,我们可以在FPGA上自定义指针/地址宽度以节省内存。我的问题是,对于软件实现,是否还有任何方法可以将指针大小减少到3字节?
如果一开始就不以这种方式实现哈希表,则可以将溢出列表的指针大小开销减少到0字节。
实际上,实现哈希表并没有任何缺点,即如果表的一个槽已经包含一个值,则可以应用"某种策略"来找到另一个空槽。如果你在写作时这样做,你的读取函数需要执行模拟步骤来找到合适的读取点。
这种方法的性能实际上并不比外部溢出列表差,因为在拥有这些溢出列表的情况下,您要做的是在溢出列表中执行线性搜索。有了一个就地哈希表,你就可以执行——这取决于所选择的策略,也有点像线性探测。
这样做的一个想法是使用一组哈希键,而不是一个。(通常为2,则称为双重哈希)。如果你写了,表的槽已经被占用了,你可以使用集合中的下一个哈希键,然后再试一次,直到你的哈希键用完或找到一个空位。使用N个哈希键,您可以执行N个步骤。
对于读取,在这种情况下,您尝试找到条目,按照与写入和探测相同的顺序应用哈希键集(如果这是您需要的条目),就像探测溢出列表一样。
由于哈希表只有在填充率较低的情况下才"有意义",因此这种策略实际上节省了溢出列表实现所需的大量内存。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么指针不写入类的地址?
- CUDA:统一内存和指针地址的更改
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 如何从绝对地址的 C 样式指针创建对C++对象的引用
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- 如何使用构造函数初始化内存地址(指针变量)?
- 数组基础地址指针
- 如何在不使用返回的情况下从函数获取变量的地址(指针)
- 保存QWidgets的地址/指针
- C++ 读取内存地址/指针和偏移量
- 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不起作用
- 简单的C++地址/指针澄清
- 如何获取成员函数的地址指针
- 当“按引用传递”成为强制传递而不是按地址/指针传递时
- C++ 为什么不是同一个地址(指针)