F12打开控制台查看运行时间
indexOf是js原生的二进制代码,速度比这两个算法都要快,strStr是双指针,kmp是Kmp算法
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/mdui/0.4.3/css/mdui.min.css">
<script src="https://cdnjs.loli.net/ajax/libs/mdui/0.4.3/js/mdui.min.js"></script>
<div id="main">
<div class="mdui-textfield">
<textarea class="mdui-textfield-input" placeholder="字符串" v-model="str"></textarea>
</div>
<div class="mdui-textfield">
<input class="mdui-textfield-input" type="text" placeholder="查找内容" v-model="pattern"/>
</div>
<button class="mdui-btn mdui-btn-raised mdui-ripple mdui-color-theme-accent" @click="search">查找</button>
</div>
<script>
function makeNext(pattern) {
var next = [];
next[0] = 0;
for (var i = 0, j = 1; j < pattern.length; j++) {
while (i > 0 && pattern[i] != pattern[j]) {
i = next[i - 1];
}
if (pattern[i] == pattern[j]) {
i++;
}
next[j] = i;
}
console.log(next);
return next;
}
function kmp(str, pattern, next) {
var i = 0;
var j = 0;
for (; i < str.length; i++) {
if (str[i] == pattern[j]) {
if (j == pattern.length - 1)
return i - j;
//console.log(i + "," + j)
j++;
} else {
while (j > 0 && pattern[j] != str[i])
j = next[j - 1];
if (pattern[j] == str[i]) {
j++;
}
}
}
return -1;
}
function strstr(str,pattern){
for(var i=0,j=0;i<str.length;){
if(str[i]==pattern[j]){
if(j==pattern.length){
return i-j;
}
i++;
j++;
}else{
i=i-j+1;
j=0;
}
}
return -1;
}
var vm=new Vue({
el:"#main",
data:{
str:"",
pattern:""
},
methods:{
search:function(){
var next = makeNext(this.pattern);
console.time();
var pos=kmp(this.str, this.pattern, next);
var kmp_time=console.timeEnd();
console.time();
var pos2=this.pattern.indexOf(this.str);
var js_time=console.timeEnd();
console.time();
var pos3=strstr(this.str, this.pattern);
var str_time=console.timeEnd();
}
}
})
</script>