首先定义了suffix string 或者说suffix arrary
    如果有个数组是 int[] text = {10, 20, 30, 25}
   那么 suffix[0] = {10, 20, 30, 25} . 涓€浜�-涓夊垎-鍦帮紝鐙鍙戝竷
           suffix[1] = {20, 30, 25}
           suffix[2] = {30, 25}
           suffix[3] = {25}
如果对这些数组进行lexical order 的排序,我们可以得到
suffix[0] < suffix[1] < suffix[3] < suffix[2]
问题是:
    input: int[] text . more info on 1point3acres.com
    output: int[] suffix_array_order
e.g.
input: int[] text = {10, 20, 30, 25} . 鍥磋鎴戜滑@1point 3 acres
output: int[] suffix_array_order = {0, 1, 3, 2}
第二题: input:  int[] text, int[] subText
              output: boolean isExist;
检查text数组中有没有一个subarray 是subText。要求时间小于O(N^2), N == text.length;
这里假设我们有了第一题的 suffix_array_order.

(做法是binary search)

package array;import java.util.Arrays;
import java.util.Comparator;//http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=125284&extra=page%3D4%26filter%3Dsortid%26sortid%3D311%26searchoption%255B3046%255D%255Bvalue%255D%3D2%26searchoption%255B3046%255D%255Btype%255D%3Dradio&page=1
public class SuffixArray {public class Index {int[] suff;int idx;Index(int[] _suff, int _idx) {suff = _suff;idx = _idx;}}// Sortint[] suffixOrder(int[] text, int n) {int[] res = new int[n];Index[] indices = new Index[n];for (int i = 0; i < n; i++) {int[] suffix = Arrays.copyOfRange(text, i, text.length);indices[i] = new Index(suffix, i);}Arrays.sort(indices, new Comparator<Index>() {public int compare(Index i1, Index i2) {int p1 = 0;int p2 = 0;while (p1 < i1.suff.length && p2 < i2.suff.length) {if (i1.suff[p1] != i2.suff[p2]) {return i1.suff[p1] - i2.suff[p2];} else {p1++;p2++;}}if (p2 == i2.suff.length) {return 1;}return -1;}});for (int i = 0; i < n; i++) {res[i] = indices[i].idx;}return res;}// Searchboolean search(final int[] text, int n, final int[] sub_text, int m) {int[] suffix_order = suffixOrder(text, n);int lo = 0;int hi = n - 1;while (lo <= hi) {int mid = (lo + hi) / 2;if (mid + m >= n) {return false;}int[] suffix = Arrays.copyOfRange(text, suffix_order[mid], m);int cmp = compare(suffix, sub_text);if (cmp == 0) {return true;} else if (cmp < 0) {lo = mid + 1;} else {hi = mid - 1;}}return false;}private int compare(int[] a, int[] b) {int i1 = 0, i2 = 0;while (i1 < a.length && i2 < b.length) {if (a[i1] != b[i2]) {return a[i1] - b[i2];} else {i1++;i2++;}}if (i2 == b.length)return -1;return 0;}public static void main(String[] args) {int text[] = { 10, 20, 30, 25 };SuffixArray suffixArray = new SuffixArray();int[] res = suffixArray.suffixOrder(text, 4);for (int i : res) {System.out.print(i);}int sub_text[] = { 20, 30 };boolean search_res = suffixArray.search(text, 4, sub_text, 2);System.out.print(search_res);}
}

suffix arrary相关推荐

  1. 浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)

    编写 Makefile 的时候,很多情况下需要对文件名进行操作.例如获取文件的路径,去除文件的路径,取出文件前缀或后缀等等. 注意:下面的每个函数的参数字符串都会被当作或是一个系列的文件名来看待. 1 ...

  2. matlab gcc4.7,关于gcc-4.7.2 cannot compute suffix of object fil...

    打算学习C++ 11,所以要换编译器,下载了最新的源码后,按常规过程编译: 1.解压缩RPM包: [root@linuxopt]# tar xjvf gcc-4.0.1.tar.bz2 (解压后生成源 ...

  3. Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix)、使用replace函数批量删除列名中的后缀(suffix)

    Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix).使用replace函数批量删除列名中的后缀(suffix) 目录

  4. b. Suffix Zeroes

    b: Suffix Zeroes Time Limit: 1 Sec  Memory Limit: 128 MB Description 这个游戏超休闲的~.现在你需要找一个自然数n,你找的自然数需要 ...

  5. suffix tree

    文章出处:http://www.cnblogs.com/snowberg/archive/2011/10/21/2468588.html 3   What is a Suffix Tree Suffi ...

  6. 2021-01-22 Python TimedRotatingFileHandler 修改suffix后无法自动删除文件

    Python TimedRotatingFileHandler 修改suffix后无法自动删除文件 TimedRotatingFileHandler 用法 "S": Seconds ...

  7. Mybatis的prefix和suffix使用

    语法格式 <trim prefix="" suffix="" suffixOverrides="" prefixOverrides=& ...

  8. Eclipse执行import命令导入maven项目时报错:Add a version or custom suffix using Name template in Advanced set...

    新建了两个maven项目在E盘workspace目录,后面移到workspace/app_engine目录下提交svn,再通过Eclipse的File->import导入时报错了: Projec ...

  9. Python其他数据结构collection模块-namtuple defaultdict deque Queue Counter OrderDict arrary

    nametuple 是tuple扩展子类,命名元组,其实本质上简单类对象 from collections import namedtupleinfo = namedtuple("Info& ...

  10. SpringMVC-组件分析之视图解析器(prefix,suffix)

    SpringMVC的默认组件都是在DispatcherServlet.properties配置文件中配置的: spring-webmvc->org/springframewrok/web/ser ...

最新文章

  1. spring 事务-使用@Transactional 注解(事务隔离级别)
  2. ubuntu下vim语法高亮问题
  3. Shell(Bash)中如何判断是否存在某个命令
  4. git(4)---Git、Repo、Gerrit三者的区别
  5. Office Open XML学习(1)-创建excel文档,并向单元格中插入字符串
  6. UNICODE编码UTF-16 中的Endian(FE FF) 和 Little Endian(FF FE)
  7. JQ怎样返回顶部代码
  8. 盘点2021AI Conference Deadlines及论文写作突击要点
  9. ISO50001认证辅导,ISO50001提高能源利用效率的潜力涉及到产品实现的全过程
  10. 软件测试中的测试进度安排怎么写,测试开发之测试计划
  11. Android国家区号 中英文
  12. 御坂搜索引擎_MisakaTranslator下载|MisakaTranslator御坂翻译器 v2.1 正式整合版下载
  13. 如何根据经纬度获取地址名称
  14. 实现RPG中嵌入赛车游戏任务源代码
  15. stata面板数据gmm回归_stata面板数据回归操作之GMM
  16. 电子木鱼网页版(教学+源码带注释)
  17. Oracle和plsql的卸载与安装
  18. 定制Xposed框架(干货)
  19. 2023年网络安全比赛--Web综合渗透测试中职组(超详细)
  20. 显示器预算有限,是买1080P 144HZ还是买2K 60HZ?

热门文章

  1. 高性能核心板IDO-SOM3908-V1:接口丰富,性能更强,速度更快!
  2. iphone个系列尺寸_iPhone9只是套模iPhone8,这些才是iPhone经典款,你用过哪些?
  3. 打飞机小游戏html代码,JavaScript用200行代码制作打飞机小游戏
  4. 脉内分析从零开始(持续更新)
  5. 基于C#+ASP.NET 毕业设计526套(保持更新)(建议CTRL+D)
  6. 常用计量单位及其换算
  7. QQ邮箱一键删除所有邮件的方法
  8. python报错:Empty suite
  9. 详解显式intent和隐式intent
  10. 卡内基梅隆大学计算机专业有哪些,卡内基梅隆大学计算机系统类大学排名最新资讯总结篇...