[英]Hackerrank Python Hash Tables: Ransom Note - Terminated due to timeout :(
令人讨厌的Hackerrank哈希表“因超时而终止”错误:21个测试案例中有6个赎金票据
实现开放地址哈希。 输入字符串的大小最多为30,000个字符串:已尝试将哈希表的大小从60,000更改为300,000,但没有成功。
CAPACITY = 300000
hashTable = [None] * CAPACITY
def checkMagazine(magazine, note):
# Store Magazine into hashtable
for element in magazine:
# print("STORED " + element)
position = calculateHash(element)
# print(position)
if hashTable[position] == None:
hashTable[position] = element
# print("Stored into " + str(position))
else:
i = 1
# print("collided into " + str((position) % CAPACITY))
while hashTable[(position + i) % CAPACITY] != None:
# print("collided into " + str((position + i) % CAPACITY))
i += 1
hashTable[(position + i) % CAPACITY] = element
# Check if all items in note is in hashtable
included = True
for item in note:
position = calculateHash(item)
if hashTable[position] != item:
i = 1
while hashTable[(position + i ) % CAPACITY] != item:
if hashTable[(position + i ) % CAPACITY] == None:
included = False
print("No")
return
else:
i += 1
hashTable[(position + i ) % CAPACITY] = "DONED"
else:
hashTable[position] = "DONED"
# print("Found " + item)
print("Yes")
def calculateHash(string):
return hash(string) % CAPACITY
假设哈希表是解决此问题的最佳方法(时间复杂度O(n)),那么发生超时的原因是因为开放地址哈希? 还是还有其他原因?
我认为问题与您的实施有关。 看看如果传递诸如["a", "a", "a", .... "a"]
类的大型“ magazine”输入,代码会发生什么变化。
应该尝试过这样的事情:
magazine = 'two times three is not four'
note = 'two times two is four'
if set(magazine.split()) & set(note.split()) == set(note.split()) :
print 'yes'
else :
print 'no'
您可以通过预先计算set(note.split())
节省一些时间,但是我怀疑它是否很大。
如果您关心字数,可以使用Counter
:
from collections import Counter
然后检查便笺中的每个单词,计数器是否比杂志中相同单词的计数器小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.