【问题标题】:Useful data structure for the following case以下情况的有用数据结构
【发布时间】:2011-05-16 19:42:49
【问题描述】:

对于以下情况,哪种数据结构可能是最好的。

1.应该有搜索、插入、删除等操作。大多数搜索活动将在那里。大约 90% 的操作将是搜索,其余是删除和插入。

2 插入,删除和搜索将基于对象的键。每个键将指向一个对象。键将被排序。

任何关于最佳数据结构的建议都将受到高度赞赏。

【问题讨论】:

  • “最佳”?你想优化什么?时间?内存使用?代码行数?
  • @S.Lott,有一个经验法则我来自哪里,当有疑问时,“最佳”是头韵的衡量标准,因此链表通常是正确的答案。跨度>
  • “密钥将被排序”是什么意思?他们是按排序顺序进来的?您想按排序顺序遍历它们吗?
  • @davin:好点子。我花了很长时间为“大型内部 IT”工作,其中最佳意味着“使用我们已经许可的 RDBMS”。我不能很好地解决这个问题。

标签: algorithm data-structures


【解决方案1】:

AVL 树,或者至少是 BST。

如果您想经常访问相同的元素,您可能还需要考虑展开树。

(我应该解释一下原因吗?)

【讨论】:

  • 这些 AVL 和 Splay 树都非常适合内存结构,但在磁盘上往往表现不佳(或难以以最佳方式实现)。对于面向块的媒体,B*tree 很难被击败
  • AVL 树的三个操作的复杂度保证为 O(log n),但很难正确实现(网上有很多很好的例子)。展开树是 AVL 树,其设计目的是将结构的最后访问元素放在树的根部(因此在 O(1) 中可访问)最好在您经常搜索相同的事物时使用,因为访问的事物最近保持在顶部附近。
【解决方案2】:

不确定你所说的“数据结构”是什么意思

我建议MySQL。 在这里阅读更多:WikiPedia

【讨论】:

  • 对于数据结构,他很可能是指内存中的结构,如数组、列表、字典、树、堆等。
  • 哦,好酷!我以为。但是当他提到“操作”时,我想到了 DB。谢谢!
【解决方案3】:

自平衡排序树(AVL、RB)或哈希表。

【讨论】:

    【解决方案4】:

    我的猜测是你想优化时间。总体而言,red-black tree 在所有三个操作中都将具有对数时间性能。这可能是您在执行时间上最好的整体赌注;然而,红黑树实现起来很复杂,并且需要一个节点结构,这意味着它们将使用比包含的数据本身需要的更多内存来存储。

    【讨论】:

    • 很少有数据结构不使用比数据本身更多的内存。
    【解决方案5】:

    你想要一个树支持的地图;基本上,您只需要一个树,其中节点通过键动态排序(“自平衡”),您的对象使用相应的键悬挂在每个节点上。

    如果您想要一个“最佳”数据结构,这完全取决于您期望的输入模式的分布。自平衡树的好处是你不需要太在意输入的模式。如果您真的想要我们所知道的尽可能接近最优的最佳猜测,并且您对特定的查询序列知之甚少,则可以使用http://en.wikipedia.org/wiki/Tango_tree,即O(log(log(N))-competitive。它增长得如此缓慢,以至于从所有实际目的来看,你所拥有的东西的性能并不比你可能选择的最佳数据结构中的一个常数因子差。

    尽管实现起来有些蹩脚,但最好使用一个库来实现自平衡树。

    Python: https://github.com/pgrafov/python-avl-tree/

    Java: 如果您只是 Java,只需使用 TreeMap(基于红黑树)并忽略实现细节。大多数语言的标准库中都有类似的数据结构。

    【讨论】:

    • 但是我从维基百科的文章中得知它不支持删除和插入。仅对静态数据有用。但我也需要那些删除和插入操作。
    • 抱歉,在您发表评论之前我的编辑似乎没有完成:根据您的语言,有很多工具可以满足您的需求。我给出了 Python 和 Java 的例子。
    猜你喜欢
    • 1970-01-01
    • 2012-08-20
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多