- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试了解 Karkkainen, P. Sanders 对线性时间后缀数组创建算法的实现。算法详情可见here .
我设法理解了整体概念,但未能将其与提供的实现相匹配,因此无法清楚地掌握它。
这是让我感到困惑的初始代码路径。
根据论文:n0、n1、n2 表示从 i mod 3 = (0,1,2) 开始的三元组数
根据代码:n0 = (n + 2)/3,n1 = (n + 1)/3,n2 = n/3; => 这些初始化是如何导出的?
根据论文:我们需要创建 T`,它是 i mod 3 != 0 处的三元组串联
根据代码:n02 = n0 + n2; s12 = [n02] ==> n02 怎么来的?它应该是 n12 即 n1 + n2。
根据代码:for (int i = 0, j = 0; i < n + (n0 - n1); i++) 用三元组填充 s12 使得 i%3 != 0; => 为什么 for 循环运行 n + (n0 - n1) 次?它应该只是 n1 + n2。不应该?
由于这些,我无法继续进行 :( 请提供帮助。
最佳答案
考虑以下示例,其中输入的长度为 n=13:
STA | CKO | WER | FLO | W
As per code : n0 = (n + 2) / 3, n1 = (n + 1) / 3, n2 = n / 3; => How these initialisations has been derived?
请注意,如果 n mod3 = 0,则 i mod3 = 0 的三元组数为 n/3,否则为 n/3+1(如果 n mod3 = 1 或 n mod3 = 2)。在当前示例中,n/3 = 4,但由于最后一个三元组“W”不完整,因此不计入整数除法。直接进行此计算的“技巧”是使用 (n+2)/3。实际上,如果 n mod3 = 0,则整数除法 (n+2)/3 和 n/3 的结果将相同。但是,如果 n mod3 = 1 或 2,则 (n+2)/3 的结果将为 n/3+1。 n1、n2也一样。
As per code : n02 = n0 + n2; s12 = [n02] ==> How came n02? It should be n12 i.e n1 + n2. As per code : for (int i = 0, j = 0; i < n + (n0 - n1); i++) fill s12 with triplets such that i%3 != 0; => Why for loop runs for n + (n0 - n1) times ? It should be simply n1 + n2. Should't be ?
两个问题的答案相同。在我们的例子中,我们有一个像这样的 B12 缓冲区:
B12 = B1 U B2 = {TA KO ER LO}
所以您首先对后缀进行排序,最后得到一个 B12 的后缀数组,它有 8 个元素。要进行合并步骤,我们首先需要计算 B0 的后缀数组,它是通过对元组 (B0(i),rank(i+1)) 进行排序而获得的...但是最后一个三元组具有的具体情况只有一个元素(W)有问题,因为没有为 B0 的最后一个元素定义 rank(i+1):
B0 = {0,3,6,9,12}
按字母顺序排序的结果是
SA0 = {3, 9, 0, ?, ?}
由于索引 6 和 12 包含一个 'W',按字母顺序排序是不够的,我们需要检查哪个在排名表中排在第一位,所以让我们检查它们后缀的排名.. 哦,等等! rank(13) 未定义!
这就是为什么当最后一个三元组仅包含一个元素时(如果 n mod3 = 0),我们将虚拟 0 添加到输入的最后一个三元组。因此,无论 n1 的大小如何,B12 的大小都是 n0+n2,如果 B0 大于 B1(在这种情况下 n0-n1 = 1),则需要向 B12 添加一个额外的元素。
希望一切都清楚。
关于string - 了解 DC3/Skew 算法的实现以创建后缀数组线性时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26042482/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!