【问题标题】:Datastructure for fast and efficient search用于快速高效搜索的数据结构
【发布时间】:2014-03-09 09:17:09
【问题描述】:

我必须将排序后的数据存储在数据结构中。 我要使用的数据结构是堆或二叉搜索树。 但我很困惑哪一个更能满足要求,即快速高效的搜索。

----更多详情---

我正在设计一个应用程序,它从源(比如数据网格)接收数据,然后将其存储到数据结构中。来自数据网格站的数据是排序数字的形式。排序后的数据可以是升序或降序。

现在我必须搜索数据。并且这个过程应该是高效和快速的。

【问题讨论】:

  • 我已经检查过了。它是关于以排序形式存储数据。我的要求是高效搜索。在数据结构中搜索某些特定数据时,哪个会更好。
  • 两者都是不错的选择,使用容易实现的。如果你正在实现 BST,那么还要寻找 AVL 树(根据我的说法,BST 比堆更容易实现和使用)
  • @user3297557 拉曼在下面是正确的。对于搜索,我会使用 BST,因为它们对任意元素有更好的效率。虽然如果你需要一个最大或最小堆更好
  • 数据结构有很多种,如果可以节省内存也可以使用Trie数据结构。您可以发布您的确切要求吗?根据您的要求,我们可以选择数据结构

标签: data-structures heap binary-search-tree


【解决方案1】:

堆只会让您快速搜索最小元素(在 O(1) 时间内找到它,在 O(log n) 时间内将其删除)。如果你以另一种方式设计它,它会让你找到最大值,但你不能同时得到两者。要快速搜索任意元素(在 O(log n) 时间内),您需要二叉搜索树。

【讨论】:

  • 无论如何数据都被排序,以便他可以遍历列表,即取决于他的实现
  • 好答案。不过,我会补充说您可能想要查看平衡的二叉树,具体取决于您对数据的了解。也就是说,如果你的数据是有序的,再平衡将保持树的效率。
  • 欲了解更多信息,请参阅 algorist.com 的 Skienna 或搜索“skiena 算法设计手册 pdf”以获取可下载的第一版。
【解决方案2】:

为了有效的搜索,人们肯定更喜欢二叉搜索树。

要在堆中搜索一个值可能需要搜索整个树 - 您不能保证某个值可能不会出现在左子树或右子树上(除非其中一个子树已经大于目标值,但不保证会发生)。

所以在堆中搜索需要 O(n),而在 (self-balancing) 二叉搜索树中需要 O(log n)。

只有当您主要对查找和/或删除最小值/最大值以及插入感兴趣时,才真正首选堆。

如果给定已排序的数据,则两者都可以在 O(n) 内构建。


您提到了排序的数据结构,但是在您问题的“更多详细信息”中,我并没有真正看到需要排序的数据结构(那是您的数据的形式并不重要已经在),但这实际上取决于您将执行的查询类型。

如果您只想搜索精确值,则实际上不需要排序的数据结构,可以使用 hash table 代替,它支持预期的 O(1) 查找。

【讨论】:

  • 你可以在 O(n) 中从任意数据(不一定是排序的)构造一个堆。
  • @JimMischel 确实(和有用的注释),在撰写本文时,这似乎是一个不必要的细节,因为输入数据已经排序。
【解决方案3】:

让我列出潜在的数据结构,我们会详细说明:

  • 二叉搜索树 - 它包含已排序的数据,因此添加新元素的成本很高(我认为 O(log n))。当您搜索它时,您可以使用 O(log n) 的二进制搜索。 IT 内存效率高,不需要太多额外的内存。
  • 哈希表 (http://en.wikipedia.org/wiki/Hash_table) - 每个元素都存储有一个哈希。您可以通过提供哈希来获取元素。您的元素不需要是可排序的,它们只需要提供散列方法。访问元素是 O(1),我认为这是相当不错的 :)

我自己通常使用哈希表,但这取决于您需要存储的具体内容以及添加或删除元素的频率。

也检查一下:Advantages of Binary Search Trees over Hash Tables

所以在我看来,除了堆和二进制搜索列表,使用哈希表

【讨论】:

  • BST 需要 O(n) 内存,大多数其他结构也需要 O(n) 内存,包括哈希表 - 所以我不确定“不需要额外内存”是什么意思。在哈希表中查找需要 O(1)(不是 O(n)),但哈希表不是排序的数据结构,因此可能不符合 OP 的要求。
  • @Dukeling 你说得对,不知道我是怎么写的 :)
【解决方案4】:

我会使用带有 AVLTree 的单独链接的哈希表(我假设会发生冲突)。它会比 O(logn) 更好,其中 n 是项目数。用散列函数得到索引后,m 小于等于 n 的索引中有 m 个项目。 (它通常要小得多,但永远不会更多)。 O(1) 用于散列,O(logm) 用于在 AVLTree 中搜索。这比对已排序数据的二进制搜索要快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-27
    • 2011-10-27
    • 1970-01-01
    • 2011-05-11
    • 2018-10-12
    • 1970-01-01
    • 2015-11-10
    • 2013-06-21
    相关资源
    最近更新 更多