我必须将已排序的数据存储在数据结构中。 我想要使用的数据结构是堆或二进制搜索树。 但我很困惑哪一个更能满足要求,即快速有效的搜索。
----更多细节---
我正在设计一个从源(比如数据网格)接收数据然后将其存储到数据结构中的应用程序。来自数据GRID站的数据采用排序数字的形式。排序后的数据可以按升序或降序排列。
现在我必须搜索数据。这个过程应该高效快捷。
答案 0 :(得分:6)
堆只允许您快速搜索最小元素(在O(1)时间内找到它,在O(log n)时间内删除它)。如果你以另一种方式设计它,它会让你找到最大值,但是你没有得到它们。要快速搜索任意元素(在O(log n)时间内),您将需要二叉搜索树。
答案 1 :(得分:3)
为了有效搜索,人们肯定更喜欢二叉搜索树。
要在堆中搜索值,可能需要搜索整个树 - 您无法保证某些值可能不会出现在左侧或右侧子树中(除非其中一个子项已经大于目标价值,但不保证会发生这种情况。)
因此在堆中搜索需要O(n),其中 - 在(self-balancing)二叉搜索树中需要O(log n)。
如果您主要关注查找和/或删除最小/最大值以及插入,那么堆只是首选。
如果您已经获得已经排序的数据,则可以在O(n)中构建。
你提到了一个排序的数据结构,但在你问题的“更多细节”中,我并没有真正看到需要一个排序的数据结构(这与你的数据的形式无关紧要)已经在,但它确实取决于你将要做什么类型的查询。
如果您只是要搜索确切的值,则实际上并不需要排序的数据结构,而是可以使用hash table来代替预期的O(1)查找。
答案 2 :(得分:1)
让我列出潜在的数据结构,我们将详细说明:
我自己通常使用哈希表,但这取决于您需要存储的内容以及添加或删除元素的频率。
另请检查:Advantages of Binary Search Trees over Hash Tables
所以我认为在堆和二进制搜索列表之外,使用哈希表。
答案 3 :(得分:1)
我会使用与AVLTree单独链接的哈希表(我假设发生冲突)。它将比O(logn)更好地工作,其中n是项目数。在获得具有散列函数的索引之后,m个项将在该索引中,其中m小于或等于n。 (它通常要小得多,但永远不会更多)。 O(1)用于散列,O(logm)用于在AVLTree中搜索。这比排序数据的二进制搜索更快。