Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm 本机字符串匹配算法_Algorithm_String Matching - Fatal编程技术网

Algorithm 本机字符串匹配算法

Algorithm 本机字符串匹配算法,algorithm,string-matching,Algorithm,String Matching,下面是本机字符串匹配中一个非常著名的问题。请有人给我解释一下答案 假设模式p中的所有字符都不同。演示如何加速NAIVE-STRING MATCHER在n字符文本T上及时运行。基本思想: 同时迭代输入和模式,相互比较它们的字符 无论何时,只要在两个字符之间获得不匹配的字符,就可以重置模式位置并保持输入位置不变 这是因为模式字符都是不同的,这意味着只要有部分匹配,就不会有其他匹配与之重叠,因此我们可以从部分匹配的末尾开始查看 下面是一些不太难理解的伪代码: input[n] pattern[k] p

下面是本机字符串匹配中一个非常著名的问题。请有人给我解释一下答案

假设模式p中的所有字符都不同。演示如何加速NAIVE-STRING MATCHER在n字符文本T上及时运行。

基本思想:

同时迭代输入和模式,相互比较它们的字符 无论何时,只要在两个字符之间获得不匹配的字符,就可以重置模式位置并保持输入位置不变 这是因为模式字符都是不同的,这意味着只要有部分匹配,就不会有其他匹配与之重叠,因此我们可以从部分匹配的末尾开始查看

下面是一些不太难理解的伪代码:

input[n]
pattern[k]
pPos = 0
iPos = 0
while iPos < n
  if pPos == k
    FOUND!
  if pattern[pPos] == input[iPos]
    pPos++
    iPos++
  else
    // if pPos is already 0, we need to increase iPos,
    //   otherwise we just keep comparing the same characters
    if pPos == 0
      iPos++
    pPos = 0
很容易看出,ipo至少每秒钟增加一次循环,因此最多可以有2n次循环运行,使运行时间延长。

基本思想:

同时迭代输入和模式,相互比较它们的字符 无论何时,只要在两个字符之间获得不匹配的字符,就可以重置模式位置并保持输入位置不变 这是因为模式字符都是不同的,这意味着只要有部分匹配,就不会有其他匹配与之重叠,因此我们可以从部分匹配的末尾开始查看

下面是一些不太难理解的伪代码:

input[n]
pattern[k]
pPos = 0
iPos = 0
while iPos < n
  if pPos == k
    FOUND!
  if pattern[pPos] == input[iPos]
    pPos++
    iPos++
  else
    // if pPos is already 0, we need to increase iPos,
    //   otherwise we just keep comparing the same characters
    if pPos == 0
      iPos++
    pPos = 0

很容易看出,iPos至少每秒钟增加一次循环,因此最多可以运行2n次循环,使运行时间延长。

当NAIVE-STRING-MATCHER中的T[i]和p[j]不匹配时,我们可以跳过T[i]之前的所有字符,并从T[i+1]开始与p[1]的新匹配

NAIVE-STRING-MATCHERT,p

1N长度[T]

2米长[p]

s 0至n-m为3

4如果p[1..m]=T[s+1..s+m]


5然后,当NAIVE-STRING-MATCHER中的T[i]和p[j]不匹配时,会出现移位s的打印模式,我们可以跳过T[i]之前的所有字符,并从T[i+1]开始与p[1]的新匹配

NAIVE-STRING-MATCHERT,p

1N长度[T]

2米长[p]

s 0至n-m为3

4如果p[1..m]=T[s+1..s+m]


5然后,在Python2.7中的shift s

Naive字符串搜索算法实现中出现打印模式:

在实现Boyer Moore的字符串搜索算法的过程中,我决定使用我最初的朴素搜索算法。它被实现为一个实例方法,该方法接受一个字符串进行搜索。对象有一个属性“pattern”,它是要匹配的模式

1这里是搜索方法的原始版本,使用双for循环。 打电话给range和len

def search(self, string):
    for i in range(len(string)):
        for j in range(len(self.pattern)):
            if string[i+j] != self.pattern[j]:
                break
            elif j == len(self.pattern) - 1:
                return i
    return -1
2这里是第二个版本,使用了双while循环。 稍微快一点,不打电话到靶场

def search(self, string):
    i = 0
    while i < len(string):
        j = 0
        while j < len(self.pattern) and self.pattern[j] == string[i+j]:
            j += 1
        if j == len(self.pattern):
            return i
        i += 1
    return -1
4在局部变量中存储值=赢!使用双while循环,这是最快的

def search(self, string):
    len_pat = len(self.pattern)
    len_str = len(string)
    i = 0
    while i < len_str:
        j = 0
        while j < len_pat and self.pattern[j] == string[i+j]:
            j += 1
        if j == len_pat:
            return i
        i += 1
    return -1

Python 2.7中的朴素字符串搜索算法实现:

在实现Boyer Moore的字符串搜索算法的过程中,我决定使用我最初的朴素搜索算法。它被实现为一个实例方法,该方法接受一个字符串进行搜索。对象有一个属性“pattern”,它是要匹配的模式

1这里是搜索方法的原始版本,使用双for循环。 打电话给range和len

def search(self, string):
    for i in range(len(string)):
        for j in range(len(self.pattern)):
            if string[i+j] != self.pattern[j]:
                break
            elif j == len(self.pattern) - 1:
                return i
    return -1
2这里是第二个版本,使用了双while循环。 稍微快一点,不打电话到靶场

def search(self, string):
    i = 0
    while i < len(string):
        j = 0
        while j < len(self.pattern) and self.pattern[j] == string[i+j]:
            j += 1
        if j == len(self.pattern):
            return i
        i += 1
    return -1
4在局部变量中存储值=赢!使用双while循环,这是最快的

def search(self, string):
    len_pat = len(self.pattern)
    len_str = len(string)
    i = 0
    while i < len_str:
        j = 0
        while j < len_pat and self.pattern[j] == string[i+j]:
            j += 1
        if j == len_pat:
            return i
        i += 1
    return -1