Algorithms Part 1-Question 6- 2SUM Median-数和以及中位数问题
本次有两个编程问题,一个是求两个数的和满足一定值的数目,另一个是求中位数。
2SUM问题
问题描述
The goal of this problem is to implement a variant of the 2-SUM algorithm (covered in the Week 6 lecture on hash table applications).
The file contains 1 million integers, both positive and negative (there might be some repetitions!).This is your array of integers, with the ith row of the file specifying the ith entry of the array. Your task is to compute the number of target values t in the interval [-10000,10000] (inclusive) such that there are distinct numbers x,y in the input file that satisfy x+y=t. (NOTE: ensuring distinctness requires a one-line addition to the algorithm from lecture.)
解题方法:
数据大小为1000000,对每个数都要循环一次,每个数找出匹配的y值。后面这一步是关键所在。如果使用hash把这么多数按照大小分成长度为2^15的数据段,则对于每个x只需遍历两个数据段即可,而数据是稀疏的,每个数据段之中可能只有一到两个值,这样算法复杂度就是O(N)。
具体实现如下:
from time import clock
start=clock() def myhash(val):
return val>>15 f=open('algo1-programming_prob-2sum.txt','r')
valnew=[True for x in range(6103503)]
tlist=[0 for x in range(-10000,10000+1)]
tmp=f.read()
f.close()
print('read complete')
vallist=[int(val) for val in tmp.split()]
vallist=set(vallist)
print('convert to set@int complete')
minval=min(vallist)
for val in vallist:
val_key=myhash(val-minval)
if valnew[val_key]==True:
valnew[val_key]=[val]
else:
valnew[val_key].append(val)
print('hash complete',len(valnew),len(vallist)) for val in vallist:
firkey=myhash(-10000-val-minval)
seckey=myhash(10000-val-minval)
if firkey<len(valnew):
if valnew[firkey]!=True:
for tmp in valnew[firkey]:
if tmp+val in range(-10000,10000+1):
tlist[tmp+val+10000]=1
if firkey<len(valnew):
if valnew[seckey]!=True:
for tmp in valnew[seckey]:
if tmp+val in range(-10000,10000+1):
tlist[tmp+val+10000]=1 print('output: ',sum(tlist)) finish=clock()
print finish-start ##read complete
##convert to set@int complete
##('hash complete', 6103503, 999752)
##('output: ', ***)
##480.193410146 ##user@hn:~/pyscripts$ python 2sum_hash.py
##read complete
##convert to set@int complete
##('hash complete', 6103503, 999752)
##('output: ', ***)
##183.92
在win32系统下用了480s,但debian下面只需要180s。论坛有人达到0.53s,我改进的空间还很大。
中位数问题
问题描述:
The goal of this problem is to implement the "Median Maintenance" algorithm (covered in the Week 5 lecture on heap applications). The text file contains a list of the integers from 1 to 10000 in unsorted order; you should treat this as a stream of numbers, arriving one by one. Letting xi denote the ith number of the file, the kth median mk is defined as the median of the numbers x1,…,xk. (So, if k is odd, then mk is ((k+1)/2)th smallest number among x1,…,xk; if k is even, then mk is the (k/2)th smallest number among x1,…,xk.) In the box below you should type the sum of these 10000 medians, modulo 10000 (i.e., only the last 4 digits). That is, you should compute (m1+m2+m3+⋯+m10000)mod10000.
这个题除了对于每个新数组进行排序取中位数的方法外,可以采用两个heap快速的完成运算。在数据不断到来的过程中,要不断维护两个heap,使两个heap的size差不大于1,一个是最小堆,而另一个是最大堆,分别存放现有数据中较大和较小的half。
Python中只有heapq提供了最小堆,但可以对于值取反得到最大堆。
这次我实现了两种算法,速度差距很明显。实现算法:
from time import clock
from heapq import heappush,heappop
start=clock() f=open('Median.txt','r')
tmp=f.read()
f.close()
data=[int(val) for val in tmp.split()]
out=[0 for x in range(len(data))] #rudeway with high complexity
#17s running time
def rudeway(data,out):
for ind in range(len(data)):
b=data[0:ind+1]
b.sort()
out.append(b[(len(b)+1)/2-1])
return sum(out)%10000 #print(rudeway(data,out)) #use heapq, minus(min heap)=max heap
#0.231407100855s
def heapway(data,out):
lheap=[]
rheap=[]
out[0]=data[0]
tmp=sorted(data[0:2])
out[1]=tmp[0]
heappush(lheap,-tmp[0])
heappush(rheap,tmp[1])
for ind in range(2,len(data)):
if data[ind]>rheap[0]:
heappush(rheap,data[ind])
else:
heappush(lheap,-data[ind]) if len(rheap)>len(lheap):
heappush(lheap,-heappop(rheap))
if len(lheap)>len(rheap)+1:
heappush(rheap,-heappop(lheap))
out[ind]=-lheap[0] return sum(out)%10000 print(heapway(data,out)) finish=clock()
print finish-start
Algorithms Part 1-Question 6- 2SUM Median-数和以及中位数问题的更多相关文章
- POJ 3784 Running Median(动态维护中位数)
Description For this problem, you will write a program that reads in a sequence of 32-bit signed int ...
- c++ question 003 求两数大者?
#include <iostream>using namespace std; int main(){ //求两数中的大者? int a,b; cin>>a>>b; ...
- 【HackerRank】Find the Median(Partition找到数组中位数)
In the Quicksort challenges, you sorted an entire array. Sometimes, you just need specific informati ...
- URAL 1306 - Sequence Median 小内存求中位数
[题意]给出n(1~250000)个数(int以内),求中位数 [题解]一开始直接sort,发现MLE,才发现内存限制1024k,那么就不能开int[250000]的数组了(4*250000=1,00 ...
- POJ 3579:Median 差值的中位数
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4680 Accepted: 1452 Descriptio ...
- POJ 3784 Running Median【维护动态中位数】
Description For this problem, you will write a program that reads in a sequence of 32-bit signed int ...
- LeetCode295-Find Median from Data Stream && 480. 滑动窗口中位数
中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操 ...
- [leetcode]295. 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 ...
- 光圈与F数相关知识
一.F数 F数.光圈数.相对孔径的倒数. F数代表的意义 F数小(光圈大).F数大(光圈小). F数又称为镜头速度,F数小的镜头速度快.因为拍摄的曝光时间△t 正比于F数的平方. F数还能表征镜头的分 ...
- 1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】
题目:戳这里 百度之星初赛原题:戳这里 题意:n个不同的数,求中位数为m的区间有多少个. 解题思路: 此题的中位数就是个数为奇数的数组中,小于m的数和大于m的数一样多,个数为偶数的数组中,小于m的数比 ...
随机推荐
- httpRequest对象常用的方法
IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结! 1. 获得客户机信息 getRequestURL方法返回客户端发出请求时的完整URL. getRequestURI方 ...
- MyEclipse中使用JUnit进行单元测试
1. 下载JUnit的jar文件,下载地址在这里 2. 在MyEclipse中新建一个要测试的项目HelloJUnit 3. 添加一个要测试的类HelloJUnit,代码如下,注意需要先建packag ...
- .frm文件
http://www.cnblogs.com/jiangxu67/p/4755097.html MySQL]frm文件解析 MySQL 协议字节序 关于传输整数小大端的实现 http://hamilt ...
- bzoj1834: [ZJOI2010]network 网络扩容
努力看了很久样例一直过不了...然后各种输出中间过程啊巴拉巴拉弄了1h,没办法了...然后突然想到啊原来的边可以用啊为什么不用...于是A了...感人肺腑 #include<cstdio> ...
- js array 数组删除元素
/* * 方法:Array.remove(dx) * 功能:根据元素位置值删除数组元素. * 参数:元素值 * 返回:在原数组上修改数组 */ Array.prototype.baoremove = ...
- this class is not key value coding-compliant for the key ##
setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key ## 出现以上错误时很恶心,并 ...
- Linux find xargs rm .orig
/********************************************************************* * Linux find xargs rm .orig * ...
- apache开源项目--Syncope
Apache Syncope is an Open Source system for managing digital identities in enterprise environments, ...
- VS2010下编译安装DarwinStreamingServer5.5.5
源码下载链接:http://dss.macosforge.org/源码版本: 5.5.5版本电脑环境:visual studio2010,window 7 x64系统.用VS2010打开WinNTSu ...
- Android粘贴板的运用
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); clipboa ...