数据结构问题集锦 - Find Median from Data Stream

临近期末,鸭梨山大啊,就不多说了。这道题的要求就是,给定一串输入,在中间任何一个时候,都能够求出添加到一半的序列的中位数。

大概考虑一下,如果用动态数组来进行元素插入的话,尽管这样查询中位数的复杂度为O(1),由于每一次插入都是O(n),因而总复杂度为O(n^2),显然遭不住。如果用链表的话,插入单次还是O(n),而且求中位数反而更不是O(1)了,也不行。这时候注意到我们需要一个有序的序列来求中位数,所以可以建两个set,分别存放左半和右半序列,由于set本身数据是有序的,这样很容易就能查找到中位数了。

于是就可以写出如下代码:

 1 template <typename T>
 2 T last(set<T> _set)
 3 {
 4     return *(_set.rbegin());
 5 }
 6 
 7 template <typename T>
 8 T first(set<T> _set)
 9 {
10     return *(_set.begin());
11 }
12 
13 class MedianFinder {
14 private:
15     set<int> left, right;
16 public:
17     //Adds a number into the data structure.
18     void addNum(int num) {
19         //Add new number first
20         if (left.empty()||(num<=last(left)))
21             left.insert(num);
22         else
23             right.insert(num);
24         
25         //Arrange left and right queue
26         if (left.size()>=right.size()+2)
27         {
28             right.insert(last(left));
29             left.erase(last(left));
30         }
31         else if (left.size()<right.size())
32         {
33             left.insert(first(right));
34             right.erase(first(right));
35         }
36     }
37 
38     //Returns the median of current data stream
39     double findMedian() {
40         if (left.size()==right.size())
41             return (last(left)+first(right))/2;
42         else
43             return last(left);
44     }
45 };

大家都知道C++中set是用红黑树实现的,于是每一次addNum都应该是O(log n)复杂度,findMedian函数写的其实不够好,因为每次添加过后其实都可以记录下当前的中位数,避免到set中去查找最后一项(现在复杂度是O(log n),如此重新设计之后能变成O(1))

不过悲催的是Leetcode还是Time Limit Exceeded了,果然我是算法渣啊...

 

转载于:https://www.cnblogs.com/lqf-96/p/find-median-from-data-stream.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

所处理的数据在什么地方 有多长 如何定义 如何寻找

处理的数据在什么地方&#xff1a; 立即数(idata)1,3,10,3F 寄存器AX,AL,BX 内存单元,可用寻址方式给出DS:[idata],ds:[0]处理的数据有多长: MOV AX,1 ;字操作 MOV AL,1 ;字节操作 MOV BYTE PTR DS:[0],1 ;字节操作 MOV WORD PTR DS:[0],1 ;字操作 PUSH/POP 进行的是字操作 数据…

invoke伪指令

通过反汇编helloworld对话框来看invoke伪指令 invoke是调用WinAPI的伪指令 把上一个helloworld对话框编译并连接成hello.exe然后用OD打开得到下图 前文说过ML.EXE编译invoke时会把invoke的参数PUSH入栈和一个CALL,在代码段中只有两个invoke指令 invoke MessageBox,NULL,offset …

Azure Virtual Network, 虚拟网络

云上的虚拟网络把不同用户完全的隔离开来。同时可以自己对虚拟网络进行定制&#xff0c;设置各种安全访问策略&#xff0c;配置load balancer等等。 在新的基于Azure Resource Manager (ARM)的部署方式中&#xff0c;虚拟网络已经是默认设置了。也就是说在通过ARM部署的VM&…

百度地图API的第一次接触——自定义控件

1.定义一个控件类&#xff0c;即function function ZoomControl(){ // 设置默认停靠位置和偏移量 this.defaultAnchor BMAP_ANCHOR_TOP_LEFT; this.defaultOffset new BMap.Size(10, 10); } 2.通过JavaScript的prototype属性继承于BMap.Control ZoomControl.pr…

include语句

程序用到MessageBox和ExitProcess函数它们分别在user32..dll和Kernel32.dll中 那么就必须在程序中使用include语句包含这两个库文件,此时程序中可以使用user32..dll和Kernel32.dll中所有的函数 include相当于java中import导入包语句

Spring MVC Controller与jquery ajax请求处理json

在用 spring mvc 写应用的时候发现jquery传递的【json数组对象】参数后台接收不到&#xff0c;多订单的处理&#xff0c;ajax请求&#xff1a; var cmd {orders:[{"storeId":"0a1", "address":"西斗门路2号", "goods":[{&…

课堂例子解答

Editbox 等价类划分测试用例例子 要求输入1到6个英文字符或数字&#xff0c;按OK结束并输入。 其中有效等价类包括:1.长度1-6&#xff0c;2.a-z,A-Z,0-9 无效等价类包括&#xff1a;1.长度0或大于6&#xff0c;2.输入字母数字以外的字符&#xff0c;控制字符&#xff0c;标点符…

从代码里提取的测试需求

服务器端的测试&#xff0c;软件需求基本等于产品说明书&#xff0c;只有大概&#xff0c;没有详尽。再需求不充分的情况下&#xff0c;我们可以从哪些方面来挖掘测试需求呢&#xff1f; 现已知需求&#xff1a;服务器支持对客户端的版本升级&#xff0c;存在两种升级规则&…

PUSH/POP

栈操作指令PUSH 寄存器/段寄存器/内存单元POP 寄存器/段寄存器/内存单元PUSH AX1)SPSP-2 ,SS:SP指向新的内存单元2)将AX送入SS:SP指向的内存单元POP AX1)将SS:SP指向的内存单元处的数据送入AX中2)SPSP2

Android Ant 和 Gradle 打包流程和效率对照

一、Ant 打包&#xff1a;&#xff08;下载ant、配置环境变量就不说了&#xff09; 1、进入命令行模式&#xff0c;并切换到项目文件夹。运行例如以下命令为ADT创建的项目加入ant build支持&#xff1a; android update project -p . -t "android-17" 2、build脚本默…

读软件工程这本书的感悟(第一次作业)

在还没上这门课之前&#xff0c;我认为软件工程是让我们学会编写软件&#xff0c;但是在看到这本书后&#xff0c;我才知道我们学的不是如何的开发软件&#xff0c;而是在学习开发和维护软件&#xff0c;以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术…

请大家编译连接并执行一下

由于是笔记&#xff0c;也许记得有点糟糕&#xff0c;也许班门弄斧没有独到见解 &#xff0c;见谅见谅

KVC和KVO

OC中的一个比较有特色的知识点&#xff1a;KVC和KVO一、KVC操作OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量&#xff0c;很暴力的&#xff0c;这样做就会破坏类的封装性&#xff0c;本来类中的的private权限就是不希望外界去访问的&#xff0c;但是我们这…

8086加法指令ADD

加法指令ADD(ADDition) ADD OPRD1,OPRD2 ;OPRD1<--OPRD1OPRD2 ;完成OPRD1与OPRD2相加 ,结果保存在OPRD1中CODE SEGMENT MOV AX,1 MOV BX,2 ADD AX,BX ;AX<--AXBX ,结果AX3CODE ENDS参与运算的操作数类型必须保持一致,同为字节或字可组合以下几种形式&…

Fragment基础讲解

//新建一个碎片public class LeftFragment extends Fragment { Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 加载一个碎片界面 View view inflater.inflate(R.layout.leftfragment, container, false)…

[bzoj1012](JSOI2008)最大数maxnumber(Fenwick Tree)

Description 现在请求你维护一个数列&#xff0c;要求提供以下两种操作&#xff1a; 1、 查询操作。语法&#xff1a;Q L 功能&#xff1a;查询当前数列中末尾L个数中的最大的数&#xff0c;并输出这个数的值。限制&#xff1a;L不超过当前数列的长度。 2、 插入操作。语法&…

javaScript转换日期合格式

javascript如何将时间日期转换为Date对象:有时候需要讲一个字符串型的时间日期转换为Date时间对象&#xff0c;下面就通过一个简单的实例提供一种解决方案&#xff0c;当然也是一种思路&#xff0c;可以进行一定的变通&#xff0c;以达到举一反三的效果。例如这里有一个时间日期…

8086减法指令SUB

减法指令SUB(SUBtraction) SUB OPRD1,OPRD2 ; OPRD1<-- OPRD1-OPRD2 都影响FLAG标志寄存器,同样的包含两种含义(有符号减法和无符号减法)

奇怪吸引子---Dadras

奇怪吸引子是混沌学的重要组成理论&#xff0c;用于演化过程的终极状态&#xff0c;具有如下特征&#xff1a;终极性、稳定性、吸引性。吸引子是一个数学概念&#xff0c;描写运动的收敛类型。它是指这样的一个集合&#xff0c;当时间趋于无穷大时&#xff0c;在任何一个有界集…

8086 INC, DEC

INC OPRD ;OPRD<--OPRD1 ;自加1指令code segmentmov ax,0inc ax ;ax<--ax1 ,ax1inc ax ;ax<--ax1 ,ax2code endsDEC OPRD ;OPRD<--OPRD-1 ;自减1指令code segmentmov ax,5dec ax ;ax<--ax-1 ,ax4 code ends