由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 2-sum 用hash table实现的问题
相关主题
leetcode 上的 two sumLeetcode Two Sum,我这个O(n)解法为啥不讨服务器的好呢
LinkedIn电面leetcode上的大oj和小oj有什么本质差别吗?
4sum的那道题sleetcode中的online judge都报runtime error, 用本地编译器执行一些例子都ok
A家电面3sum on LeetCode OJ
4sum o(n^2)超时Leetcode上Two sum只能过3个case, VS能过,大牛进来看看是怎么回事
twoSumleetcode很有意思啊
leetcode 的two sum请问下leetcode的two sum题目
Linked电面分享,挺好的题 应该已挂菜鸟问个two sum的变型题
相关话题的讨论汇总
话题: 1m话题: hashtable话题: 10000话题: 0000话题: hash
进入JobHunting版参与讨论
1 (共1页)
z***m
发帖数: 1602
1
如果有1M个数,每个数大概是100,0000,0000这样的整数,是不是hash table的size也
要很大啊,比如说等于数组中的最大数。最近做coursera上的algorithm,被这道题卡
住了。如果数组小或者里面的数值小,还行。但是如果是1M个数,每个都很大,就算得
很慢。有没有什么好的实现方法啊?
详细题目在:
http://blog.csdn.net/neostar2008/article/details/7782858
考虑的区间是[-10000,10000]而非[2500, 4000].
z****e
发帖数: 54598
2
那就是string了,而非integer
string是二维变量,所以会有hashcode碰撞的问题
所以会出现大量equals判断,所以效率自然会下降
那最常见的做法就是分解步骤
比如针对前三位做一个hashmap
然后中间三位再单独存一个hashmap,最后四位再存一个hashmap
这样通过一级一级找下去,搜索效率就高了
自然空间复杂度也会相应升高
R******1
发帖数: 58
3
刚好之前上过这课。是Homework6.1吗? hash table完全可以做呀。LZ卡在哪里呀?

【在 z***m 的大作中提到】
: 如果有1M个数,每个数大概是100,0000,0000这样的整数,是不是hash table的size也
: 要很大啊,比如说等于数组中的最大数。最近做coursera上的algorithm,被这道题卡
: 住了。如果数组小或者里面的数值小,还行。但是如果是1M个数,每个都很大,就算得
: 很慢。有没有什么好的实现方法啊?
: 详细题目在:
: http://blog.csdn.net/neostar2008/article/details/7782858
: 考虑的区间是[-10000,10000]而非[2500, 4000].

A***o
发帖数: 358
4
Linear hashing, extensible hashing

如果有1M个数,每个数大概是100,0000,0000这样的整数,是不是hash table的size也
要很大啊,比如说等于数组中的最大数。最近做coursera上的algor........

【在 z***m 的大作中提到】
: 如果有1M个数,每个数大概是100,0000,0000这样的整数,是不是hash table的size也
: 要很大啊,比如说等于数组中的最大数。最近做coursera上的algorithm,被这道题卡
: 住了。如果数组小或者里面的数值小,还行。但是如果是1M个数,每个都很大,就算得
: 很慢。有没有什么好的实现方法啊?
: 详细题目在:
: http://blog.csdn.net/neostar2008/article/details/7782858
: 考虑的区间是[-10000,10000]而非[2500, 4000].

z***m
发帖数: 1602
5
我python code是这样写的:
def TwoSum_HashTable(lst, target):

hashTable = dict()

for x in lst:
hashTable[x] = True

for x in lst:
y = target-x
if y in hashTable and x != y:
return (x, y)

return None

lines = open('2sum.txt').read().splitlines()
data = map(lambda x: int(x), lines)
count = 0
for t in range(-10000, 10000+1):
if(TwoSum_HashTable(data, t)):
count +=1 # # find if there exists such pair
print count
----------------------
这个2sum.txt有1M的integer,最大的接近1,000,0000,0000,我运行几个小时都不
出结果啊。

【在 R******1 的大作中提到】
: 刚好之前上过这课。是Homework6.1吗? hash table完全可以做呀。LZ卡在哪里呀?
f*******b
发帖数: 520
6
MARK
z***m
发帖数: 1602
7
是的,问题是算太慢了,几个小时不出结果啊

【在 R******1 的大作中提到】
: 刚好之前上过这课。是Homework6.1吗? hash table完全可以做呀。LZ卡在哪里呀?
B*****g
发帖数: 34098
8
那就别用hash, lol

【在 z***m 的大作中提到】
: 是的,问题是算太慢了,几个小时不出结果啊
r*********n
发帖数: 4553
9
找一个中等大小的质数,直接mod
R******1
发帖数: 58
10
我之前做的时候是【2500, 4000】,所以很快, 7s左右
刚试了试这个新的range,本来以为是线性增加,时间应该也不不大;
但是,很多target无法满足,就要遍历hash table一次。
【2500, 4000】 用时 7s 命中率1477/1500 绝大多数都很快break了
【0, 1000】 用时 1m56s 命中率445/1000 多于一半要遍历完
建议楼主试试先sort(O(NlogN)), 然后binary search (O(logN)).
2sum.txt ~4MB 所以建设1M个ints
range是【-10000, 10000】, 20000
用hashtable worst case 20000*1M
用sort然后binary search, worst case 1M*log(1M) + 20000*log(1M) ~ 20*1M
R******1
发帖数: 58
11
折腾了一会儿 用C++ 15m搞定【-10000, 10000】
关键的优化其实只有一个: -10000 ~ 56 都没有match的…… 因为最小的两个数和是
56
left = min(sorted[0]+sorted[1], -10000)
LZ可以试试看
1 (共1页)
进入JobHunting版参与讨论
相关主题
菜鸟问个two sum的变型题4sum o(n^2)超时
LinkedIn 电面twoSum
共享一道电面题k-sumleetcode 的two sum
开始刷leetcode,第一道题一直有run time errorLinked电面分享,挺好的题 应该已挂
leetcode 上的 two sumLeetcode Two Sum,我这个O(n)解法为啥不讨服务器的好呢
LinkedIn电面leetcode上的大oj和小oj有什么本质差别吗?
4sum的那道题sleetcode中的online judge都报runtime error, 用本地编译器执行一些例子都ok
A家电面3sum on LeetCode OJ
相关话题的讨论汇总
话题: 1m话题: hashtable话题: 10000话题: 0000话题: hash