搜索堆中的元素

时间:2010-03-03 16:26:40

标签: algorithm data-structures heap big-o

我记得堆可用于搜索元素是否在其中,并且具有O(logN)时间复杂度。但突然间我无法得到细节。我只能找到getmin delete add等等。

任何人都可以提示吗?

6 个答案:

答案 0 :(得分:45)

您需要搜索堆中的每个元素,以确定元素是否在内部。

虽然可以进行一次优化(我们假设这里有一个最大堆)。如果到达的节点的值小于要搜索的元素的值,则无需从该节点进一步搜索。但是,即使进行了这种优化,搜索仍然是O(N)(需要平均检查N / 2个节点)。

答案 1 :(得分:1)

为时已晚,但仍为可能偶然在这里碰到的人添加。

按原样在堆中搜索将需要O(N)时间。 但是,如果您可以进行一次预处理以按顺序弹出数组中的所有元素,那么您将获得O(N.logN)中的排序数组。实际上是堆排序。 现在,您可以在O(logN)时间内搜索新排序的数组。

答案 2 :(得分:0)

我认为您正在寻找的是BST(二叉搜索树)。

答案 3 :(得分:0)

向堆的值添加索引可以解决此问题。在python中,可以借助字典来完成。每次在最小堆中执行操作时,都会更新字典中节点的索引。

仅当最小堆的长度很大并且要在最小堆中搜索多次时,才应实现此目的。跟踪索引需要一些开销,但这将使程序的速度至少提高50-60%。

答案 4 :(得分:0)

正如其他人所提到的,PriorityQueue中的搜索是线性的,因为它没有关于在堆的根以外寻找特定键的概念。这是BST与BST的主要区别,在BST中,您始终会根据要搜索的值向左或向右移动。在堆中,最小的总是在根上,子项可以在左或右子树上。

但是,您可以修改PriorityQueue以保留其他索引数组,该索引数组将索引k映射到其在堆数组中的位置。这将允许以下操作:

void insert(int k,Item item)插入项目并将其与k关联,以便以后可以通过k直接访问它

Item get(k)返回与索引k关联的项目。这可以在堆中的任何地方。

void change(int k,Item item)将与k关联的项目更改为item。这将需要“重新堆砌”以确保维持堆顺序。

该实现有些棘手,因为您需要确保堆和索引数组始终位于接收器中并指向正确的对象。如果您已经知道如何实现常规堆,请尝试添加索引数组,并查看需要进行哪些更改以保持正确的顺序。这是完整的实现https://algs4.cs.princeton.edu/24pq/IndexMinPQ.java.html

答案 5 :(得分:0)

我对它有点困惑,只是为了说清楚,对于堆(尚未排序),如果你想搜索一个项目,那么它会像一个未排序的数组一样需要 O(n),但如果它是堆排序的,那么这意味着数组已经排序,因此在这种情况下,将需要 O(log n)(二分搜索)来搜索项目。