随机访问哈希映射值

时间:2011-09-26 22:45:24

标签: c++ c

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

我会说你的问题听起来像一些算法的课程作业。你为什么要在现实生活中做到这一点?你试图解决的问题是什么?

修改

在评论中,您将问题称为:

  

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

我的建议如上所述,但问题是什么是权衡。如果“最佳性能”是时间性的,那么我对阵列的建议就是给你的。如果最佳性能是记忆性的,那么迭代树就会给你这个,这是我的另一个建议。

通常,当您需要设计新的数据结构时,您需要回答以下问题:

  1. 需要什么操作?
  2. 所需的时间复杂度是多少,每次操作都需要
  3. 结构所需的内存复杂性是什么?
  4. 哪个更重要,记忆还是时间?
  5. 有时你不能在没有额外记忆的情况下在O(1)中做。有时您可以在O(1)中使用额外的O(n)内存,但如果您在O(lg n)时间内妥协,则可以使用O(lg n)内存。你需要做出权衡取舍,我不知道。

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

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

    游戏名称?权衡。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

这特别适用于有序和无序映射,这些映射在用于提供侵入式[] - 运算符的关联容器中是唯一的。

对于无序地图,查找时间平均为常数。