我试图做一个最小堆1的longS IN C++使用STL make_heap等,但我比较似乎并不正确比较.以下是我目前的比较器:
struct greater1{
    bool operator()(const long& a,const long& b) const{
        return a>b;
    }
};
然而,当我std::pop_heap(humble.begin(),humble.end(),g);在那里g是一个实例greater1和humble一个堆谁使[9,15,15,25],当sort_heap被调用时,我得到一个15弹出.
我的比较器是否正确?可能出了什么问题?
编辑:
我意识到我正在运行没有比较器的sort_heap,而当我运行它这个比较器时,我得到[15,15,9,25]了sort_heap.现在我在想我的比较器肯定不起作用,但不确定原因.
1默认情况下,STL创建一个最大堆,所以我需要一个比较器.
我正在阅读CLRS第三版中的 Dijkstra算法(第662页).这是我不明白的书中的一部分:
如果图形足够稀疏 - 特别是
E = o(V^2/lg V)- 我们可以通过使用二进制最小堆实现最小优先级队列来改进算法.
图为什么要稀疏?
这是另一部分:
每个DECREASE-KEY操作都需要时间
O(log V),并且最多仍然有E这样的操作.
假设我的图形如下所示:
我想计算从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 …对于用户定义的结构,据我所知,这很容易.只是重载操作员<.但是,对于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;
       }
结果是:
        initial min …我接受了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);
}
我刚刚测试过,该方法可以根据问题正常工作.然而,受访者说,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 …
我想知道是否允许最大或最小堆树具有重复值?我一直试图通过在线资源找到有关这方面的信息是不成功的.
我想知道为什么使用the创建一个最小堆priority_queue,std::greater应该使用?
std::priority_queue<T, std::vector<T>, std::greater<T> > min_heap;
对我来说,由于最小的值总是位于堆的顶部,所以应用的类应该是 std::less
更新: 
另一方面,由于priority_queue(max heap)的默认行为是在顶部保持最大值,因此我认为std::greater应该用于最大堆创建而不是用于创建最小堆
我想通过定义自定义比较函数将一组对象存储在最小堆中.我看到有一个heapq模块可用作python发行版的一部分.有没有办法在这个模块上使用自定义比较器?如果没有,是否有其他人建立了自定义最小堆?
我有以下结构
struct node{
   float val;
   int count;
}
我有这个结构的几个对象.现在,我想将这些对象插入到STL的优先级队列中,以便优先级队列按计数对项目进行排序.有关如何这样做的任何想法?优选地,最小堆是优选的.我知道如何对原始数据类型而不是结构进行上述操作
我正在阅读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步中选择的正确性.这似乎很明显但是有一些正式的证据吗?
我想用浮点数填充二进制堆 - 更具体地说,我想实现一个小堆.
看起来漂浮物不支持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
        }
    }
}
问题是pop返回值,就像它是最大堆一样.
究竟做什么,我需要做的填充BinaryHeap与f64价值观为最小堆?