设计这种支持随机值访问的容器的最佳方法是什么?但容器必须支持其他操作,例如插入键/值对和按键删除,并具有最佳的时间性能。
实现此目的的一种方法是将 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.
我的上述建议成立,但问题是权衡是什么。如果“最佳性能”是时间方面的,那么我对数组的建议就是这样。如果最好的性能是内存方面的,那么遍历树会给你那个,这是我的另一个建议。
一般来说,当你需要设计一个新的数据结构时,你需要回答以下问题:
- 需要哪些操作?
- 每个操作所需的时间复杂度是多少?
- 该结构所需的内存复杂度是多少?
- 内存和时间哪个更重要?
有时,如果没有额外的内存,您就无法在 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/