如何在文本编辑器中实现搜索功能? 字符串比较算法 BF算法 RK算法
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算法的更多相关文章
- 字符串匹配Boyer-Moore算法:文本编辑器中的查找功能是如何实现的?---这应该讲的最容易懂的文章了!
关于字符串匹配算法有很多,之前我有讲过一篇 KMP 匹配算法:图解字符串匹配 KMP 算法,不懂 kmp 的建议看下,写的还不错,这个算法虽然很牛逼,但在实际中用的并不是特别多.至于选择哪一种字符串匹 ...
- JavaScript Iframe富文本编辑器中的光标定位
最近在项目中碰到一个比较棘手的问题: 在iframe富文本编辑器中,有个工具栏,这个工具栏在iframe标签之外,工具栏上有一个按钮,点击该按钮向iframe正在编辑中的光标处插入一个图片,图片会插入 ...
- php 解析富文本编辑器中的hmtl内容,富文本样式正确输出
说明:富文本编辑器中的内容在直接获获取后需要解析以后才能在页面中正确显示 我在后端这样处理: $content = htmlspecialchars_decode($info['intro']); h ...
- 在stream流和byte[]中查找(搜索)指定字符串
在 stream流 和 byte[] 中查找(搜索)指定字符串 这里注重看的是两个 Search 的扩展方法,一个是 stream 类型的扩展,另一个是 byte[] 类型的扩展, 如果大家有更好的“ ...
- springboot中使用kindeditor富文本编辑器实现博客功能
kindeditor在之前已经用过,现在在springboot项目中使用.并且也在里面使用了图片上传以及回显等功能. 其实主要的功能是图片的处理:kindeditor对输入的内容会作为html标签处理 ...
- Django中组合搜索功能
需求分析 很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,看个例子吧: 注意红框中的标识,我们可以根据URL来做组合搜索. video- ...
- 如何在文本编辑器中实现时间复杂度O(n/m)的搜索功能? BM算法
//字符串匹配 public class StringCmp { //约定:A主串长 n ,B模式串 长m.要求:在A串中找到B串匹配的下标 //BM算法:从B串和A串尾部开始比较,希望一次将B串向后 ...
- Qt中文本编辑器实现语法高亮功能(Qscitinlla)
Scintilla是一个免费.跨平台.支持语法高亮的编辑控件.它完整支持源代码的编辑和调试,包括语法高亮.错误指示.代码完成(code completion)和调用提示(call tips).能包含标 ...
- EXTJS中整合tinymce的富文本编辑器,添加上传图片功能
提供部分代码.Ext.create('Ext.window.Window', { id: 'wind', title: 'CRUD窗口', modal: true, height: 800, widt ...
随机推荐
- 【重学Node.js 第5篇】部署项目到腾讯云服务器
课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https://github.com/hellozhangran ...
- CURL命令学习一
每天学习一点点.... 直接获取页面数据: curl http://www.xxx.com/[可以指定具体的路径获取某个文件] 用户名(密码): curl -u username http://www ...
- 快速幂取模&快速乘取模
快速幂取模 即快速求出(a^b)mod c 的值.由于当a.b的值非常大时直接求a^b可能造成溢出,并且效率低. 思路 原理就是基于\(a*b \% c = ((a \% c)*(b \% c))\% ...
- 向QGIS项目组提交了一份建议
geopackage中的数据无法重命名的问题,这很怪异啊
- RU/RUR的安装
RU/RUR的安装方法是仍然使用现有的Opatch技术来安装RU/RUR. 更多常见问题,请参考文档: Release Update and Release Update Revisions for ...
- MySQL数据库~~~~~查询行(文件的内容)
1. 单表查询 语法 select distinct 字段 from 库名.表名 where 条件 group by 字段 # 分组 having 筛选 # 过滤 order by 字段 # 排序 l ...
- Linux命令详解 三
Linux用户和组的属性与权限本章结构1.用户账号和组账号概述2.用户账号和组账号管理3.查询账号信息4.查看目录或文件的属性5.设置目录或文件的权限6.设置目录或文件的归属 前言在linux中一切都 ...
- diango下载、创建、启动
下载 命令行 pip install django==1.11.26 -i https://pypi.tuna.tsinghua.edu.cn/simple pycharm 创建项目 命令行 djan ...
- 基于django中间件的编程思想
目录 前言 前期准备 importlib模块介绍 基于django中间件的编程思想 django中settings源码 配置文件的插拔式设计 基于django中间件的思想,实现功能配置 前言 在学习d ...
- Shell—脚本编程进阶
shell脚本进阶之条件语句 条件选择if语句 https://www.runoob.com/?s=shell&page=1 https://www.cnblogs.com/flylinux/ ...