当前位置: 首页 > 知识库问答 >
问题:

C实现堆中值函数

岳奇逸
2023-03-14

根据这里找到的答案,https://stackoverflow.com/a/10931091/1311773,我正在尝试实现两个堆,以便我可以计算出一个运行中位数。

我不熟悉堆,也不知道从哪里开始实现这里描述的这个函数。http://programmingpraxis.com/2012/05/29/streaming-median/

我的目标是创建一个小的测试程序,有效地计算运行的中间值,这样随着列表的增长,中间值就不需要从头开始重新计算。使用两个堆,我应该能够做到,我只是不知道如何开始实现它。

任何关于这方面的建议将不胜感激。

共有2个答案

毋宏茂
2023-03-14

我想这会有帮助的。谢谢。

    #include<cstdio>
    #include<iostream>
    #include<queue>
    #include <vector>         
    #include <functional>

    typedef priority_queue<unsigned int> type_H_low;
    typedef priority_queue<unsigned int, std::vector<unsigned int>, std::greater<unsigned int> > type_H_high;

    size_t signum(int left, int right) {
        if (left == right){
            return 0;
        }
        return (left < right)?-1:1;
    }

    void get_median( unsigned int x_i, unsigned int &m, type_H_low *l, type_H_high *r) {

        switch (signum( l->size(), r->size() )) {
        case 1: // There are more elements in left (max) heap
            if (x_i < m) {
                r->push(l->top());
                l->pop();
                l->push(x_i);
            } else {
                r->push(x_i);
            }
            break;

        case 0: // The left and right heaps contain same number of elements
            if (x_i < m){
                l->push(x_i);
            } else {
                r->push(x_i);
            }
            break;

        case -1: // There are more elements in right (min) heap
            if (x_i < m){
                l->push(x_i);
            } else {
                l->push(r->top());
                r->pop();
                r->push(x_i);
            }
            break;
        }

        if (l->size() == r->size()){
            m = l->top();
        } else if (l->size() > r->size()){
            m = l->top();
        } else {
            m = r->top();
        }

        return;
    }

    void print_median(vector<unsigned int> v) {
        unsigned int median = 0;
        long int sum = 0;
        type_H_low  H_low;
        type_H_high H_high;

        for (vector<unsigned int>::iterator x_i = v.begin(); x_i != v.end(); x_i++) {
            get_median(*x_i, median, &H_low, &H_high);
            std::cout << median << std::endl;
        }
    }
杨慎之
2023-03-14

std::priority_queue模板提供了堆的所有属性。恒定时间最大值或最小值提取(取决于项目的比较方式)和对数时间插入。它可以在中找到

默认情况下,priority_queue是最大堆。

int numbers[11] = { 0, 9, 3, 4, 8, 12, 2, 11, 10, 1, 5 };
std::priority_queue<int> myheap(numbers, numbers + 11);
std::cout << "biggest " << myheap.top() << std::endl; // 12
myheap.pop();
std::cout << "biggest " << myheap.top() << std::endl; // 11
myheap.push(6);
std::cout << "biggest " << myheap.top() << std::endl; // 11
myheap.push(13);
std::cout << "biggest " << myheap.top() << std::endl; // 13

下面是一个如何创建最小堆的示例:

std::priority_queue<
    int,
    std::priority_queue<int>::container_type,
    std::greater<int>
>;

要实现流式中值算法,方法如下:

  • 为小于中位数的项目创建最大堆
  • 为大于中位数的项目创建最小堆
  • 将新项目推入堆中时
    • 决定应该将其推入哪个堆,并将其推送到那里
    • 如果其中一个堆的大小大于另一个堆 1,则弹出较大的堆,并将该元素放入较小的堆中

    然后,中位数是较大堆的顶部,或者是两个堆顶部的平均值。

    如果您觉得需要手动管理堆,< code>C 提供了允许您在自己的随机访问数据结构上这样做的算法。

      < Li > < code > STD::make _ heap -堆化由迭代器endpoint指定的区域 < Li > < code > STD::push _ heap -假设前N-1个元素已经是堆,并将第N个元素合并到堆中 < li> std::pop_heap -将区域中的第一个元素放在最后一个位置,并重新定义该区域,但保留最后一个元素

 类似资料:
  • 像Max-heap和Min-heap一样,我想实现一个Median-heap来跟踪一组给定整数的中值。API应该具有以下三个功能: 我想使用一个数组(a)实现来实现堆,其中数组索引k的子元素存储在数组索引2*k和2*k 1中。为了方便起见,数组开始从索引1填充元素。这就是我到目前为止所做的:中值堆将有两个整数,以跟踪到目前为止插入的整数数量 另一种情况也是如此。我想不出如何下沉和游泳元素的算法。我

  • 本文向大家介绍C ++程序在STL中实现堆栈,包括了C ++程序在STL中实现堆栈的使用技巧和注意事项,需要的朋友参考一下 堆栈是遵循特定操作顺序的线性数据结构。订单可以是FILO(先进先出)或LIFO(先进先出) 算法 范例程式码 输出结果

  • 15.3.3.C 函数实现 我们需要新建一个C文件来存放本地代码。简单起见,我们将这个文件命名为fib.c,和刚才生成的头文件保持一致,同样放置在jni目录中。右击jni目录,选择New→File,并保存为fib.c。 Note: 在你打开C文件时,Eclipse可能会调用外部编辑器而不是在自己的编辑窗口中打开。这是因为用于Java开发的Eclipse还没有安装C开发工具的支持。要解决这个问题,你

  • 本文向大家介绍c++中虚函数的实现详解,包括了c++中虚函数的实现详解的使用技巧和注意事项,需要的朋友参考一下 前言 c++ 分为编译时多态和运行时多态。运行时多态依赖于虚函数,大部分人或许听说过虚函数是由虚函数表+虚函数指针实现的,但,真的是这样吗?虽然 c++ 规范有着复杂的语言细节,但底层实现机制却任由编译器厂商想象。(没准某种特殊的处理器电路结构原生支持虚函数,没准这个处理器压根不是冯纽曼

  • 本文向大家介绍C++ 数据结构 堆排序的实现,包括了C++ 数据结构 堆排序的实现的使用技巧和注意事项,需要的朋友参考一下 堆排序(heapsort)是一种比较快速的排序方式,它的时间复杂度为O(nlgn),并且堆排序具有空间原址性,任何时候只需要有限的空间来存储临时数据。我将用c++实现一个堆来简单分析一下。 堆排序的基本思想为: 1、升序排列,保持大堆;降序排列,保持小堆; 2、建立堆之后,将

  • 为什么我的代码在运行时会被粉碎。它表示在Push()函数中传递不兼容的指针类型。如何解决这个问题? 下面是我用C语言实现的代码。下面是我如何尝试解决这个问题的简要总结。 >