c++ - 随机访问 HashMap 值

标签 c++ c

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

实现此目的的一种方法是将 HashMap 与数组结合使用,但是如果使用 HashMap ,随机访问 HashMap 值的最佳方法是什么,即不生成 key 。

最佳答案

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

您可以做到这一点,例如,通过实现一个 HashMap ,该映射将另外包含一个指向其成员的指针数组。然后,您可以将随机访问运算符转换为该数组,并在每次插入或删除时维护它(这当然是一个普遍的想法,省略了一些实现细节)。

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

我会说你的问题听起来像是一些算法的类(class)作业。你为什么要在现实生活中这样做?您要解决的问题是什么?

编辑

在评论中,您将问题表述为:

what's the best way to design such a container, which can support randomized value access? but the container has to support other operations, such as insert key/value pairs and remove by key, with the best possible performance.

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

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

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

有时,如果没有额外的内存,您就无法在 O(1) 中完成。有时你可以在 O(1) 中使用额外的 O(n) 内存,但如果你在 O(lg n) 时间上妥协,你可以使用 O(lg n) 内存来完成它。您必须权衡取舍,我不知道。

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

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

游戏名称?权衡取舍。

关于c++ - 随机访问 HashMap 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7562232/

相关文章:

c - 添加到 from 目录的链表数组

c - 我怎么知道c中指针变量的分配内存大小

c++ - CMake : can't find my header file in a different directory

c++ - 是否定义了sprintf(b, “%”)?

c - 使用 Create/ReadFile 写入文件内容 - C

c++ - 通过引用或指针传递 vector

c# - 寻找 GSM 短信组件/ActiveX

c++ - 在同一台机器上运行两个 IncrediBuild?

c++ - -fobjc-arc 不支持脆弱的 abi

c++ - 当我运行C++程序时,它返回某种数字