支线任务8——寻找中位数

题目描述

用以下的一个类实现两个函数

  • void addNum(int num) - Add a integer number from the data stream to the data structure.
  • double findMedian() - Return the median of all elements so far.
class MedianFinder {
public:

    // Adds a number into the data structure.
    void addNum(int num) {

    }

    // Returns the median of current data stream
    double findMedian() {

    }
};

// Your MedianFinder object will be instantiated and called as such:
// MedianFinder mf;
// mf.addNum(1);
// mf.findMedian();

要实现的功能是能够输出中位数

由于数据结构刚讲过排序,这个动态的查找中位数让我联想起堆在调整方面的优势。在LeetCode的讨论区内,也是以这种方法为主导(https://leetcode.com/discuss/73981/using-two-heaps-both-big-heap-and-small-heap),我大致试了一下,发现用堆实际速度比较慢。原因可能是有无谓的出队入队浪费了时间。

尝试了一下,发现用vector直接二分查找插入速度可以提高,其复杂度为 Nlog(N)+N2/4,不失为简单但是高效的算法。代码如下:

class MedianFinder {
public:
    // Adds a number into the data structure.
    void addNum(int num) {
        if(!data.size())
        {
            data.push_back(num);
            return;
        }
        int middle;
        int min = 0;
        int max = data.size()-1;
        while(min <= max)
        {
            middle = (min+max)/2;
            if(data[middle] > num)
                max = middle - 1;
            else
                min = middle + 1;
        }
        vector<int>::iterator it = data.begin();
        data.insert(it+min, num);
    }

    // Returns the median of current data stream
    double findMedian() {
        return (data[data.size()/2]+data[(data.size()-1)/2])/2.0;
    }
    vector<int>data;
};

其实有时候不一定忽视简单常用的数据结构,其受到广泛使用一方面也说明了这种结构的强某些功能的强大

时间: 2024-12-20 10:23:22

支线任务8——寻找中位数的相关文章

快慢指针实现不依赖计数器寻找中位数(linked list)

该方法在不借助计数器变量实现寻找中位数的功能.原理是:快指针的移动速度是慢指针移动速度的2倍,因此当快指针到达链表尾时,慢指针到达中点.程序还要考虑链表结点个数的奇偶数因素,当快指针移动x次后到达表尾(1+2x),说明链表有奇数个结点,直接返回慢指针指向的数据即可.如果快指针是倒数第二个结点,说明链表结点个数是偶数,这时可以根据"规则"返回上中位数或下中位数或(上中位数+下中位数)的一半. while (fast&&slow)  {  if (fast->next

有序数组寻找中位数以及寻找K大元素

问题描述: 两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n)).转化成找到两个数组的第K大数字进行解决 解题方法: 对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] , 若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2如果我们可以在两个数列中求出第K小的元素,便可以解决该问题不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素取A[k / 2] B[k / 2]

10G整数文件中寻找中位数或者第K大数

来源:http://hxraid.iteye.com/blog/649831 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). 分析: 既然要找中位数,很简单就是排序的想法.那么基于字节的桶排序是一个可行的方法 (请见<桶排序 >): 思想:将整形的每1byte作为一个关键字,也就是说一个整形可以拆成4个keys,而且最高位的keys越大,整数越

寻找中位数v1.0

题目内容: 编写一个函数返回三个整数中的中间数.函数原型为: int mid(int a, int b, int c); 函数功能是返回a,b,c三数中大小位于中间的那个数. 输入格式: "%d%d%d" 输出格式:"The result is %d\n" 输入样例1: 12 6 18 输出样例1:The_result_is_12 输入样例2:-9 7 -2 输出样例2: The_result_is_-2 1 #include <stdio.h> 2 i

支线任务8-Find Median from Data Stream(中位数问题)

一.题目描述 Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value. Examples: [2,3,4] , the median is 3 [2,3], the median is (2 + 3) / 2 = 2.5 Des

海量数据查找中位数

现在 有10亿个int型的数字(JAVA中 int 型占4B),以及一台可用内存为1GB的机器,如何找出这10亿个数字的中位数? 中位数定义:数字排序之后,位于中间的那个数.比如将10亿个数字进行排序(位置从1到10亿),排序之后,位于第5亿个位置的那个数 就是中位数. 关于中位数,可参考:快速排序中的分割算法的解析与应用 一种方法是定义一个长度为10亿的整型数组,采用排序算法排序.但是: 10亿个数字,每个数字在内存中占4B,10亿个数字完全加载到内存中需要:10*108*4B ,约为:4GB

[算法导论 Ch9 中位数和顺序统计量] Selection in O(n)

1. 寻找第k大(小)的数 假设数据存储在数组a[1..n]中 首先,寻找一个数组中最大或者最小的数,因为最大(小)的数一定要比其他所有的数大(小),因此至少要比较完所有的pair才能确定,所以时间复杂度在O(n).那么寻找第k大(小)呢? 比较直观的,就是对数组中国所有的数据先进行排序,在我们这种渣渣的计算机入门选手而言,可选的有QuickSort,MergeSort和HeapSort,甚至是ShellSort等一些比较高级的方法啊...一般的代价都在O(n*logn)上,然后直接取出即可.

两个有序数组的中位数(第k大的数)

问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 感觉这种题目挺难的,尤其是将算法完全写对.因为当初自己微软面试的时候遇到了,但是没有想出来思路.看网上写了一堆解法,但是将思路说得非常清楚的少之又少. 有两种思路,一个是算法导论里面的,一个是求解k大元素.建议使用下面第二种思路,代码少不容易出错. 下面的内容摘自:https://blog.csdn.net/hackbuteer1/article/details/7584838 求解中位数,算

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

本文索引目录: 一.PTA实验报告题1 : 二分查找 1.1 实践题目 1.2 问题描述 1.3 算法描述 1.4 算法时间及空间复杂度分析 二.PTA实验报告题2 : 改写二分搜索算法 2.1 实践题目 2.2 问题描述 2.3 算法描述 2.4 算法时间及空间复杂度分析 三.PTA实验报告题3 : 两个有序序列的中位数 3.1 实践题目 3.2 问题描述 3.3 算法描述 3.4 算法时间及空间复杂度分析 四.实验心得体会(实践收获及疑惑) 一.PTA实验报告题1 : 二分查找 1.1 实践