Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 恒定时间中的字符串比较_Python_Python 3.x_String Comparison - Fatal编程技术网

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

我在考虑比较两个字符串的更快的方法。 检查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中的“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