使用二叉树的字典实现

时间:2011-11-15 19:51:27

标签: c++ dictionary binary-tree

我在多个位置读取二进制树应该优先于内存受限的哈希表,因为二进制树会将数据保持在排序顺序,而哈希表则不会。与哈希表的情况下的常量时间插入和查找相比,权衡是二叉树将具有O(log n)查找和插入。

我想知道我是否选择二叉树来实现我的地址簿(总是排序),键应该是什么样的?值是名称和号码对吗?

4 个答案:

答案 0 :(得分:3)

BTree!=二叉树。我猜你的意思是后者。

地址簿的外观取决于您要执行的查找。如果要查找给定姓名的人的地址,则键是名称,地址/数字是值。

如果要从地址到名称进行查找,则只需反转键和值即可。如果您想要双向查找,则每个地址簿需要两棵树。

请注意,基于二进制树的词典在C ++标准库中可用作标题std::map中的<map>。除非你想进行编程练习,否则不要自己动手; std::map在性能和功能方面很难被击败。

答案 1 :(得分:2)

在考虑地址簿这样的内容时,数据的使用方式(查找)应该优先于数据的存储方式(物理上存储在内存中)。

如果您的名字是关键,那将如何存储? “First Last”,“Last,First”等。这将影响查找的执行方式。如果您想按号码查询(例如,如果您开始输入电话号码并希望弹出匹配的联系人)该怎么办?

我建议您真正考虑如何使用通讯录,这样在您完全理解要求之前,不要无意中将自己束缚于某些实现。

鉴于此,我看看boost::multi_index。该库提供了一组数据结构,可用于存储数据一次,并为其提供任意数量的“查找键”。对于像这样的案件非常方便。

答案 2 :(得分:0)

我认为关键只是名字。数字是值。你按名字搜索,对吧?

而且,如果您想获得良好的性能,请使用AVL树。这样,所有子树都具有相同的(±1)深度。

答案 3 :(得分:0)

对于字典,类型trie和数据结构二叉树是一个不错的选择。它也是一个名称暴击树,基数树或帕特里夏树。具有散列键的简化trie是kart-trie,其中散列用于定义左和右,但是它的数据结构仍然是二叉树。然后是三元组,但它的数据结构来自B树,它有3片叶子。