【问题标题】:How to build a suffix array in Java 7+ in linear space?如何在 Java 7+ 中在线性空间中构建后缀数组?
【发布时间】:2015-10-02 16:01:09
【问题描述】:

在 Pre-java 7 中,我可以简单地执行以下操作:

public static String[] suffixes(String s)
{
    int N = s.length();
    String[] suffixes = new String[N];
    for (int i = 0; i < N; i++)
    suffixes[i] = s.substring(i, N);
    return suffixes;
}

但是,在 Java 7 中,substring 方法返回一个新字符串。所以占用的空间将是O(n^2),其中n是字符串的长度。

在 Java 7 及更高版本中是否有任何快速简便的方法可以做到这一点?

【问题讨论】:

  • 不是String。不。如果您使用了List&lt;Character&gt;,那么List.subList 是底层List 的视图。
  • 一种方法是拥有我自己的 String 实现,它的行为类似于 Java 6 的实现,但我们肯定可以做得更好吧?
  • 它...总是返回一个新的String...如果您认为自己获得了更好的性能,因为事实并非如此,那您就大错特错了。跨度>
  • @Makoto 是的。但是子字符串didn't copy the underlying data。这在 Java 7 中发生了变化,当时为 substring 复制数据以避免大量 String 的非常短的子字符串导致内存问题。
  • @BoristheSpider 通过实现,我的意思是拥有自己的类来模仿字符串,使用 char 数组或委托给字符串私有 var。

标签: java algorithm suffix-array


【解决方案1】:

你当然可以发明一个抽象数据类型来表示一个“后缀数组”:

  • 用字符串初始化
  • 存储它收到的字符串,仅此而已
  • 根据需要提供访问器方法,例如:
    • size()
    • get(int n) - 返回第 n 个元素
    • equals(int n, String s) - 将第 n 个元素与输入进行比较
    • ...

根据您期望从该结构中获得的功能,以不同的格式存储底层字符串可能是有意义的,例如char[],甚至两者兼而有之。没关系,这将是一个实现细节,封装,对您的 ADT 用户隐藏。首先创建一个interface 并定义它需要支持的方法。

【讨论】:

    【解决方案2】:

    创建您自己的字符串(或后缀)类,如

    http://algs4.cs.princeton.edu/63suffix/SuffixArray.java.html

    【讨论】:

    • 优秀。我有这本书的旧版本,但这本书有更新的代码。
    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2015-10-14
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多