- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
“canonize”函数(下面给出,来自 Ukkonen 的论文)是如何工作的,特别是 while 循环何时结束?我认为 p' - k' 的值将始终小于 p - k 的值。我是对还是错?
procedure canonize(s, (k, p)):
1. if p < k then return (s, k)
2. else
3. find the tk–transition g'(s, (k', p')) = s' from s;
4. while p' − k' <= p − k do
5. k = k + p' − k' + 1;
6. s = s';
7. if k <= p then find the tk–transition g'(s, (k', p')) = s' from s;
8. return (s, k).
最佳答案
什么 canonize
函数的作用是在 this SA post 的最后描述的,我们考虑这样的情况:
情况是这样的:
活跃点在(red,'d',3)
,即 defg
中的三个字符边从红色节点出去。
现在我们跟随绿色节点的后缀链接。理论上,我们的事件节点现在是(green,'d',3)
.
不幸的是,那个点不存在,因为 de
从绿色节点出来的边只有 2 个字符。 因此,我们应用 canonize
功能。
它的工作原理是这样的:
我们感兴趣的边的起始字符是d
.此字符在 Ukkonen 的表示法中称为 tk。因此,“找到 tk-edge”意味着找到 de
绿色节点处的边。
这条边的长度只有两个字符。 IE。 (p' - k') == 2
在 Ukkonen 的符号中。但原来的边缘有三个字符:(p - k) == 3
.所以<=
为真,我们进入循环。
我们从 def
缩短我们正在寻找的边至 f
.这就是p := p + (k' - p') + 1
步骤确实如此。
我们前进到状态 de
边缘指向,即蓝色状态。那就是s := s'
会。
自剩余部分f
的边不为空(k <= p
),我们识别相关的出边(即fg
出蓝色节点的边)。此步骤将 k' 和 p' 设置为全新的值,因为它们现在引用字符串 fg
,它的长度 (p' - k') 现在将为 2。
剩余边的长度f
, (p - k), 现在为1,候选边的长度fg
对于新的事件点,(p' - k') 是 2。因此循环条件
同时 (p' - k') <= (p - k) 做
不再为真,因此循环结束,新的(正确的)事件点确实是 (blue,'f',1)
.
[实际上,在 Ukkonen 的表示法中,一条边的结束指针 p 指向该边的最后一个字符的位置,而不是它后面的位置。因此,严格来说,(p - k)是0,不是1,(p' - k')是1,不是2。但重要的不是长度的绝对值,而是两者不同的相对比较长度。]
一些最后的说明:
像 p 和 k 这样的指针指的是原始输入文本 t 中的位置。这可能非常令人困惑。例如,de
中使用的指针绿色节点处的边将引用一些 子串de
t 的指针,以及 fg
中使用的指针蓝色节点处的边将引用一些 子串fg
吨。尽管字符串 defg
必须作为一个连续的字符串出现在 t 中的某处,子字符串 fg
也可能出现在其他地方。所以,fg
的指针 k edge 不一定 de
的结束指针 p边加一。
因此,当我们决定是否结束循环时,重要的不是绝对位置 k 或 p,而是剩余边的长度 (p - k) 与长度 (p' - k' ) 当前候选边。
在你的问题中,代码片段的第 4 行,有一个错字:它应该是 k'
而不是 k;
.
关于string - Ukkonen 后缀树 : procedure 'canonize' unclear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10097323/
我有 3 个表: 1. 学生:{id, name, roll} 2. 主题:{id, name} 3. 分数:{student_id, subject_id, marks} 我有一个返回所有学生及其分
我将制作一款完全由程序生成的空间/交易/战斗游戏。但是,我知道将整个星系的所有细节存储在内存中是不可行的。因此,我一直认为我可以使用种子来生成太阳系,并且从该太阳系,您可以使用跳跃门前往其他太阳系。问
我有一个关于 ADS 中存储过程的性能的问题。我创建了一个具有以下结构的简单数据库: CREATE TABLE MainTable ( Id INTEGER PRIMARY KEY,
我想将这个简单的东西加载到我的编辑器中: Write:-repeat,write("hi"),nl,fail. 所以它打印“嗨”。 我该怎么办? 我目前正在尝试做 File->New 并将名为 Wri
在从 c# 调用过程中显示以下错误 "Procedure or function 'CALL get_Users()'cannot be foundin database 'joomla'."` 代码
在网上找到了创建存储过程的教程,只是不明白到底什么时候需要执行创建存储过程。 是否应该在每次重新启动 MySQL 服务器时执行存储过程创建? 我是否需要在每次启动我的应用程序时都执行存储过程创建sql
我有一个包含所有例程的 MySQL 转储。当我恢复时,只有存储过程没有恢复。我从中提取 Dump 的 MySQL 版本是 5.0.77-log,我恢复到的版本是 5.6.12。 感谢任何帮助。 谢谢
我是一家大量使用存储过程(500+)的公司的新手。为了帮助学习系统,我希望有一种简单的方法来构建一个树型列表,显示系统中的所有存储过程以及它们自己调用哪些存储过程......从而创建可以执行的存储过程
我需要使用 mysqldump 和 replace 而不是 insert 并且在恢复时不删除数据库和表。但我需要删除并重新创建触发器和存储过程 为此,我将 mysqldump 与 --replace
在执行代码的过程中,我在不同的Scheme实现中遇到以下错误: Racket : application: not a procedure; expected a procedure that ca
我想将存储过程输出参数映射到一个实体。 例如, PROCEDURE ForExample @ID int, @LastUpdate datetime OUTPUT AS Update EntityTa
假设我有“myStoredProcedure”,它接受一个 Id 作为参数,并返回一个信息表。 是否可以编写类似于此的 SQL 语句? SELECT MyColumn FROM Tabl
我想将整个 sql 查询作为词法参数传递给存储过程,然后执行它。任何建议如何做到这一点? 最佳答案 你可以试试这个: create or replace procedure my_proc(pstri
考虑以下测试用例: { CompilerVersion = 21 } procedure Global(); procedure Local(); begin end; type TP
在 Azure Cosmos Db 中,是否可以从另一个存储过程调用一个存储过程?那么UDF呢?我可以从另一个 UDF、存储过程或触发器调用一个 UDF吗? 最佳答案 is there a way t
在 Azure Cosmos Db 中,是否可以从另一个存储过程调用一个存储过程?那么UDF呢?我可以从另一个 UDF、存储过程或触发器调用一个 UDF吗? 最佳答案 is there a way t
在 LINQ to Entities 中,我将存储过程的结果集映射到实体。 在存储过程中,我执行一些更新语句并通过运行 SELECT 查询并将结果集映射到实体来返回结果集。 数据库行得到正确更新,但返
创建存储过程时,BEGIN/END 块是否有用途? 例如, CREATE PROCEDURE SPNAME AS SELECT * FROM TABLE 对比 CREATE PROCEDURE S
正如您在下面看到的,我的过程有两个参数。我希望它们都是整数。但是,当我使用非整数测试该过程时,它仍然可以编译!为什么? create procedure int_arith( p_1 int, p_
我有一个 Client类(class)。在那个类里面有一个数组 losses .首先,我创建并使用客户端填充 clientsColl大批。然后对于该数组中的每个客户端,我填充其 losses大批。 然
我是一名优秀的程序员,十分优秀!