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. IT兄弟连 HTML5教程 CSS3属性特效 渐变3

    4  径向渐变 CSS3径向渐变是圆形或椭圆形渐变.颜色不再沿着一条直线轴变化,而是从一个起点朝所有方向混合.但相对线性渐变要比径向渐变复杂的多. 径向渐变的格式如下: radial-gradient ...

  2. 计算几何 val.1

    目录 计算几何 val.1 向量的点积 向量的叉积 一种奇怪的三角剖分求面积 凸包 点绕点旋转 后记 计算几何 val.1 本文并不是入门文章,供有高中数学基础的阅读 主要写一些重要的点和注意事项吧 ...

  3. Image 缩略图

    方法一:通过调用Image对象的自带方法GetThumbnailImage()进行图片转换. /// <summary> /// 生成缩略图重载方法,返回缩略图的Image对象 /// & ...

  4. 【坑】Maven [ERROR] 不再支持源选项 5。请使用 6 或更高版本

    在pom.xml文件中添加如下代码: 注意:jdk使用自己下载的版本,我的是13 <properties> <project.build.sourceEncoding>UTF- ...

  5. 卡拉OK歌词原理和实现高仿Android网易云音乐

    大家好,我们是爱学啊,继上一篇讲解了[LRC歌词原理和实现高仿Android网易云音乐],今天给大家带来一篇关于卡拉OK歌词原理和在Android上如何实现歌词逐字滚动的效果,本文来自[Android ...

  6. [20191220]关于共享内存段相关问题.txt

    [20191220]关于共享内存段相关问题.txt --//我一直很好奇如果设置内核参数kernel.shmmax = 68719476736足够大,为什么我的测试实例还是建立3个共享内存段.--// ...

  7. 创建以.xxx开头的文件夹的方法

    在windows下创建以.xxx开头的文件夹时,点击确认,系统提示“必须键入文件名”. 最方便的方法: (1)新建文件夹 (3)在文件名.xxxxx后再加一个.,也就是把文件名改成这样子:.XXXXX ...

  8. Spring学习的第三天

    问题分析:在刚开始进行银行转账案例时,会获取四个连接,分别是查询接入.转出账户.更新转入.转出账户.这样会使转账不同步,如果某一处出现异常,前面的代码执行了,而后面的更新却没执行,导致一个账户加钱而另 ...

  9. windows命令行pip报错解决的方法

    今天在新电脑安装python,发现pip无效了,于是乎百度了很多方法,发现原因是pip升级导致的 解决办法,卸载pip重新安装 可以首先执行  python -m ensurepip  然后执行 py ...

  10. MySQL常用DDL、DML、DCL语言整理

    DDL ----Data Definition Language 数据库定义语言 如 create procedure之类 创建数据库 CREATE DATABASE [IF NOT EXISTS] ...