哈希表(地图)如何存储在内存中?

时间:2013-08-23 21:36:09

标签: memory data-structures tree linked-list hashtable

此问题专门针对哈希表,但也可能涵盖其他数据结构,例如链表或树。

例如,如果你有一个结构如下:

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)与链式散列(负载无关紧要)。

3 个答案:

答案 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)时,最好将它与键组合在一起(默认情况下不应该太大),否则只保留指向它的指针。