- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是关于 Jon Bentley 的“Programming Pearls”中描述的最长循环子串算法的问题。我记得,他们为输入字符串构建一个后缀数组,对后缀进行排序,然后扫描它们。
看起来最昂贵的步骤是排序。如果我们使用比较排序,则比较次数为 O(N*logN),其中 N 是输入字符串的大小。由于字符串比较是 O(string length),所以排序是 O(N^2)。
有道理吗?
因此,该算法在空间上是 O(N^2) 和 O(N)。可以做得更好吗?
最佳答案
虽然您可以从后缀树构造后缀数组,但这样做没有什么意义。它将消除后缀数组的主要优势(除了一般的简单性之外):极小的内存消耗。
有一种简单的方法可以在 O(n*logn)
时间内对后缀数组进行排序。 (因此,它经常用于各种算法竞赛中,作为复杂后缀尝试的替代方法)
基本思路如下。我们将分阶段对后缀进行排序,在阶段 i
(i = 0, 1, 2, 3, ...
) 中仅第一个 2^i
考虑每个后缀的字符。
按第一个字符对后缀进行排序是微不足道的,对您来说应该没有问题。在这个(“第 0 个”)阶段之后,我们将得到部分排序的后缀数组和另一个数组,其中包含将后缀分区到桶中:每个桶都包含具有相同第一个符号的后缀。
现在,假设我们已经完成阶段 i
并现在处理阶段 i + 1
。我们需要比较属于同一个桶的两个后缀s(t)
和s(q)
。 (让 s(t)
成为原始字符串中从位置 t
开始的后缀。)
由于前 2^i
个字符对它们来说是相同的,我们只需要考虑接下来的 2^i
个字符(因此,总数将是 2^( i+1)
).但是没有第一个 2^i
符号的后缀 s(t)
是 s(t + 2^i)
。因此,我们只需要根据s(t + 2^i)
和s(q + 2^i)
的第一个2^i
进行比较code> 符号,我们已经从阶段 i
获得了这些信息。
结束。第一次实现它可能有点棘手(也是一个很好的练习),但这就是想法。请注意,我们从原始字符串中读取实际字符的唯一时间是步骤 0
。然后,在步骤 i
中,我们只使用步骤 i - 1
的结果。
编辑
This original paper from 1989以更多细节展示了这个想法。 (恕我直言,比理解它所需的更多细节和比需要更复杂的实现。)
关于string - 最长循环子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4473630/
我正在尝试编写一个名为 map-longest 的 Clojure 实用函数(感谢备用名称建议)。该函数将具有以下“签名”: (map-longest fun missing-value-seq c1
为什么我创建了一个重复的线程 我在阅读后创建了这个线程 Longest increasing subsequence with K exceptions allowed .我意识到提出问题的人并没有真
我正在编写一个 Sub 来识别 1 到 1000 之间最长的 Collatzs 序列。由于我刚刚开始学习 VBA,我想知道如何添加过程来计算每个序列的长度。 Sub Collatz() Dim i
我正在编写一个 Sub 来识别 1 到 1000 之间最长的 Collatzs 序列。由于我刚刚开始学习 VBA,我想知道如何添加过程来计算每个序列的长度。 Sub Collatz() Dim i
我正在尝试减去 CSV 中的两列以创建第三列“持续时间”结束时间 - 开始时间 每一行也对应一个用户 ID。 我可以创建一个仅包含“持续时间”列的 csv 文件,但我宁愿将其重定向回原始 csv。 例
我在 2018.04 玩这个最长的 token 匹配,但我认为最长的 token 不匹配: say 'aaaaaaaaa' ~~ m/ | a+? | a+ /; # 「a」
因此,按照规范规定最终用户/应用程序提供的给定变量(200 字节)的字节长度。 使用 python 字符串,字符串的最大字符长度是多少,满足 200 字节,因此我可以指定我的数据库字段的 max_le
我需要针对我们的Jenkins构建集群生成每周报告。报告之一是显示具有最长构建时间的作业列表。 我能想到的解决方案是解析每个从属服务器(也是主服务器)上的“构建历史”页面,对于作业的每个构建,都解析该
我正在构建一个 iOS 应用程序,它将流式传输最长为 15 秒的视频。我阅读了有关 HLS 的好文章,因此我一直在对片段大小为 5 秒的视频进行转码。如果视频的第一部分加载时间太长,那么我们可以在接下
docs for Perl 6 longest alternation in regexes punt to Synopsis 5记录 longest token matching 的规则.如果不同的
我是一名优秀的程序员,十分优秀!