Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
String 无法理解中提到的概念http://pine.cs.yale.edu/pinewiki/SuffixArrays_String_Algorithm_Search_Suffix Array - Fatal编程技术网

String 无法理解中提到的概念http://pine.cs.yale.edu/pinewiki/SuffixArrays

String 无法理解中提到的概念http://pine.cs.yale.edu/pinewiki/SuffixArrays,string,algorithm,search,suffix-array,String,Algorithm,Search,Suffix Array,请解释: 假设我们有一个后缀数组,对应于一个n字符的文本,并且我们希望找到一个m字符模式文本中的所有匹配项。由于后缀是有序的,最简单的解决方案是使用O(logn)比较对模式的第一次和最后一次出现(如果有)进行二进制搜索 我需要知道如何在确定模式的第一次和最后一次出现后获得所有出现的模式。您引用的文本在两个方面有点混淆,甚至可能误导: 它说找到模式的第一个和最后一个匹配项就足够了,但它应该更准确地说:后缀数组中模式的第一个和最后一个匹配项。这与基础文本中的第一次和最后一次出现不同 它说你需要O(l

请解释:

假设我们有一个后缀数组,对应于一个n字符的文本,并且我们希望找到一个m字符模式文本中的所有匹配项。由于后缀是有序的,最简单的解决方案是使用O(logn)比较对模式的第一次和最后一次出现(如果有)进行二进制搜索


我需要知道如何在确定模式的第一次和最后一次出现后获得所有出现的模式。

您引用的文本在两个方面有点混淆,甚至可能误导:

  • 它说找到模式的第一个和最后一个匹配项就足够了,但它应该更准确地说:后缀数组中模式的第一个和最后一个匹配项。这与基础文本中的第一次和最后一次出现不同

  • 它说你需要O(logn)比较。只有当“比较”指的是最多m个字符的字符串比较时,才会出现这种情况。由于比较多达m个字符需要O(m)时间,因此计算步骤的数量(例如,在标准RAM模型中)为O(m*logn)。如果构建并使用辅助数据结构,例如LCP(最长公共前缀)阵列,则可以改进该性能

  • 现在,为了回答您的问题:考虑到上面的(1.),您可以轻松地获得模式的所有匹配项,因为后缀数组是按字典排序的。这意味着第一次出现是最小的,最后一次出现是最大的。因此,剩余出现次数必须介于第一次和最后一次之间

    <强>示例.< /强>考虑字符串<代码> bcFababxBBCACGBDECD。其后缀数组(表示为后缀的起始位置,从0开始计数)为

    对应于以下后缀列表:

    3  : abcabxbbcabcgdebcd
    12 : abcgdebcd
    6  : abxbbcabcgdebcd
    9  : bbcabcgdebcd
    10 : bcabcgdebcd            <======= first occurrence of 'bc'
    4  : bcabxbbcabcgdebcd
    18 : bcd
    0  : bcfabcabxbbcabcgdebcd
    13 : bcgdebcd               <======= last occurrence of 'bc'
    7  : bxbbcabcgdebcd
    11 : cabcgdebcd
    5  : cabxbbcabcgdebcd
    19 : cd
    1  : cfabcabxbbcabcgdebcd
    14 : cgdebcd
    20 : d
    16 : debcd
    17 : ebcd
    2  : fabcabxbbcabcgdebcd
    15 : gdebcd
    8  : xbbcabcgdebcd
    
    因此,位置10、4、18、0和13标记图案的出现

    (请注意,实际上不使用后缀的完整字符串列表–仅使用整数位置列表。)

    3  : abcabxbbcabcgdebcd
    12 : abcgdebcd
    6  : abxbbcabcgdebcd
    9  : bbcabcgdebcd
    10 : bcabcgdebcd            <======= first occurrence of 'bc'
    4  : bcabxbbcabcgdebcd
    18 : bcd
    0  : bcfabcabxbbcabcgdebcd
    13 : bcgdebcd               <======= last occurrence of 'bc'
    7  : bxbbcabcgdebcd
    11 : cabcgdebcd
    5  : cabxbbcabcgdebcd
    19 : cd
    1  : cfabcabxbbcabcgdebcd
    14 : cgdebcd
    20 : d
    16 : debcd
    17 : ebcd
    2  : fabcabxbbcabcgdebcd
    15 : gdebcd
    8  : xbbcabcgdebcd
    
    [10, 4, 18, 0, 13]