1.暴力比较 BF算法

2.比较字串hash值 RK算法

//字符串匹配
public class StringCmp {
//约定:A主串长 n ,B模式串 长m。要求:在A串中找到B串匹配的下标
//
//1.BF burst force 暴力比较,逐个字符比较
//2.RK 以hash算法为主,比较字符串 //1.BF 时间复杂度 O(n*m)
//在A中进行 A[0,n-m] 范围内的 n-m+1 次的 m个字符比较
//平时最容易理解的方式
public static int BF(char[] a, char[] b) {
for (int i = 0; i < a.length - b.length + 1; i++) {
for (int j = 0; j < b.length; j++) {
if (a[i + j] != b[j])
break;
else if (j + 1 == b.length)
return i;
}
}
return -1;
}

   //2.RK 算法
static final int R = 256; //26进制
static long[] RpowN = new long[4];
static boolean inited; //在A串中 从一个起始位置i,选取 A[i]~A[i+m] 共m个字符,计算其hash值(h1) i+m 不超过A的最大长度,也就是 i = [0,n-m] 范围
//hash算法为 字符的取值个数,如只考虑a-z,共26个字母,算作R进制(26进制),那么一个3个字符的字符串的hash为 a1*R^2 + a2*R^1 + a3*R^0 (a1为高位,a3为低位)
//随着 i自增1,向后移动一个起始位置后,还是做同样的hash计算(h2)
//此时发现有规律 h2=(h1-a1*R^m-1)* R + a4*R^0
//所以把A扫一遍计算 hash,在对每次算到的hash和 hashB 比较,一致说明有字符串匹配,如果考虑hash碰撞,则再次挨个比较字符即可(BF算法)
//时间复杂度 O(n)
public static int RK(char[] a, char[] b) {
int m = b.length;
RKinit(m);
long hashB = RKHash(b, 0, m);
long[] hashA = new long[a.length - b.length + 1]; hashA[0] = RKHash(a, 0, m);
if (hashA[0] == hashB)
return 0;
for (int i = 1; i < hashA.length; i++) {
hashA[i] = (hashA[i - 1] - (a[i - 1] * RpowN[m - 1])) * R + a[i + m - 1];
if (hashA[i] == hashB)
return i;
}
return -1;
} private static void RKinit(int blen) {//初始化R的N次方的缓存表,之后直接根据[N]做下标查询,比每次计算效率更高
long[] tmp;
int startI = 2;
if (blen > RpowN.length) {
tmp = new long[blen];
startI = RpowN.length;
RpowN = tmp;
System.arraycopy(RpowN, 0, tmp, 0, RpowN.length);
inited = false;
}
if (inited == false) {
RpowN[0] = 1;
RpowN[1] = R;
for (int i = startI; i < RpowN.length; i++)
RpowN[i] = (long) Math.pow(R, i);
inited = true;
}
} public static long RKHash(char[] a, int off, int len) {
long hashR = 0;
for (int i = 0; i < len; i++) { //从高位到低位 a1*R^len + a2*R^len-1 + ....alen*R^0
hashR += RpowN[len - i - 1] * a[off + i];
}
return hashR;
} public static void main(String[] args) {
char[] a = "abcdefg".toCharArray();
char[] b = "def".toCharArray();
System.out.println("BF(a,b) " + BF(a, b)); System.out.println("RK(a, b) " + RK(a, b));
}
}
BF(a,b) 3
RK(a, b) 3

如何在文本编辑器中实现搜索功能? 字符串比较算法 BF算法 RK算法的更多相关文章

  1. 字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!

    关于字符串匹配算法有很多,之前我有讲过一篇 KMP 匹配算法:图解字符串匹配 KMP 算法,不懂 kmp 的建议看下,写的还不错,这个算法虽然很牛逼,但在实际中用的并不是特别多.至于选择哪一种字符串匹 ...

  2. JavaScript Iframe富文本编辑器中的光标定位

    最近在项目中碰到一个比较棘手的问题: 在iframe富文本编辑器中,有个工具栏,这个工具栏在iframe标签之外,工具栏上有一个按钮,点击该按钮向iframe正在编辑中的光标处插入一个图片,图片会插入 ...

  3. php 解析富文本编辑器中的hmtl内容,富文本样式正确输出

    说明:富文本编辑器中的内容在直接获获取后需要解析以后才能在页面中正确显示 我在后端这样处理: $content = htmlspecialchars_decode($info['intro']); h ...

  4. 在stream流和byte[]中查找(搜索)指定字符串

    在 stream流 和 byte[] 中查找(搜索)指定字符串 这里注重看的是两个 Search 的扩展方法,一个是 stream 类型的扩展,另一个是 byte[] 类型的扩展, 如果大家有更好的“ ...

  5. springboot中使用kindeditor富文本编辑器实现博客功能

    kindeditor在之前已经用过,现在在springboot项目中使用.并且也在里面使用了图片上传以及回显等功能. 其实主要的功能是图片的处理:kindeditor对输入的内容会作为html标签处理 ...

  6. Django中组合搜索功能

    需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL来做组合搜索. video- ...

  7. 如何在文本编辑器中实现时间复杂度O(n/m)的搜索功能? BM算法

    //字符串匹配 public class StringCmp { //约定:A主串长 n ,B模式串 长m.要求:在A串中找到B串匹配的下标 //BM算法:从B串和A串尾部开始比较,希望一次将B串向后 ...

  8. Qt中文本编辑器实现语法高亮功能(Qscitinlla)

    Scintilla是一个免费.跨平台.支持语法高亮的编辑控件.它完整支持源代码的编辑和调试,包括语法高亮.错误指示.代码完成(code completion)和调用提示(call tips).能包含标 ...

  9. EXTJS中整合tinymce的富文本编辑器,添加上传图片功能

    提供部分代码.Ext.create('Ext.window.Window', { id: 'wind', title: 'CRUD窗口', modal: true, height: 800, widt ...

随机推荐

  1. webpack动态加载打包chunk命名

    最近,遇到复杂h5页面开发,为了优化H5首屏加载速度,想到使用按需加载的方式,减少首次加载的JavaScript文件体积,于是将处理过程在这里记录一下,涉及到的主要是以下三点: 使用Webpack如何 ...

  2. Jmeter常用的两大性能测试场景

    一.阶梯式场景 该场景主要应用在负载测试里面,通过设定一定的并发线程数,给定加压规则,遵循“缓起步,快结束”的原则,不断地增加并发用户来找到系统的性能瓶颈,进而有针对性的进行各方面的系统优化. 使用到 ...

  3. jQuery 源码解析(二十五) DOM操作模块 html和text方法的区别

    html和text都可以获取和修改DOM节点里的内容,方法如下: html(value)     ;获取匹配元素集合中的一个元素的innerHTML内容,或者设置每个元素的innerHTML内容,   ...

  4. XNginx升级记录

    之前的博文提到过,XNginx - nginx 集群可视化管理工具, 开发完成后一直稳定运行,直到前面因为一个站点的proxy站点配置问题,导致需要修改nginx 配置文件模板,因此借此机会对系统做了 ...

  5. netcore 2.2 使用 AutoMapper 实现实体之间映射

    一.什么是AutoMapper? AutoMapper是一个简单的对象映射框架(OOM),将一个对象映射到另一个对象. 二.AutoMapper的好处 以前的时候我们将DTO对象转换为Model对象时 ...

  6. ribbon客户端负载均衡

    Ribbon简介 参考:https://blog.csdn.net/chengqiuming/article/details/80711168 Ribbon是Netflix发布的负载均衡器,它有助于控 ...

  7. VUE脚手架使用

    什么是vue脚手架?   他是一个快速构建vue项目的工具,通过他,我们可以将vue所需要的文件安装完成. vue-cli这个构建工具大大降低了webpack的使用难度,支持热更新,有webpack- ...

  8. RocketMQ 升级到主从切换(DLedger、多副本)实战

    目录 1.RocketMQ DLedger 多副本即主从切换核心配置参数详解 2.搭建主从同步环境 3.主从同步集群升级到DLedger 3.1 部署架构 3.2 升级步骤 3.3 验证消息发送与消息 ...

  9. C#深入浅出之数据类型

    基本数据类型        C#支持完整的BCL(基类库)名字,但是最好都统一使用关键字进行使用与开发,比如使用int而不是System.Int32,以及使用string类型时候应当使用string而 ...

  10. (转)Skyline timeseries异常判定算法

    原文链接:https://jiroujuan.wordpress.com/2013/10/09/skyline-anomalous-detect-algorithms/ Skyline内部提供了9个预 ...