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

首頁 > 編程 > Java > 正文

java實現sunday算法示例分享

2019-11-26 15:47:25
字體:
來源:轉載
供稿:網友

字符串匹配查找算法中,最著名的兩個是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。兩個算法在最壞情況下均具有線性的查找時間。但是在實用上,KMP算法并不比最簡單的C庫函數strstr()快多少,而BM算法則往往比KMP算法快上3-5倍(未親身實踐)。但是BM算法還不是最快的算法,這里介紹一種比BM算法更快一些的查找算法Sunday算法。

Sunday算法的思想和BM算法中的壞字符思想非常類似。差別只是在于Sunday算法在匹配失敗之后,是取目標串中當前和Pattern字符串對應的部分后面一個位置的字符來做壞字符匹配。當發現匹配失敗的時候就判斷母串中當前偏移量+Pattern字符串長度+1處(假設為K位置)的字符在Pattern字符串中是否存在。如果存在,則將該位置和Pattern字符串中的該字符對齊,再從頭開始匹配;如果不存在,就將Pattern字符串向后移動,和母串k+1處的字符對齊,再進行匹配。重復上面的操作直到找到,或母串被找完結束。動手寫了個小例子來實現以下這個算法。

在代碼中,實現了兩種字符串匹配算法,一種是Sunday方式,一種是普通的每次移動一位的方式,二者的效率對比在main函數中有,都是納秒級別。算法的詳細步驟,在代碼中已經添加了相應的注釋。關于BM算法,下次空了再一起對照著分析。

復制代碼 代碼如下:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * @author Scott
 * @date 2013年12月28日
 * @description
 */
public class SundySearch {
    String text = null;
    String pattern = null;
    int currentPos = 0;

    /**
     * 匹配后的子串第一個字符位置列表
     */
    List<Integer> matchedPosList = new LinkedList<Integer>();

    /**
     * 匹配字符的Map,記錄改匹配字符串有哪些char并且每個char最后出現的位移
     */
    Map<Character, Integer> map = new HashMap<Character, Integer>();

    public SundySearch(String text, String pattern) {
        this.text = text;
        this.pattern = pattern;
        this.initMap();
    };

    /**
     * Sunday匹配時,用來存儲Pattern中每個字符最后一次出現的位置,從左到右的順序
     */
    private void initMap() {
        for (int i = 0; i < pattern.length(); i++) {
            this.map.put(pattern.charAt(i), i);

        }
    }

    /**
     * 普通的字符串遞歸匹配,匹配失敗就前進一位
     */
    public List<Integer> normalMatch() {
        //匹配失敗,繼續往下走
        if (!matchFromSpecialPos(currentPos)) {
            currentPos += 1;

            if ((text.length() - currentPos) < pattern.length()) {
                return matchedPosList;
            }
            normalMatch();
        } else {
            //匹配成功,記錄位置
            matchedPosList.add(currentPos);
            currentPos += 1;
            normalMatch();
        }

        return matchedPosList;
    }

    /**
     * Sunday匹配,假定Text中的K字符的位置為:當前偏移量+Pattern字符串長度+1
     */
    public List<Integer> sundayMatch() {
        // 如果沒有匹配成功
        if (!matchFromSpecialPos(currentPos)) {
            // 如果Text中K字符沒有在Pattern字符串中出現,則跳過整個Pattern字符串長度
            if ((currentPos + pattern.length() + 1) < text.length()
                    && !map.containsKey(text.charAt(currentPos + pattern.length() + 1))) {
                currentPos += pattern.length();
            }else {
                // 如果Text中K字符在Pattern字符串中出現,則將Text中K字符的位置和Pattern字符串中的最后一次出現K字符的位置對齊
                if ((currentPos + pattern.length() + 1) > text.length()) {
                    currentPos += 1;
                } else {
                    currentPos += pattern.length() - (Integer) map.get(text.charAt(currentPos + pattern.length()));
                }
            }

            // 匹配完成,返回全部匹配成功的初始位移
            if ((text.length() - currentPos) < pattern.length()) {
                return matchedPosList;
            }

            sundayMatch();
        }else {
            // 匹配成功前進一位然后再次匹配
            matchedPosList.add(currentPos);
            currentPos += 1;
            sundayMatch();
        }
        return matchedPosList;
    }

    /**
     * 檢查從Text的指定偏移量開始的子串是否和Pattern匹配
     */
    public boolean matchFromSpecialPos(int pos) {
        if ((text.length()-pos) < pattern.length()) {
            return false;
        }

        for (int i = 0; i < pattern.length(); i++) {
            if (text.charAt(pos + i) == pattern.charAt(i)) {
                if (i == (pattern.length()-1)) {
                    return true;
                }
                continue;
            } else {
                break;
            }
        }

        return false;
    }

    public static void main(String[] args) {
        SundySearch sundySearch = new SundySearch("hello 啊啊 阿道夫 adfsadfklf adf234masdfsdfdsfdsfdsffwerwrewrerwerwersdf2666sdflsdfk", "adf");

        long begin = System.nanoTime();
        System.out.println("NormalMatch:" + sundySearch.normalMatch());
        System.out.println("NormalMatch:" + (System.nanoTime() - begin));

        begin = System.nanoTime();
        System.out.println("SundayMatch:" + sundySearch.sundayMatch());
        System.out.println("SundayMatch:" + (System.nanoTime() - begin));

    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本一欧美一欧美一亚洲视频| 亚洲精品久久久久中文字幕二区| 97涩涩爰在线观看亚洲| 国产精品9999| 日韩av在线高清| 国产精品v日韩精品| 国产亚洲欧美一区| 国产精品无码专区在线观看| 最新亚洲国产精品| 成人欧美一区二区三区黑人| 亚洲国产成人久久| 高清一区二区三区四区五区| 国产日韩精品视频| 亚洲最新中文字幕| 久久久久久久激情视频| 欧美精品一区二区免费| 7777精品视频| 久久久91精品国产一区不卡| 国产欧洲精品视频| 一区国产精品视频| 亚洲成人精品视频| 亚洲的天堂在线中文字幕| 日韩一区在线视频| 欧美激情日韩图片| 久久的精品视频| www.欧美三级电影.com| 丝袜美腿亚洲一区二区| 国产视频精品va久久久久久| 国产精品亚洲欧美导航| 国产精品免费小视频| 按摩亚洲人久久| 欧美巨大黑人极品精男| 少妇高潮久久77777| 成人a视频在线观看| 91香蕉嫩草影院入口| 日韩女优人人人人射在线视频| 91在线国产电影| 亚洲精品xxxx| 国产欧美va欧美va香蕉在线| 欧美激情伊人电影| 日韩在线视频二区| 一个色综合导航| 久久这里只有精品视频首页| 欧美激情三级免费| 日韩精品在线第一页| 亚洲成人动漫在线播放| 成人av色在线观看| 亚洲精品一区在线观看香蕉| 日韩欧美国产高清91| 91精品免费久久久久久久久| 亚洲精品一区二三区不卡| 日韩欧美中文免费| 久久6免费高清热精品| 久久夜色撩人精品| 日韩福利伦理影院免费| 中文字幕一区二区精品| 亚洲日本成人网| 亚洲a区在线视频| 国产精品无av码在线观看| 欧美日韩999| 欧洲精品久久久| 日韩美女中文字幕| 成人高清视频观看www| 亚洲在线免费观看| 国产精品第一第二| 国产精品高清在线| 国内精品久久久久久久久| 欧美另类在线观看| 亚洲国产精品999| 日韩中文字幕免费看| 性欧美激情精品| 国产免费一区视频观看免费| 一区二区亚洲欧洲国产日韩| 成人免费在线视频网站| 亚洲国产欧美精品| 亚洲第一视频网| 久久精品精品电影网| 欧美夫妻性生活视频| 国产视频精品一区二区三区| 91黑丝高跟在线| 国产午夜精品全部视频在线播放| 日韩精品欧美激情| 国产99久久精品一区二区永久免费| 国产欧美日韩精品丝袜高跟鞋| 日韩少妇与小伙激情| 日韩二区三区在线| 久久久久久久久久久av| 欧美日本啪啪无遮挡网站| 午夜精品久久久久久久99热| 日韩高清中文字幕| 久久的精品视频| 久久精品国产成人| 亚洲欧美激情精品一区二区| 亚洲人成电影在线播放| 91精品久久久久久久久青青| 久久免费在线观看| 中文字幕国产精品久久| 国产精品美女久久久久av超清| 欧美精品久久久久| 亚洲第一天堂av| 自拍亚洲一区欧美另类| 成人国产精品色哟哟| 中文字幕不卡av| 久久久国产视频91| 欧美国产日韩一区二区三区| 日韩高清有码在线| 欧美成人免费一级人片100| 国产精品成人品| 久青草国产97香蕉在线视频| 日韩精品极品毛片系列视频| 国产日韩亚洲欧美| 色www亚洲国产张柏芝| 欧美成人精品激情在线观看| 亚洲精品视频免费| 欧美一级大片视频| 国产手机视频精品| 久久久这里只有精品视频| 欧美日韩xxx| 精品欧美一区二区三区| 国产亚洲人成网站在线观看| 亚洲无线码在线一区观看| 国产精品久久99久久| 亚洲精品98久久久久久中文字幕| 黑人欧美xxxx| 亚洲国产精品成人精品| 在线观看国产精品日韩av| 日韩精品视频中文在线观看| 尤物九九久久国产精品的分类| 国产精品久久久久久中文字| 亚洲欧美自拍一区| 青草青草久热精品视频在线观看| 精品在线欧美视频| 91探花福利精品国产自产在线| 欧美日韩美女视频| 韩剧1988在线观看免费完整版| 亚洲欧美制服丝袜| 亚洲图片欧美日产| 最近2019年手机中文字幕| 国产丝袜一区视频在线观看| 亚洲综合视频1区| 国产精品精品一区二区三区午夜版| 欧美夫妻性视频| 中文字幕日韩综合av| 久久亚洲国产精品成人av秋霞| 免费91麻豆精品国产自产在线观看| 日韩精品在线免费| 欧美激情一级欧美精品| 日韩大胆人体377p| 欧美高清自拍一区| 亚洲tv在线观看| 久久香蕉国产线看观看av| 自拍偷拍亚洲欧美| 91免费国产视频| 亚洲午夜精品视频| 国产精品成人av性教育| 亚洲一区二区国产| 国产精品流白浆视频| 亚洲精品aⅴ中文字幕乱码| 国产噜噜噜噜噜久久久久久久久| 欧美理论电影在线播放| 亚洲人成电影网站色…| 一区二区三区美女xx视频| 97在线观看视频国产| 久久久天堂国产精品女人|