`
regular
  • 浏览: 77658 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

BM方案模式匹配的Java代码实现

    博客分类:
  • Java
阅读更多

速度还算快,例子里比较的文件一共371个,3,293,472字节,比较时间不超过2秒。
不过我的机器也很好,CPU: Athelon 64 X2 Dual 5200+,Mem: 2GB DDR2 667。

package cn.sh.huang;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;

/**
 *
 * @author Huang, Haixu
 */
public class Main
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException,
            IOException
    {
        Calendar c = Calendar.getInstance();
        FileFilter filter = new FileFilter()
        {
            String s = "*.java";
            {
                s = s.replace('.', '#').replaceAll("#", "\\\\.");
                s = s.replace('*', '#').replaceAll("#", ".*");
                s = s.replace('?', '#').replaceAll("#", ".?");
                s = "^" + s + "$";
            }
            Pattern p = Pattern.compile(s);

            public boolean accept(File file)
            {
                return file.isDirectory() ? true : (p.matcher(file.getName()).
                        matches());
            }
        };
        List idxList = checkFolder("C:\\Program Files\\Java\\jdk1.6.0_13\\demo",
                filter, "DocumentEvent".getBytes("US-ASCII"));
        for (int i = 0, size = idxList.size(); i < size; i++) {
            System.out.println(idxList.get(i));
        }
        DateFormat df = DateFormat.getTimeInstance();

        System.out.println("From " + df.format(c.getTime())
                + " to " + df.format(Calendar.getInstance().getTime()));
    }

    private static List checkFolder(String folderName, FileFilter filter,
            byte[] pattern) throws FileNotFoundException, IOException
    {
        File folder = new File(folderName);
        File[] files = folder.listFiles(filter);
        if (files == null) {
            return null;
        }
        List list = new ArrayList();
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            String fileName = file.getAbsolutePath();
            if (file.isDirectory()) {
                List subList = checkFolder(fileName, filter, pattern);
                if (subList != null) {
                    list.addAll(subList);
                }
            } else {
                int[] idxz = checkFile(fileName, pattern);
                if (idxz.length > 0) {
                    StringBuffer sb = new StringBuffer(fileName + "# ");
                    for (int j = 0; j < idxz.length; j++) {
                        sb.append(idxz[j]).append(" ");
                    }
                    list.add(sb.toString());
                }
            }
        }
        return list;
    }

    private static int[] checkFile(String fileName, byte[] pattern) throws
            FileNotFoundException, IOException
    {
        File file = new File(fileName);
        int fileLen = (int) file.length();
        FileInputStream fis = new FileInputStream(file);
        return getPatternIndexz(fis, fileLen, 0, pattern);
    }

    private static int[] getPatternIndexz(FileInputStream fis, int fileLen,
            int index, byte[] pattern) throws IOException
    {
        fis.skip(index);
        final Rule[] rules = getShiftRule(pattern);
        byte[] buffer = new byte[pattern.length];
        List idxList = new ArrayList();
        int shift = pattern.length;

        while (fileLen > shift) {
            int remain = pattern.length - shift;
            if (remain > 0) {
                System.arraycopy(buffer, shift, buffer, 0, remain);
            }
            int readed = 0;
            do {
                readed = fis.read(buffer, remain + readed, shift - readed);
            } while (shift > readed);
            fileLen -= shift;

            shift = match(buffer, pattern, rules);
            if (shift == 0) {
                idxList.add(new Integer(index));
                shift = pattern.length;
            }
            index += shift;
        }
        int[] idxz = new int[idxList.size()];
        for (int i = 0; i < idxz.length; i++) {
            idxz[i] = ((Integer) idxList.get(i)).intValue();
        }
        return idxz;
    }

    private static Rule[] getShiftRule(final byte[] pattern)
    {
        int endPos = pattern.length - 1;
        List idxList = new ArrayList();
        for (int i = endPos - 1; i >= 0; i--) {
            idxList.add(new Integer(i));
        }
        List ruleList = new ArrayList();
        Set flagSet = new HashSet();
        for (int i = endPos; i >= 0 && idxList.size() > 0; i--) {
            byte p = pattern[i];
            List shadowIdxList = new ArrayList();
            for (int j = 0, size = idxList.size(); j < size; j++) {
                int idx = ((Integer) idxList.get(j)).intValue();
                int pos = idx - (endPos - i);
                if (pos < 0) {
                    ruleList.add(new Rule(i, null, endPos - idx));
                } else {
                    byte pp = pattern[pos];
                    if (pp != p) {
                        Byte ppp = new Byte(pp);
                        if (!flagSet.contains(ppp)) {
                            flagSet.add(ppp);
                            ruleList.add(new Rule(i, ppp, endPos - idx));
                        }
                    } else {
                        shadowIdxList.add(idxList.get(j));
                    }
                }
            }
            flagSet.clear();
            idxList = shadowIdxList;
        }
        return (Rule[]) ruleList.toArray(new Rule[ruleList.size()]);
    }

    private static int match(final byte[] buffer, final byte[] pattern,
            Rule[] rules)
    {
        int default_shift = pattern.length;
        for (int i = pattern.length - 1; i >= 0; i--) {
            byte b = buffer[i], p = pattern[i];
            if (b != p) {
                for (int j = 0; j < rules.length; j++) {
                    Rule rule = rules[j];
                    Byte pp = rule.getP();
                    if (pp == null) {
                        default_shift = rule.getShift();
                        continue;
                    }
                    int idx = rule.getIdx();
                    if (i < idx) { // Next rule
                        continue;
                    } else if (i == idx) {
                        if (pp.byteValue() == b) {
                            return rule.getShift();
                        }
                    } else {
                        return default_shift;
                    }
                }
                return default_shift; // No matching rule
            }
        }
        return 0;
    }
}

final class Rule
{
    private final int idx;
    private final Byte p;
    private final int shift;

    public Rule(final int idx, final Byte p, final int shift)
    {
        this.idx = idx;
        this.p = p;
        this.shift = shift;
    }

    /**
     * @return the idx
     */
    public int getIdx()
    {
        return idx;
    }

    /**
     * @return the p
     */
    public Byte getP()
    {
        return p;
    }

    /**
     * @return the shift
     */
    public int getShift()
    {
        return shift;
    }
}

0
0
分享到:
评论

相关推荐

    AC-BM 多模式匹配算法

    **AC-BM 多模式匹配算法** AC-BM(Aho-Corasick-BM)算法是一种结合了Aho-Corasick算法和Boyer-Moore算法的字符串匹配方法,主要用于在一个大文本串中高效地查找多个模式串。这种算法提高了在大量模式下搜索文本的...

    IP搜索--BM模式匹配 代码

    由于你提供的压缩包文件名只包含"IP搜索--BM模式匹配",没有具体的代码内容,无法进一步分析代码实现细节。通常,一个实现BM模式匹配的IP搜索程序会包含以下步骤: 1. 初始化模式和文本字符串,可能是IP地址数组或...

    用C++实现BM的字符串模式匹配算法

    本篇文章将深入探讨如何使用C++实现Bad Character Rule(坏字符规则)和Good Suffix Rule(好后缀规则)来优化Boyer-Moore(BM)字符串匹配算法。BM算法以其高效的性能在文本搜索、数据挖掘等多个领域广泛应用。 ...

    BM模式匹配算法剖析

    ### BM模式匹配算法剖析 #### 一、引言 串的模式匹配,即子串的定位操作,是一种在计算机科学中极为重要的运算。对于给定的正文主串T(长度为n)和模式串P(长度为m),目标是在主串T中找到等于模式串P的子串。...

    BM.rar_bm_模式匹配

    BM算法的核心思想是利用模式串(Pattern)和文本串(Text)之间的不匹配字符位置信息,以减少不必要的比较次数。它包含两个关键的优化策略:坏字符规则(Bad Character Rule)和好后缀规则(Good Suffix Rule)。 1...

    BM模式匹配(利用BM模式匹配字符串)

    **BM模式匹配算法详解** BM(Boyer-Moore)算法是一种高效的字符串搜索算法,由Robert S. Boyer和J Strother Moore于1977年提出。它以其高效性和广泛的应用性在信息技术领域中占有重要地位。BM算法的核心思想是通过...

    BM算法完整实现C代码

    **BM算法完整实现C代码** BM(Boyer-Moore)算法是一种在大文本中高效查找子串的字符串搜索算法,由Robert S. Boyer和J. Strothoff于1977年提出。相比于简单的线性查找,BM算法在处理大量数据时能显著提高查找效率...

    字符串匹配算法-BM算法的实现代码

    **字符串匹配算法-BM算法的实现代码** 在计算机科学领域,字符串匹配算法是寻找一个字符串(称为模式)在另一个较大的字符串(称为文本)中的过程。BM(Boyer-Moore)算法是一种高效的字符串搜索算法,由Robert S. ...

    BM模式匹配算法

    ### BM模式匹配算法详解 #### 一、引言 模式匹配算法是计算机科学中的一个重要分支,在文本检索、信息处理等领域有着广泛的应用。特别是在中文信息处理领域,高效的模式匹配算法能够极大地提升系统的性能。BM...

    多模式匹配算法 AC_BM

    在提供的压缩包文件"AC_BM"中,可能包含了AC_BM算法的实现代码、相关论文、示例和测试数据等资源。学习这些资料,可以深入理解算法的原理和应用,进一步提升在字符串处理和搜索领域的专业技能。

    多模式的字符串匹配算法--AC_BM算法的实现代码

    《多模式字符串匹配算法——AC_BM算法的深度解析与实现》 字符串匹配算法是计算机科学中的一个重要领域,尤其在文本处理、搜索引擎、数据挖掘等领域有着广泛应用。其中,AC_BM算法,即Aho-Corasick算法结合Boyer-...

    常用的BM字符串或者模式匹配算法源代码

    通过理解BM算法的基本原理和C语言实现,你可以编写出自己的字符串匹配程序,有效地解决大数据量下的字符串查找问题。当然,还有其他优化版本的BM算法,如Horspool改进版和Sunday改进版,它们进一步提升了匹配速度。...

    BM字符串匹配算法 源代码

    在提供的压缩包文件"BM(完结版本)"中,应包含BM算法的源代码实现。通过阅读和理解这些代码,你可以更深入地了解BM算法的细节,包括如何构建和使用坏字符表以及如何实现好后缀规则。此外,你可以通过测试不同的输入...

    BM模式匹配算法-原理(图解)

    BM算法被认为是亚线性串匹配算法,它在最坏情况下找到模式所有出现的时间复杂度为O(mn),在最好情况下执行匹配找到模式所有出现的时间复杂度为O(n/m)。

    python实现BM匹配算法

    使用了BM匹配算法计算了左右图像的视差图,本次BM匹配算法是使用python3.7,通过调用opencv库函数实现

    单模式匹配算法 BM

    单模式匹配算法(Boyer-Moore Algorithm,简称BM算法)是计算机科学中用于字符串搜索的一个高效算法,由Robert S. Boyer和J Strother Moore于1977年提出。这个算法在处理大规模文本时表现出了显著的效率,尤其在目标...

    BM模式串匹配C语言实现

    GCC编译可用,该程序支持a-z的字符串(注意空格也不在内),如果查找字段需要扩大,可以修改代码增加范围

    论文研究-一种面向入侵检测的BM模式匹配改进算法.pdf

    BM算法的坏字符规则是指在模式串(pattern)和目标串(text)的匹配过程中,如果发现某个字符在模式串中不存在,则直接将模式串向右移动至该字符之后的位置,因为之前的所有比较都是无效的。 好后缀规则则是指在...

    snort使用的BM模式匹配算法

    **Snort入侵检测系统与BM模式匹配算法** Snort是一款广泛应用的开源网络入侵检测系统(IDS),它能够实时监控网络流量,识别并阻止潜在的攻击行为。BM(Boyer-Moore)模式匹配算法是Snort中用于快速查找可疑模式...

    BM3D.zip_BM3D_BM3D matlab代码_BM3D代码_图像去噪_图像去噪 matlab

    BM3D.zip是一个包含BM3D算法实现的MATLAB代码集合,主要用于图像去噪处理。BM3D(Block-Matching and 3D filtering)是一种基于块匹配和三维滤波的图像去噪方法,由E. A. Yaglom等人在2007年提出。该算法以其出色的...

Global site tag (gtag.js) - Google Analytics