我在多个位置读取二进制树应该优先于内存受限的哈希表,因为二进制树会将数据保持在排序顺序,而哈希表则不会。与哈希表的情况下的常量时间插入和查找相比,权衡是二叉树将具有O(log n)查找和插入。
我想知道我是否选择二叉树来实现我的地址簿(总是排序),键应该是什么样的?值是名称和号码对吗?
答案 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片叶子。