如何实现一个文章中 Ctrl+F的搜索

现在有一篇文档,文档内容如下(为了书写方便,文档尽可能短小):

String str= “Java的字符类String、StringBuffer”

算法实现如下:

我们创建上面str.length()长度的数组

 String[] strs = new String[str.length()];

我们通过以下方式把文档存放到数组中

strs[0]= Java的字符类String、StringBuffer
strs[1]= ava的字符类String、StringBuffer
strs[2]= va的字符类String、StringBuffer
strs[3]= a的字符类String、StringBuffer
strs[4]= 的字符类String、StringBuffer
strs[5]= 字符类String、StringBuffer
strs[6]= 符类String、StringBuffer
strs[7]= 类String、StringBuffer
strs[8]= String、StringBuffer
strs[9]= tring、StringBuffer
strs[10]= ring、StringBuffer
strs[11]= ing、StringBuffer
strs[12]= ng、StringBuffer
strs[13]= g、StringBuffer
strs[14]= 、StringBuffer
strs[15]= StringBuffer
strs[16]= tringBuffer
strs[17]= ringBuffer
strs[18]= ingBuffer
strs[19]= ngBuffer
strs[20]= gBuffer
strs[21]= Buffer
strs[22]= uffer
strs[23]= ffer
strs[24]= fer
strs[25]= er
strs[26]= r

把生成的数组进行排序

strs[0]= Buffer
strs[1]= Java的字符类String、StringBuffer
strs[2]= StringBuffer
strs[3]= String、StringBuffer
strs[4]= ava的字符类String、StringBuffer
strs[5]= a的字符类String、StringBuffer
strs[6]= er
strs[7]= fer
strs[8]= ffer
strs[9]= gBuffer
strs[10]= g、StringBuffer
strs[11]= ingBuffer
strs[12]= ing、StringBuffer
strs[13]= ngBuffer
strs[14]= ng、StringBuffer
strs[15]= r
strs[16]= ringBuffer
strs[17]= ring、StringBuffer
strs[18]= tringBuffer
strs[19]= tring、StringBuffer
strs[20]= uffer
strs[21]= va的字符类String、StringBuffer
strs[22]= 、StringBuffer
strs[23]= 字符类String、StringBuffer
strs[24]= 的字符类String、StringBuffer
strs[25]= 符类String、StringBuffer
strs[26]= 类String、StringBuffer

如何计算上面有序数组的第一个字符在文档中的位置:

 index = 整个文档的长度-数据中元素的字符长度

举例如下:
例如上面的:

  strs[1]= “Java的字符类String、StringBuffer”;
  // 那么在文档的开始位置为 index = 0;
  strs[4]= ava的字符类String、StringBuffer;
  // 那么在文档的开始位置为 index = 1;

说了那么多,如何实现Ctrl+F了?

对上面拍好序的数组,进行二分搜索即可
举例 如何找到”String”
strs[0]= Buffer
strs[1]= Java的字符类String、StringBuffer
strs[2]= StringBuffer
strs[3]= String、StringBuffer
strs[4]= ava的字符类String、StringBuffer
strs[5]= a的字符类String、StringBuffer
strs[6]= er
strs[7]= fer
strs[8]= ffer
strs[9]= gBuffer
strs[10]= g、StringBuffer
strs[11]= ingBuffer
strs[12]= ing、StringBuffer
strs[13]= ngBuffer
strs[14]= ng、StringBuffer
strs[15]= r
strs[16]= ringBuffer
strs[17]= ring、StringBuffer
strs[18]= tringBuffer
strs[19]= tring、StringBuffer
strs[20]= uffer
strs[21]= va的字符类String、StringBuffer
strs[22]= 、StringBuffer
strs[23]= 字符类String、StringBuffer
strs[24]= 的字符类String、StringBuffer
strs[25]= 符类String、StringBuffer
strs[26]= 类String、StringBuffer

总结

以上用到的技术是: 倒排索引技术

你可能感兴趣的:(算法)