为什么朴素算法不具有o(n)时间复杂度? 这是我的Java代码,给了我预期的结果。 请解释这是怎么回事...
import java.util.*;
class NaiveAlgo{
public static void main (String args[]){
System.out.print("Enter the Text : ");
Scanner inp1=new Scanner(System.in);
String txt=inp1.nextLine();
int lengthT=txt.length();
System.out.print("Enter the Pattern : ");
Scanner inp2=new Scanner(System.in);
String ptn=inp2.nextLine();
int lengthP=ptn.length();
int i=0,j=0,index=0;
while(j!=lengthP&& i!=lengthT){
if(txt.charAt(i)==ptn.charAt(j)){
i++;
j++;
}else{
j=0;
index++;
i=index;
}
}
if(index<lengthT)
System.out.println("Index : "+index);
else
System.out.println("Not found ");
}
}
答案 0 :(得分:1)
您的算法不是O(n)复杂性。它不会执行线性搜索-这是在您将j=0
和i=index
重置为字符不匹配时发生的。
使用ptn=xxxxy
和txt=xxxxxxxxxxxxxxxxxxxxy
这样的夸张的最坏情况输入将不会有效,这会使我相信它是O(nm)。算法中的逻辑会重置ptn
的计数器,并且只会将txt
的索引加1。
您可以将执行与Boyer–Moore
子字符串搜索算法进行比较,看看它与您的执行有何不同:
https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm