开发者社区> 问答> 正文

恒定时间的字符串比较

我在考虑比较两个字符串的更快方法。检查Python集合(哈希表)中是否存在值具有固定时间。这是否意味着在集合中查找字符串也具有恒定的时间?

print('tya' == 'tya') #O(n)
mySet = set()
mySet.add('tya')
if 'tya' in mySet: #O(1) <-- ???
    print('True')

在更一般的情况下,这是否意味着我可以在线性时间内在字符串中找到子字符串???

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

展开
收起
几许相思几点泪 2019-12-29 20:52:34 6167 0
1 条回答
写回答
取消 提交回答
  • 你说

    检查Python集合(哈希表)中是否存在值具有固定时间。

    但这是一种普遍的过分简化,是因为人们没有意识到自己正在这样做,或者因为每次都说出实际的行为会花费更长的时间。

    假设哈希冲突不会失控,那么检查Python集中是否存在值需要平均情况下恒定数量的哈希运算和相等比较。它不会自动使哈希操作和相等比较保持恒定的时间。

    您的NaiveFind算法不是线性时间,因为您忽略了哈希计算的成本(也因为字符串切片需要在CPython中进行复制)。在拉宾,卡普算法采用你的想法,其中散列是的改良版本滚动散列来避免这个问题。Rabin-Karp算法是平均情况线性时间,只要哈希冲突不会失控即可。还有像Knuth-Morris-Pratt这样的算法可以保证线性时间,而像Boyer-Moore这样的算法在通常情况下可以比线性时间更好。

    2019-12-29 20:52:44
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载