Algs4-2.4.30动态中位数查找

2.4.30动态中位数查找。设计一个数据类型,支持在对数时间内插入元素,常数时间内找到中位数并在对数时间内删除中位数。提示:用一个面向最大元素的堆再用一个面向最小元素的堆。

解:设初始有2N或2N+1个元素,设有一个大堆和一个小堆,
    大堆堆顶元素为max,小堆堆顶元素为min,中位数元素mid指向null,待插入堆的元素为new。

1)初始化:
  先将前N个元素插入到大堆。
 
 将第N+1个元素到第2N个元素对每个元素new插入到大堆,插入时进行如下操作:
a)IF max<=new THEN
    new插入到小堆。
  ELSEIF max>new THEN
    max插入到小堆,
    大堆中删除堆顶元素max,
    new插入到大堆。
  END IF
 
   
  如果有第2N+1个元素,那么
b)IF max<=new<=min THEN
      mid=new
  ELSEIF max<=new>=min THEN
      mid=min
      小堆中删除min
      new插入到大堆
  ELSEIF max>=new (AND max<=min 堆已满足这个条件) THEN
      mid=max
      大堆中删除max
      new插入到大堆
  END IF

2)返回中位数
  如果mid=null,返回(max+min)/2
  否则返回mid

3)插入新元素new 
   插入新元素new后,要保持两个堆的元素个数相同。
   在插入新素前,两个堆的元素个数是相同的,因为初始化、插入、删除中位数 时就是保证了这一点。
   当 mid=null时,插入新元素使用(b)步的方法。
   当 mid<>null时,将mid插入到大堆,mid置为null,然后插入新元素按(a)步的方法。

4)删除元素mid时
  删除元素mid后,要保持两个堆的元素个数相同。
  在删除前,两个堆的元素个数是相同的,因为初如化、插入、删除中位数 时就保证了这一点。
  当mid<>null时,将mid直为null。
  当mid=null时,mid=(max+min)/2

5)附加:本文中位数定义为:当有2N个数时,排序后,中位数=(第N个数+第(N+1)个数)/2;当有2N+1个数时,排序后,中位数=第N+1个数

若中位数定义:当有2N个数时,排序后,中位数=第N个 或 第N+1个数时,上述算法描述需作调整。

原文地址:https://www.cnblogs.com/longjin2018/p/11825743.html

时间: 2024-10-08 20:45:37

Algs4-2.4.30动态中位数查找的相关文章

[转]谈谈Linux下动态库查找路径的问题

http://blog.chinaunix.net/uid-23069658-id-4028681.html 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续“上路”.回想起自己当年刚接触Linux时,不管是用源码包编译程序,还是程序运行时出现的和动态库的各种恩恩怨怨,心里那真叫一个难受.那时候脑袋里曾经也犯过嘀咕,为啥Linux不弄成windows那样呢,装个软件那个麻烦不说,连运行软件都这么恼火呢?如果那样的话就不叫Linux了.借用小米公司CEO雷军一句话:小米,为发烧而生

谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH PKG_CONFIG_PATH

谈谈Linux下动态库查找路径的问题 ldconfig LD_LIBRARY_PATH  PKG_CONFIG_PATH 转载自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23069658&id=4028681 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续“上路”.回想起自己当年刚接触Linux时,不管是用源码包编译程序,还是程序运行时出现的和动态库的各种恩恩怨怨,心里那真叫一个难受.那时候脑袋里曾经

转:谈谈Linux下动态库查找路径的问题

http://blog.chinaunix.net/uid-23069658-id-4028681.html 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续"上路".回想起自己当年刚接触Linux时,不管是用源码包编译程序,还是程序运行时出现的和动态库的各种恩恩怨怨,心里那真叫一个难受.那时候脑袋里曾经也犯过嘀咕,为啥Linux不弄成windows那样呢,装个软件那个麻烦不说,连运行软件都这么恼火呢?如果那样的话就不叫Linux了.借用小米公司CEO雷军一句话:小米,

[hdu5249]动态中位数

题意:3种操作分别为入队,出队,查询当前队列的中位数.操作数为1e5数量级. 思路:先考虑离线算法,可以离散+线段树,可以划分树,考虑在线算法,则有treap名次树,SBtree(size balanced tree)等等. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

POJ 3784 - Running Median(动态中位数) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=3784 题目大意: 依次给出n个数字,求在数据输入过程中的所有中位数.(共有(n+1)/2个) 输入格式: 输入一个数字P(1<=P<=1000),表示数据组数. 对于每组数据,第一行输入数据组号和数字总个数(1<=个数<=9999),中间以一个空格隔开. 接下来每行给出至多10个数字. 输出格式: 对于每组数据,第一行输出数据组号和中位数个数,中间

POJ 3784 Running Median (动态中位数)

题目链接:http://poj.org/problem?id=3784 题目大意:依次输入n个数,每当输入奇数个数的时候,求出当前序列的中位数(排好序的中位数). 此题可用各种方法求解. 排序二叉树方法,每个结点保存以其为根的左右子树中数的个数.如果数据出的够严格,这种方法会被卡的,除非是通过动态调整维持树的高度较小. 排序二叉树的代码如下: #include <cstdio> using namespace std; #define N 20000 struct Node { int v;

HDU 3282 Running Median 动态中位数,可惜数据范围太小

Running Median Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3282 Description For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After each odd-indexed value is read

# 动态中位数-POJ 3784

题目: 依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. 输入格式 第一行输入一个整数P,代表后面数据集的个数,接下来若干行输入各个数据集. 每个数据集的第一行首先输入一个代表数据集的编号的整数. 然后输入一个整数M,代表数据集中包含数据的个数,M一定为奇数,数据之间用空格隔开. 数据集的剩余行由数据集的数据构成,每行包含10个数据,最后一行数据量可能少于10个,数据之间用空格隔开. 输出格式 对于每个数据集,第一行输出两个整数,分别代表数据集的编号以及

算法(第四版)C# 习题题解——2.4

写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更为方便的版本见:https://alg4.ikesnowy.com/ 这一节内容可能会用到的库文件有 PriorityQueue,同样在 Github 上可以找到. 善用 Ctrl + F 查找题目. 习题&题解 2.4.1 题目 用序列 P R I O * R * * I * T * Y * * * Q U E * *