Horspool算法(java)随机生成字符串

java代码

import java.util.Scanner;

public class Horspool {
    public static void ShiftTable(char[] p, int[] table){
        for (int i = 0; i < 26; i++) {
            table[i] = p.length;
        }
        for (int i = 0; i < p.length - 1; i++) {
            table[p[i] -'A'] = p.length - 1 - i;
        }
    }
    public static int HorspoolMatching(char[] text, char[] template,int[] table){
        ShiftTable(template, table);
        int i = template.length - 1;
        while(i <= text.length){
            int k = 0;
            while(k < template.length && template[template.length - 1 - k] == text[i-k])
                k++;
            if(k == template.length)
                return i - template.length +1;
            else
                i += table[text[i]-'A'];
        }
        return -1;
    }// Horspool算法
    public static int Matching(char[] text, char[] template){
        for (int i = 0; i < text.length; i++) {
            int k = 0;
            for (; k < template.length; k++) {
                if(text[i+k] != template[k])
                    break;
            }
            if(k == template.length)
                return i;
        }
        return -1;
    } // 蛮力法
    public static String getRandomString(long length) {
        System.out.println("正在生成文本");
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
                long result = 0;
                result = Math.round(Math.random() * 25 + 97);
                sb.append(String.valueOf((char) result));
            }
        System.out.println("成功生成");
        return sb.toString();
    } // 随机生成字符串

    public static void main(String[] args) {
        int[] table = new int[26];
        Scanner in = new Scanner(System.in);

//        System.out.println("输入匹配的文本");
//        String te = in.nextLine();
//        System.out.println("输入匹配的模板");
//        String t = in.nextLine();
        String te = getRandomString(100000000);
        String t = getRandomString(10000);

        te = te.toUpperCase();
        t = t.toUpperCase();
        char[] text = te.toCharArray();
        char[] template = t.toCharArray();

        System.out.println("---------Horspool算法-----------");
        long start1=System.currentTimeMillis();
        int pos1 = HorspoolMatching(text, template, table);
        long end1=System.currentTimeMillis(); //获取结束时间
        if(pos1 == -1)
            System.out.println("没有匹配的字符串!");
        else
            System.out.println("存在匹配的字符串,初始位置为:" + pos1);
        System.out.println("程序运行时间: " + (end1 - start1) + "ms");


        System.out.println("------------蛮力法--------------");
        long start2=System.currentTimeMillis();
        int pos2 = Matching(text, template);
        long end2=System.currentTimeMillis(); //获取结束时间
        if(pos2 == -1)
            System.out.println("没有匹配的字符串!");
        else
            System.out.println("存在匹配的字符串,初始位置为:" + pos2);
        System.out.println("程序运行时间: "+(end2 - start2)+"ms");

    }
}

结果(跑个时间)

原文地址:https://www.cnblogs.com/shish/p/12685731.html