随机访问哈希映射值

Random access to hash map values

本文关键字:映射 哈希 访问 随机      更新时间:2023-10-16

设计这样一个可以支持随机值访问的容器的最佳方法是什么?但是容器必须支持其他操作,例如插入键/值对和按键删除,以获得最佳的时间性能。

一种方法是将哈希映射与数组结合使用,但是如果使用哈希映射,对哈希映射值进行随机访问的最佳方法是什么,即不生成键

如果你谈论的是数据结构,而不是现有的语言支持-那么你只需要设计一个数据结构来支持它。

可以这样做,例如,通过实现一个哈希映射,该哈希映射将另外保存一个指向其成员的指针数组。然后,您可以将随机访问操作符转换为该数组,并在每次插入或删除时维护该数组(这当然是一般的想法,省略了一些实现细节)。

一些语言支持通过迭代器遍历数据结构。虽然在迭代器上循环随机次数并不是真正的随机访问(性能方面),但它会在更长的时间内给出相同的结果。

我觉得你的问题听起来像是一些算法的课程作业。你为什么想在现实生活中这么做?你想要解决的问题是什么?

编辑

在评论中你将问题表述为:

设计这样一个容器的最好方法是什么,它可以支持随机值访问?但是容器必须支持其他操作,例如插入键/值对和按键删除最佳性能。

我上面的建议是成立的,但问题是什么是权衡。如果"最佳性能"是时间方面的,那么我对数组的建议就是这样。如果最好的性能是内存方面的,那么在树上迭代会给你,这是我的另一个建议。

一般来说,当你需要设计一个新的数据结构时,你需要回答以下问题:

  1. 需要哪些操作?
  2. 每次操作所需的时间复杂度是多少?
  3. 结构所需的内存复杂度是多少?
  4. 记忆和时间,哪个更重要?

如果没有额外的内存,有时你无法在0(1)中完成任务。有时候你可以用额外的O(n)内存在O(1)内完成,但如果你在O(lgn)时间上做出妥协,你也可以用O(lgn)内存来完成。有些取舍是你必须做出决定的,我不知道。

所以我的第一个建议(将BST或哈希与指向其节点的指针数组结合)以BST/哈希操作的标准复杂度执行BST (map)或哈希的所有操作,并以标准复杂度执行数组的所有读取操作(即:在O(1)时间内随机访问)。数组的写操作将具有map/hash的复杂度,并且额外的内存占用为O(n)。

我的第二个建议没有额外的内存占用,但是"随机"访问是伪随机的:你可以迭代到你想要的点,而不是直接访问它。这将使您的随机访问在O(n),而零额外的编码,或浪费内存。

游戏名称?权衡。

如果您只是想检查unrederd_map的键部分,请使用它的迭代器。

如果您的意思是"不插入新元素",那么find()[]的首选方法:

if (auto it = mymap.find("joe") != mymap.end())
{
  make_phone_call(it->second);
}

这对于有序和无序映射是特殊的,它们在关联容器中是唯一的,可以提供侵入式的[] -操作符。

对于无序映射,查找时间平均为常数。