Python 恒定时间中的字符串比较
我在考虑比较两个字符串的更快的方法。 检查Python集合(哈希表)中是否存在值的时间是恒定的。 这是否意味着在集合中查找字符串也有固定的时间Python 恒定时间中的字符串比较,python,python-3.x,string-comparison,Python,Python 3.x,String Comparison,我在考虑比较两个字符串的更快的方法。 检查Python集合(哈希表)中是否存在值的时间是恒定的。 这是否意味着在集合中查找字符串也有固定的时间 print('tya' == 'tya') #O(n) mySet = set() mySet.add('tya') if 'tya' in mySet: #O(1) <-- ??? print('True') print('tya'='tya')#O(n) mySet=set() mySet.add('tya') 如果mySet中的“t
print('tya' == 'tya') #O(n)
mySet = set()
mySet.add('tya')
if 'tya' in mySet: #O(1) <-- ???
print('True')
print('tya'='tya')#O(n)
mySet=set()
mySet.add('tya')
如果mySet中的“tya”:#O(1)你说
检查Python集合(哈希表)中是否存在值的时间是恒定的
但这是一种常见的过于简单化的说法,因为人们没有意识到他们在这么做,或者因为每次说出实际行为都需要更长的时间
检查Python集中是否存在值需要平均大小写常量数的哈希操作和相等比较,前提是哈希冲突不会失控。它不会自动使散列操作和相等比较保持恒定时间
您的NaiveFind
算法不是线性时间,因为您忽略了哈希计算的成本(还因为字符串切片需要在CPython中复制)。使用您的想法的改进版本,其中散列是避免此问题的关键。Rabin-Karp算法是平均情况下的线性时间,只要哈希冲突不会失控。还有这样的算法是保证线性时间的,在通常情况下,这样的算法比线性时间更好。这不会比比较两个字符串更快,因为您必须创建集合etcIt,相对于集合的大小,etcIt大约为O(1)。字符串的散列时间似乎是O(len(string)),当然,请参见,但我正在创建与实际子字符串匹配算法并行的集合。我理解它,但如果我在子字符串匹配中使用它,就像在上面的算法中一样,它会提高原始方法的复杂性吗?@KocT9H:Nope。见扩展答案。
def NaiveFind(largeString, subString):
mySet = set()
mySet.add(subString)
index = -1
start = 0
end = len(subString)
while(end < len(largeString)): #O(n-m)
windowFromLarge = largeString[start:end]
if(windowFromLarge in mySet): #O(1) <------- LINEAR ???
#if(windowFromLarge == subString): #O(m)
return start
start += 1
end += 1
return index