Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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/4/oop/2.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_List_Search_Binary Search_Suffix Array - Fatal编程技术网

Python 使用后缀数组查找一个出现的子字符串

Python 使用后缀数组查找一个出现的子字符串,python,list,search,binary-search,suffix-array,Python,List,Search,Binary Search,Suffix Array,我正试图找出如何在后缀数组中对一个模式进行二进制搜索。 让我们看一段文字:petertomasjohnernoerror。 我试图找到er SA是本文的后缀数组:8,14,19,3,1,12,10,7,13,17,18,11,6,22,0,23,16,21,15,20,4,9,2,5 现在,我想找到后缀数组的任何索引,它的值指向一个'er'。因此,输出将是SA中指向3,14或19的索引,因此它将返回1,2或3 我正在尝试使用二进制搜索,但我不知道如何使用 def findOneOccurence

我正试图找出如何在后缀数组中对一个模式进行二进制搜索。 让我们看一段文字:
petertomasjohnernoerror
。 我试图找到
er

SA
是本文的后缀数组:
8,14,19,3,1,12,10,7,13,17,18,11,6,22,0,23,16,21,15,20,4,9,2,5

现在,我想找到后缀数组的任何索引,它的值指向一个
'er'
。因此,输出将是SA中指向
3,14或19的索引,因此它将返回1,2或3

我正在尝试使用二进制搜索,但我不知道如何使用

def findOneOccurence(text,SA,p):
    high = len(text)-1           # The last index
    low = 0                      # the lowest index
    while True:
        check = (high-low)/2     # find a middle

        if p in text[SA[check]:SA[check]+len(p)]:
            return check
        else:
            if text[SA[check]:SA[check]+len(p)]<p:
                low = check
            else:
                high = check
        if high<=low:
            return None
def findOneOccurence(文本、SA、p):
高=长度(文本)-1#最后一个索引
低=0#最低指数
尽管如此:
检查=(高-低)/2#找到一个中间值
如果文本[SA[检查]中的p:SA[检查]+len(p)]:
退票
其他:
如果文本[SA[检查]:SA[检查]+len(p)]=低变高借用和编辑

>>text='petertomasjohnernoerror'
>>>SA=8,14,19,3,1,12,10,7,13,17,18,11,6,22,0,23,16,21,15,20,4,9,2,5
>>>def对分_左(a,x,文本,lo=0,hi=None):
如果lo<0:
raise VALUERROR('lo必须为非负')
如果hi为无:
hi=len(a)
当lo>>左二等分(SA,'er',文本)
14

你把
re
er
搞混了吗?@是的,我的意思是“er”,因为文本中没有“re”,谢谢。我认为你没有找到正确的方法。它不应该是
(高+低)/2
而不是
(高-低)/2
?谢谢,这是另一个错误。差不多完成了:)您应该使用
=
>>> text= 'petertomasjohnerrnoerror'
>>> SA = 8,14,19,3,1,12,10,7,13,17,18,11,6,22,0,23,16,21,15,20,4,9,2,5
>>> def bisect_left(a, x, text, lo=0, hi=None):
    if lo < 0:
        raise ValueError('lo must be non-negative')
    if hi is None:
        hi = len(a)
    while lo < hi:
        mid = (lo+hi)//2
        if text[a[mid]:] < x: lo = mid+1
        else: hi = mid
    if not text[a[lo]:].startswith(x): 
        # i suppose text[a[lo]:a[lo]+len(x)] == x could be a faster check
        raise IndexError('not found')
    return a[lo]

>>> bisect_left(SA, 'er', text)
14