标签: min-heap

C++中min-heap的比较器

我试图做一个最小堆1longS IN C++使用STL make_heap等,但我比较似乎并不正确比较.以下是我目前的比较器:

struct greater1{
    bool operator()(const long& a,const long& b) const{
        return a>b;
    }
};
Run Code Online (Sandbox Code Playgroud)

然而,当我std::pop_heap(humble.begin(),humble.end(),g);在那里g是一个实例greater1humble一个堆谁使[9,15,15,25],当sort_heap被调用时,我得到一个15弹出.

我的比较器是否正确?可能出了什么问题?

编辑:
我意识到我正在运行没有比较器的sort_heap,而当我运行它这个比较器时,我得到[15,15,9,25]sort_heap.现在我在想我的比较器肯定不起作用,但不确定原因.

1默认情况下,STL创建一个最大堆,所以我需要一个比较器.

c++ heap stl min-heap comparator

22
推荐指数
2
解决办法
2万
查看次数

Dijkstra算法.最小堆作为最小优先级队列

我正在阅读CLRS第三版中的 Dijkstra算法(第662页).这是我不明白的书中的一部分:

如果图形足够稀疏 - 特别是E = o(V^2/lg V)- 我们可以通过使用二进制最小堆实现最小优先级队列来改进算法.

图为什么要稀疏?


这是另一部分:

每个DECREASE-KEY操作都需要时间O(log V),并且最多仍然有E这样的操作.

假设我的图形如下所示:

从1到6

我想计算从1到6的最短路径并使用最小堆方法.首先,我将所有节点添加到最小优先级队列.构建最小堆后,min节点是源节点(因为它与自身的距离为0).我提取它并更新其所有邻居的距离.

然后我需要调用decreaseKey距离最小的节点来创建一个新的最小堆.但是如何在恒定时间内知道它的指数呢?

节点

private static class Node implements Comparable<Node> {

    final int key;
    int distance = Integer.MAX_VALUE;
    Node prev = null;

    public Node(int key) {
        this.key = key;
    }

    @Override
    public int compareTo(Node o) {
        if (distance < o.distance) {
            return -1;
        } else if (distance > o.distance) {
            return 1;
        } else {
            return 0;
        }
    }

    @Override …
Run Code Online (Sandbox Code Playgroud)

heap dijkstra priority-queue min-heap

21
推荐指数
1
解决办法
6695
查看次数

使用stl维护最小堆的简单方法?

对于用户定义的结构,据我所知,这很容易.只是重载操作员<.但是,对于int/float等..,我真的需要重载operator <for int吗?这是我尝试过的:

       #include <iostream>
       #include <algorithm>
       #include <vector>
       using namespace std;

       bool comp(const int& a, const int& b)
       {
          return a<b?false:true;
       }

       int main () 
       {
         int myints[] = {10,20,30,5,15};
         vector<int> v(myints,myints+5);
         vector<int>::iterator it;
         make_heap(v.begin(), v.end(), comp);
         cout << "initial min heap   : " << v.front() << endl;
         for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
         cout<<endl;

         pop_heap (v.begin(),v.end());
         v.pop_back();
         for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
         cout<<endl;
       }
Run Code Online (Sandbox Code Playgroud)

结果是:

        initial min …
Run Code Online (Sandbox Code Playgroud)

c++ heap stl min-heap

19
推荐指数
3
解决办法
2万
查看次数

Java,从数组中查找Kth最大值

我接受了Facebook的采访,他们问我这个问题.

假设您有一个带有N个不同值的无序数组

$ input = [3,6,2,8,9,4,5]

实现一个找到第K个最大值的函数.

EG:如果K = 0,则返回9.如果K = 1,则返回8.

我做的是这种方法.

private static int getMax(Integer[] input, int k)
{
    List<Integer> list = Arrays.asList(input);
    Set<Integer> set = new TreeSet<Integer>(list);

    list = new ArrayList<Integer>(set);
    int value = (list.size() - 1) - k;

    return list.get(value);
}
Run Code Online (Sandbox Code Playgroud)

我刚刚测试过,该方法可以根据问题正常工作.然而,受访者说,in order to make your life complex! lets assume that your array contains millions of numbers then your listing becomes too slow. What you do in this case? 作为提示,他建议使用min heap.根据我的知识,堆的每个子值不应超过根值.因此,在这种情况下,如果我们假设3是root,那么6是它的子节点,它的值比root的值更大.我可能错了,但您的想法是什么,它的实现基于min heap …

java arrays algorithm min-heap

19
推荐指数
2
解决办法
9924
查看次数

最大/最小堆树可以包含重复值吗?

我想知道是否允许最大或最小堆树具有重复值?我一直试图通过在线资源找到有关这方面的信息是不成功的.

java binary-tree min-heap heapsort max-heap

17
推荐指数
2
解决办法
2万
查看次数

使用`std :: greater`通过`priority_queue`创建最小堆的原因

我想知道为什么使用the创建一个最小堆priority_queue,std::greater应该使用?

std::priority_queue<T, std::vector<T>, std::greater<T> > min_heap;
Run Code Online (Sandbox Code Playgroud)

对我来说,由于最小的值总是位于堆的顶部,所以应用的类应该是 std::less

更新: 另一方面,由于priority_queue(max heap)的默认行为是在顶部保持最大值,因此我认为std::greater应该用于最大堆创建而不是用于创建最小堆

c++ heap priority-queue min-heap c++11

16
推荐指数
2
解决办法
2846
查看次数

python中的最小堆

我想通过定义自定义比较函数将一组对象存储在最小堆中.我看到有一个heapq模块可用作python发行版的一部分.有没有办法在这个模块上使用自定义比较器?如果没有,是否有其他人建立了自定义最小堆?

python heap object min-heap

11
推荐指数
2
解决办法
7266
查看次数

用户定义类型的优先级队列

我有以下结构

struct node{
   float val;
   int count;

}
Run Code Online (Sandbox Code Playgroud)

我有这个结构的几个对象.现在,我想将这些对象插入到STL的优先级队列中,以便优先级队列按计数对项目进行排序.有关如何这样做的任何想法?优选地,最小堆是优选的.我知道如何对原始数据类型而不是结构进行上述操作

c++ priority-queue min-heap

11
推荐指数
3
解决办法
3万
查看次数

证明使用min-heap合并k个排序列表的算法

我正在阅读CLRS并且在练习6.5-8时遇到了一些问题.

给出一个O(n lg k)时间算法,将k个排序列表合并为一个排序列表,其中n是所有输入列表中元素的总数.(提示:使用min0heap进行k-way合并.)

正如大家所说,解决方案是,

1)使用k列表的第一个元素构建k元素min-heap,

2)extract-min()从堆中获取最小元素并将其附加到结果列表中,

3)从与堆中提取的列表相同的列表中选择下一个元素.将其插入堆中并转到2).

我可以理解时间是O(n lg k),但我没有得到第3步中选择的正确性.这似乎很明显但是有一些正式的证据吗?

algorithm min-heap

10
推荐指数
1
解决办法
7463
查看次数

如何使用Rust的BinaryHeap实现f64的最小堆?

我想用浮点数填充二进制堆 - 更具体地说,我想实现一个小堆.

看起来漂浮物不支持Ord,因此不能开箱即用.到目前为止,我试图包装它们的尝试失败了.然而,似乎如果我可以包装它们,那么我也可以Ord以这样的方式实现它将有效地创建BinaryHeap一个小堆.

这是我尝试的包装器的一个例子:

#[derive(PartialEq, PartialOrd)]
struct MinNonNan(f64);

impl Eq for MinNonNan {}

impl Ord for MinNonNan {
    fn cmp(&self, other: &MinNonNan) -> Ordering {
        let ord = self.partial_cmp(other).unwrap();
        match ord {
            Ordering::Greater => Ordering::Less,
            Ordering::Less => Ordering::Greater,
            Ordering::Equal => ord
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是pop返回值,就像它是最大堆一样.

究竟做什么,我需要做的填充BinaryHeapf64价值观为最小堆?

min-heap rust

10
推荐指数
2
解决办法
2124
查看次数