亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

KMP算法的Java實現例子以及測試分析

2019-11-17 04:17:45
字體:
來源:轉載
供稿:網友

 背景簡介:KMP算法用來處理字符串匹配的。給你A,B兩個字符串,檢查B串是否是A串的子串,類似于java的String.indexOf("")。之所以叫做KMP,是因為這個算法是由Knuth、Morris、PRatt三個提出來的,取了這三個人的名字的頭一個字母。

原理介紹:找到匹配失敗時的最合適的回退位置,而不是簡單的回退到子串的第一個字符(常規的枚舉查找方式,是簡單的回退到子串的第一個字符,接下來準備寫一篇KMP算法的性能分析Java實現實例),即可提高查找的效率。因此為了找到這個合適的位置,先對子串預處理,從而得到一個回退位置的數組。過多的理論就不介紹了。

總體而言比較簡單,KMP算一個經典的算法例子,很多筆試、面試也會問起?,F總結一下,放在這里供大家參考、交流,希望對大家有所幫助,下面直接給出實現例子,測試與分析也包含其中。

一、一個文件源代碼

KMP.java

 

源代碼為:

package algorithm.kmp;

/**
 * KMP算法的Java實現例子與測試、分析
 * @author 崔衛兵
 * @date 2009-3-25
 */
public class KMP {
 /**
  * 對子串加以預處理,從而找到匹配失敗時子串回退的位置
  * 找到匹配失敗時的最合適的回退位置,而不是回退到子串的第一個字符,即可提高查找的效率
  * 因此為了找到這個合適的位置,先對子串預處理,從而得到一個回退位置的數組
  * @param B,待查找子串的char數組
  * @return
  */
 public static int[] preProcess(char [] B) {
  int size = B.length;
  int[] P = new int[size];
  P[0]=0;
  int j=0;
  //每循環一次,就會找到一個回退位置
  for(int i=1;i<size;i++){
   //當找到第一個匹配的字符時,即j>0時才會執行這個循環
   //或者說p2中的j++會在p1之前執行(限于第一次執行的條件下)
   //p1
   while(j>0 && B[j]!=B[i]){
    j=P[j];
   }
   //p2,由此可以看出,只有當子串中含有重復字符時,回退的位置才會被優化
   if(B[j]==B[i]){
    j++;
   }
   //找到一個回退位置j,把其放入P[i]中
   P[i]=j;
  }
  return P;
 }
 
 /**
  * KMP實現
  * @param parStr
  * @param subStr
  * @return
  */
 public static void kmp(String parStr, String subStr) {
  int subSize = subStr.length();
  int parSize = parStr.length();
  char[] B = subStr.toCharArray();
  char[] A = parStr.toCharArray();
  int[] P = preProcess(B);
  int j=0;
  int k =0;
  for(int i=0;i<parSize;i++){
   //當找到第一個匹配的字符時,即j>0時才會執行這個循環
   //或者說p2中的j++會在p1之前執行(限于第一次執行的條件下)
   //p1
   while(j>0 && B[j]!=A[i]){
    //找到合適的回退位置
    j=P[j-1];
   }
   //p2 找到一個匹配的字符
   if(B[j]==A[i]){
    j++;
   }
   //輸出匹配結果,并且讓比較繼續下去
   if(j==subSize){
    j=P[j-1];
    k++;
    System.out.printf("Find subString '%s' at %d/n",subStr,i-subSize+1);
   }
  }
  System.out.printf("Totally found %d times for '%s'./n/n",k,subStr);
 }
 
 public static void main(String[] args) {
  //回退位置數組為P[0, 0, 0, 0, 0, 0]
  kmp("abcdeg, abcdeh, abcdef!這個會匹配1次","abcdef");
  //回退位置數組為P[0, 0, 1, 2, 3, 4]
  kmp("Test ititi ititit! Test ititit!這個會匹配2次","ititit");
  //回退位置數組為P[0, 0, 0]
  kmp("測試漢字的匹配,崔衛兵。這個會匹配1次","崔衛兵");
  //回退位置數組為P[0, 0, 0, 1, 2, 3, 4, 5, 6]
  kmp("這個會匹配0次","it1it1it1");
 }
}

二、輸出結果

Find subString 'abcdef' at 16
Totally found 1 times for 'abcdef'.

Find subString 'ititit' at 11
Find subString 'ititit' at 24
Totally found 2 times for 'ititit'.

Find subString '崔衛兵' at 8
Totally found 1 times for '崔衛兵'.

Totally found 0 times for 'it1it1it1'.

三、總結

總體而言,KMP算法通過找到合適的回退位置從而可以提高匹配效率,但是如果匹配位置都是第一個字符呢?例如測試代碼中的

//回退位置數組為P[0, 0, 0, 0, 0, 0]
kmp("abcdeg, abcdeh, abcdef!這個會匹配2次","abcdef");

接下來準備寫一篇KMP算法的性能分析Java實現實例,下文再見。^_^


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人福利网站在线观看11| 国产成人精品国内自产拍免费看| 色噜噜久久综合伊人一本| 午夜精品久久久99热福利| 国产欧美日韩最新| 91丨九色丨国产在线| 插插插亚洲综合网| 不卡av日日日| 国产精品18久久久久久首页狼| 欧美精品在线观看91| 日韩精品在线观看一区| 成人久久精品视频| 久久久爽爽爽美女图片| 国产综合久久久久久| 亚洲精品99999| 欧美孕妇毛茸茸xxxx| 久久久久久亚洲精品中文字幕| 国产精品黄视频| 亚洲黄色www| 国产日韩综合一区二区性色av| 91精品久久久久久久久中文字幕| 国产精品久久精品| 亚洲欧美中文日韩v在线观看| 午夜美女久久久久爽久久| 亚洲色无码播放| 国产精品高精视频免费| 日韩视频精品在线| 欧美日韩国产91| 国产精品网红福利| 亚洲一区二区中文| 日韩亚洲在线观看| 国产精品成久久久久三级| 国产精品人人做人人爽| 欧美性xxxxxxx| 久久国内精品一国内精品| 中文字幕日韩综合av| 久久av资源网站| 久久激情视频免费观看| 一本色道久久综合狠狠躁篇怎么玩| 成人网在线视频| 亚洲欧美制服第一页| 91国产视频在线播放| 欧美成人午夜激情视频| 亚洲精品一区中文字幕乱码| 国产日韩在线看| 久久人人爽人人爽人人片av高请| 亚洲福利在线观看| 亚洲新声在线观看| 国产成人高清激情视频在线观看| 亚洲石原莉奈一区二区在线观看| 国产精品永久免费观看| 久久97久久97精品免视看| 欧美成人一区在线| 欧美大片第1页| 久久久久国产一区二区三区| 国产精品福利观看| 国模吧一区二区| 日韩av理论片| 亚洲精品在线不卡| 欧美性色xo影院| 久久久影视精品| 欧美一级淫片videoshd| 欧美二区在线播放| 久久久久久久久久久免费精品| 久久国产精品久久国产精品| 欧美亚洲在线播放| 91精品视频专区| 国产精品视频999| 久久久国产精彩视频美女艺术照福利| 91热精品视频| 69视频在线播放| 国产精品电影在线观看| 日韩一级黄色av| 国产一区二区av| 成年人精品视频| 国产日韩欧美综合| 欧美成年人视频网站| 亚洲最大的av网站| 久久99亚洲热视| 国产成人精品综合久久久| 中文字幕久热精品在线视频| 色综合伊人色综合网站| 日韩有码在线电影| 日韩精品在线播放| 亚洲影院污污.| 国产成人精品视| 国产婷婷色综合av蜜臀av| 亚洲影视中文字幕| 久久久国产一区二区| 欧美日韩一区二区在线| 亚洲成人在线视频播放| 国产a∨精品一区二区三区不卡| 亚洲人在线观看| 欧美在线视频免费播放| 久久91精品国产91久久久| 久久综合久久八八| 社区色欧美激情 | 国自在线精品视频| 92裸体在线视频网站| 国产精品jvid在线观看蜜臀| www高清在线视频日韩欧美| 亚洲18私人小影院| 亚洲欧美激情一区| 欧美精品电影免费在线观看| 69久久夜色精品国产69| 国产在线观看精品一区二区三区| 久久亚洲国产成人| 亚洲人成在线观看| 中文字幕日韩在线视频| 欧美日韩国产一区二区| 成人午夜激情网| 日韩在线视频观看| 亚洲理论电影网| 国产精品99久久久久久久久久久久| 欧美精品免费在线观看| 午夜精品www| 亚洲小视频在线观看| 国产欧美一区二区三区在线看| 国产热re99久久6国产精品| 97精品视频在线观看| 久久影院模特热| 色99之美女主播在线视频| 久久亚洲综合国产精品99麻豆精品福利| 欧美视频在线观看 亚洲欧| 国产成人精品日本亚洲专区61| 日韩成人在线电影网| 91精品国产乱码久久久久久蜜臀| 亚洲国产高潮在线观看| 国内精品久久久久影院 日本资源| 伊人久久免费视频| 久久久久五月天| 国产91露脸中文字幕在线| 国产亚洲欧洲高清| 久热在线中文字幕色999舞| 国产经典一区二区| 久久久久久尹人网香蕉| 欧美日韩亚洲网| 萌白酱国产一区二区| 久久精品小视频| 97av在线影院| 日韩精品视频中文在线观看| 欧美色xxxx| 国产亚洲精品美女久久久久| 九色精品免费永久在线| 久久九九精品99国产精品| 97久久久免费福利网址| 国产精品专区h在线观看| 久久免费少妇高潮久久精品99| 午夜精品久久久久久99热软件| 久久久久久久一区二区| 国产成人亚洲综合| 中文字幕成人在线| 国产成人高潮免费观看精品| 色噜噜久久综合伊人一本| 美日韩精品免费视频| 久久99热精品这里久久精品| 国产日本欧美在线观看| 国产69精品久久久| 中文字幕免费精品一区| 精品国产91乱高清在线观看| 国产欧美一区二区白浆黑人| 欧美成人h版在线观看| 精品国产91久久久久久| 亚洲第一视频网站|