我必须在查找表中存储有关内容的信息,以便可以非常快速地访问它。我可能需要递归地引用查找表中的一些元素以获取有关内容的完整信息。什么是更好的数据结构使用:
我希望我的软件能够健壮,好像我们遇到任何崩溃一样,这对我的产品来说将是灾难性的。
答案 0 :(得分:2)
这取决于您拥有的按键范围。
通常,当你说查找表时,你的意思是一个可以直接索引的小表(O(1))。作为一个愚蠢的例子,对于substitution cipher,您可以使用char cipher[256]
并使用字符的ASCII代码进行索引以获取替换字符。如果键是复杂的对象或者太多,你可能会遇到一张地图。
您可能还会考虑哈希表(请参阅unordered_map
)。
回复:强>
如果密钥本身可以是任何32位数字,那么存储一个非常稀疏的40亿元素数组是没有意义的。
但是如果你的密钥本身介于0..10000之间,那么你可以拥有一个10000元素的数组,其中包含指向对象(或对象本身)的指针,只有2000-5000个元素包含非空指针(或分别有意义的数据)。访问将是O(1)。
如果你有大钥匙,那么我可能会选择unordered_map
。使用map
的5000个元素,你会得到O(log n)意味着大约12次访问,哈希表应该是一个或两个访问顶部。
我不熟悉完美的哈希,所以我不能就它们的实现提出建议。如果您确实选择了这一点,我将非常感谢能够牢记一两个想法的链接。
答案 1 :(得分:0)
std::map
中的查找时间应为O=ln(n)
,在最差情况O=n
中,在静态数组中进行线性搜索。
我强烈选择std::map
,即使它有更大的内存占用(在大多数情况下这无关紧要)。
你也可以制作“地图地图”甚至更深的结构:
typedef std::map<MyKeyType, std::map<MyKeyType, MyValueType> > MyDoubleMapType;