Memory 哈希表(映射)如何存储在内存中?

Memory 哈希表(映射)如何存储在内存中?,memory,data-structures,tree,linked-list,hashtable,Memory,Data Structures,Tree,Linked List,Hashtable,这个问题专门针对哈希表,但也可能涉及其他数据结构,如链表或树 例如,如果您有如下结构: struct Data { int value1; int value2; int value3; } 每个整数是4字节对齐的,并按顺序存储在内存中,哈希表的键和值也是按顺序存储的吗?如果你考虑以下内容: std::map<int, string> list; list[0] = "first"; 如果键和值是4字节对齐并按顺序存储的,那么下一对的存储位置是否重要 那链表中

这个问题专门针对哈希表,但也可能涉及其他数据结构,如链表或树

例如,如果您有如下结构:

struct Data 
{
   int value1;
   int value2;
   int value3;
}
每个整数是4字节对齐的,并按顺序存储在内存中,哈希表的键和值也是按顺序存储的吗?如果你考虑以下内容:

std::map<int, string> list;
list[0] = "first";
如果键和值是4字节对齐并按顺序存储的,那么下一对的存储位置是否重要

那链表中的节点呢


只是尝试从概念上对其进行可视化,并查看内存存储的相同准则是否也适用于开放寻址散列(负载低于1)和链式散列(负载无关紧要)

它是高度特定于实现的。我所指的不仅仅是编译器、CPU架构和ABI,还有哈希表的实现。
一些哈希表使用一个结构,其中包含一个键和一个值,它们彼此相邻,就像您所猜测的那样。其他的有一个键数组和一个值数组,因此
values[i]
keys[i]
处键的关联值。这与“开放寻址与独立链接”问题无关。

散列本身就是一种数据结构。以下是您的可视化:

使用散列函数(特定于langauge),将键转换为位置,并将值放置在那里(在数组中)


链接列表我不太确定,但如果它们是按顺序创建的,我想它们是按顺序存储的。显然,如果节点的大小增加,则需要移动节点并将指针重新定义到该点。

通常当值不是那么大(int)时,最好将其与键(默认情况下不应太大)组合在一起,否则只保留指向它的指针

谢谢你,这就清楚了。本质上,它取决于许多不同的变量
struct ListNode
{
   int key;
   string value;
}