如何在文本编辑器中实现搜索功能? 字符串比较算法 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 ...
随机推荐
- numpy代码片段合集
生成shape为(num_examples, num_inputs),符合0-1分布的数据. np.random.normal(0, 1, (num_examples, num_inputs))
- php 将科学计算法得出的结果转换成原始数据 NumToStr
由于php最大只支持显示 15位因的数据运算,大于15位的2数加减乘除的数据的结果,会直接用科学计数法显示, 但在现实生活中,科学计数法不利于普通人识别,所以,本函数将:科学计数法的出的结果转换成原始 ...
- JavaWeb学习——在Eclipse里使用Tomcat
JavaWeb学习——在Eclipse里使用Tomcat 摘要:本文主要学习了如何在Eclipse里使用Tomcat服务器. 添加Tomcat 打开Eclipse的配置页面,点击菜单上的“Window ...
- border-box和CSS3 calc()解决盒模型加边框或边距后尺寸变大的问题
box-sizing box-sizing的CSS属性是用来改变默认的CSS框模型 属性 初始值:content-box 适用于:接受的所有元素的宽度或高度 继承:无 媒体:visual 指定的:as ...
- 一些webpack常见编译报错的解决方案
重新安装依赖可以解决80%的webpack编译报错问题. rm -rf node_modules rm package-lock.json npm cache clear --force npm in ...
- 从零开始搭建solo个人博客系统
目录 1.博客系统的搭建流程 2.服务器选购 2.1阿里云学生主机 2.2普通云主机 3.域名购买与备案(可选) 3.1域名购买 3.2域名服务器备案 3.3域名服务器解析 4.solo安装 4.1 ...
- 分布式全局唯一ID生成策略
一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题. ...
- C#&.Net干货分享- 构造BaiduLanguageHelper对接百度的语言翻译
全部是封装的API源码... namespace Frame.Api{ /// <summary> /// 百度多语言支持器 /// </summary> ...
- Linux 文件系统简介(FHS:Filesystem Hierarchy Standard)
一,linux的目录结构 /bin:所有用户都可以使用的可执行程序 /sbin:系统管理员使用的可执行程序 /boot:引导加载器必须用到的静态文件:kernel,initramfs,grub等. / ...
- 生成对抗性网络GAN
同VAE模型类似,GAN模型也包含了一对子模型.GAN的名字中包含一个对抗的概念,为了体现对抗这个概念,除了生成模型,其中还有另外一个模型帮助生成模型更好地学习观测数据的条件分布.这个模型可以称作判别 ...