Java 朴素算法实现

Java 朴素算法实现,java,algorithm,Java,Algorithm,为什么朴素算法不能有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=i

为什么朴素算法不能有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 ");
    }
}
import java.util.*;
类NaiveAlgo{
公共静态void main(字符串参数[]){
System.out.print(“输入文本:”);
扫描仪inp1=新扫描仪(System.in);
字符串txt=inp1.nextLine();
int lengthT=txt.length();
System.out.print(“输入模式:”);
扫描仪inp2=新扫描仪(System.in);
字符串ptn=inp2.nextLine();
int lengthP=ptn.length();
inti=0,j=0,index=0;
而(j!=长度p&&i!=长度t){
如果(txt.charAt(i)=ptn.charAt(j)){
i++;
j++;
}否则{
j=0;
索引++;
i=指数;
}
}
如果(index你的算法不是O(n)复杂度。它不是在执行线性搜索——当你重置
j=0
i=index
字符不匹配时会发生这种情况

如果在最坏情况下输入过大的值,比如说
ptn=xxxxy
txt=xxxxxxxxxxxxxxxxx y
,那么它的效率就不会很高,我相信这会使它变成O(nm)。算法中的逻辑会重置
ptn
的计数器,并且只会将
txt
的索引增加1

您可以将您的执行与
Boyer–Moore
子字符串搜索算法进行比较,看看它与您的算法有多大不同:

您的算法没有O(n)复杂度。它没有执行线性搜索——当您重置
j=0
i=index
字符不匹配时会发生这种情况

如果在最坏情况下输入过大的值,比如说
ptn=xxxxy
txt=xxxxxxxxxxxxxxxxx y
,那么它的效率就不会很高,我相信这会使它变成O(nm)。算法中的逻辑会重置
ptn
的计数器,并且只会将
txt
的索引增加1

您可以将您的执行与
Boyer–Moore
子字符串搜索算法进行比较,看看它与您的算法有多大不同:


它给出了你所说的预期结果。那怎么了?它没有O(n)复杂度看起来像O(n²)-没有真正的计算。而它隐藏了一个嵌套循环。(略过它,我不确定这是否真的很幼稚)非常感谢!我能知道你不确定这是否幼稚的原因吗?我的逻辑有什么不同吗?它给出了你所说的预期结果。那是怎么回事?它没有O(n)复杂度看起来像O(n²)-没有真正的计算。同时隐藏了一个嵌套循环。(略过它,我不确定这是否真的幼稚)非常感谢!我能知道你不确定这是否幼稚的原因吗?我的逻辑有什么不同吗?非常感谢!!我能知道你为什么说它不会有效率吗?因为它幼稚,所以它有O(n^2)复杂性或者说这段代码在某种程度上不同于朴素算法?想想“朴素算法”的定义,它是什么意思?我会说这就像孩子们想到的第一个解决问题的方法——它会完成任务,但可能不是“最佳”解决方案。它最终会解决给定的问题,但是这样做所花费的时间和内存是什么?简单的算法在时间(可能还有内存)方面效率不高。这就是大O符号的由来——它是表示时间和空间复杂性的标准化方法。顺便说一下,如果这个答案有帮助,请接受它作为解决方案(我答案旁边的勾号)所以我们可以关闭这个。如果你还有什么想澄清的,我们可以把它带到聊天中——不要有太长的评论正文。非常感谢!!请告诉我为什么你说它效率不高?因为它太幼稚了,所以它有O(n^2)复杂性或者说这段代码在某种程度上不同于朴素算法?想想“朴素算法”的定义,它是什么意思?我会说这就像孩子们想到的第一个解决问题的方法——它会完成任务,但可能不是“最佳”解决方案。它最终会解决给定的问题,但是这样做所花费的时间和内存是什么?简单的算法在时间(可能还有内存)方面效率不高。这就是大O符号的由来——它是表示时间和空间复杂性的标准化方法。顺便说一下,如果这个答案有帮助,请接受它作为解决方案(我答案旁边的勾号)这样我们就可以结束这个话题了。如果你还有什么想澄清的,我们可以把它带到聊天中——不要有太长的评论主体。