随机访问哈希映射值
Random access to hash map values
设计这样一个可以支持随机值访问的容器的最佳方法是什么?但是容器必须支持其他操作,例如插入键/值对和按键删除,以获得最佳的时间性能。
一种方法是将哈希映射与数组结合使用,但是如果使用哈希映射,对哈希映射值进行随机访问的最佳方法是什么,即不生成键
如果你谈论的是数据结构,而不是现有的语言支持-那么你只需要设计一个数据结构来支持它。
可以这样做,例如,通过实现一个哈希映射,该哈希映射将另外保存一个指向其成员的指针数组。然后,您可以将随机访问操作符转换为该数组,并在每次插入或删除时维护该数组(这当然是一般的想法,省略了一些实现细节)。
一些语言支持通过迭代器遍历数据结构。虽然在迭代器上循环随机次数并不是真正的随机访问(性能方面),但它会在更长的时间内给出相同的结果。
我觉得你的问题听起来像是一些算法的课程作业。你为什么想在现实生活中这么做?你想要解决的问题是什么?
编辑
在评论中你将问题表述为:
设计这样一个容器的最好方法是什么,它可以支持随机值访问?但是容器必须支持其他操作,例如插入键/值对和按键删除最佳性能。
我上面的建议是成立的,但问题是什么是权衡。如果"最佳性能"是时间方面的,那么我对数组的建议就是这样。如果最好的性能是内存方面的,那么在树上迭代会给你,这是我的另一个建议。
一般来说,当你需要设计一个新的数据结构时,你需要回答以下问题:
- 需要哪些操作?
- 每次操作所需的时间复杂度是多少?
- 结构所需的内存复杂度是多少? 记忆和时间,哪个更重要?
如果没有额外的内存,有时你无法在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);
}
这对于有序和无序映射是特殊的,它们在关联容器中是唯一的,可以提供侵入式的[]
-操作符。
对于无序映射,查找时间平均为常数。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 如何在 perl 中将多维映射从 c++ 转换为哈希
- 如何按值对无序哈希映射进行排序
- 哈希映射如何在 c++ 中实现?
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- C++中的哈希映射等效
- 以字符串向量作为值的哈希映射
- 来自并发哈希映射的迭代器是否安全
- 如何在这个哈希映射中实现 AVL 树
- 无法迭代结构"string"的哈希映射:[列表] C++
- 什么是最快的解决方案,用于读/写入哈希映射
- 可以安全地依赖unordered_map中的初始化值(哈希映射)
- 使用按插入方式排序的参数创建哈希映射
- C 11多态映射键静态断言失败:哈希函数必须与密钥类型的参数无关
- 哈希映射没有可行的重载 '='
- 在映射中获取已知哈希输出的值
- C++中的线程安全、有序映射/哈希