此问题专门针对哈希表,但也可能涵盖其他数据结构,例如链表或树。
例如,如果你有一个结构如下:
struct Data
{
int value1;
int value2;
int value3;
}
每个整数都是4字节对齐并按顺序存储在内存中,也是顺序存储的哈希表的键和值?如果您考虑以下因素:
std::map<int, string> list;
list[0] = "first";
第一个元素是这样的吗?
struct ListNode
{
int key;
string value;
}
如果键和值是4字节对齐并按顺序存储,那么存储下一对的位置是否重要?
链表中的节点怎么样?
只是尝试在概念上可视化,并查看内存存储的相同指南是否也适用于开放寻址散列(负载低于1)与链式散列(负载无关紧要)。
答案 0 :(得分:2)
它高度针对具体实施。由此我不仅指代编译器,CPU架构和ABI,还指代哈希表的实现。
有些哈希表使用的结构包含一个键和一个彼此相邻的值,就像你猜到的那样。其他人有一个键数组和一个值数组,因此values[i]
是keys[i]
处键的关联值。这与&#34;开放寻址与单独链接无关。问题
答案 1 :(得分:0)
哈希本身就是一种数据结构。这是你的可视化:
http://en.wikipedia.org/wiki/Hash_table
http://en.wikipedia.org/wiki/Hash_function
使用散列函数(langauge特定),将键转换为位置,并将值放在那里(在数组中)。
链接列表我不太确定,但如果它们是按顺序创建的,我会按顺序存储它们。显然,如果节点的大小增加,则需要移动它们并将指针重新定义到该点。
答案 2 :(得分:0)
通常当值不是那么大(int)时,最好将它与键组合在一起(默认情况下不应该太大),否则只保留指向它的指针。