我有一个跟踪流程的方法列表。我想检测是否在循环中调用了任何内容。例如,我可能有
method1
method2
method2
method2
可能会在可能的循环中显示由method1调用的方法2。
method3
method1
methodd
methoda
methodb
methodc
methodd
methoda
methodb
methodc
methodd
在可能的循环中显示'methoda,methodb,methodc,methodd 2次。
显然,不能保证存在循环,但至少我们知道存在重复模式。唯一的输入是子项列表(例如,来自上面的method2,method2,method2)。
答案 0 :(得分:1)
您可以按顺序将子列表插入到链接列表中,然后运行链表循环检测算法。
e.g。有两个指针,一个指针一次移动一个节点,另一个指针一次移动两个节点,如果存在一个循环,速度越快的指针最终将与慢速指针在同一个节点上
答案 1 :(得分:1)
构建后缀数组以及最长公共前缀,并找到值为>的K个连续LCP。阈值(其中K是另一个阈值)
在搜索中,要求找到的后缀'候选LCP在源字符串中是连续的/不重叠。 搜索算法:
let minimum_iterations = 1
let minimum_pattern_length = 2
let src = source string
let suffix = sorted suffix array,
where each entry is suffix i0 (inclusive) to |src| (exclusive)
let lcp = longest common prefixes,
where lcp(i) = longest common prefix of suffix(i) and suffix(i-1) when i > 0,
or 0 if i = 0
for i = 0 to |suffix|:
if lcp[i] < minimum_pattern_length: continue
let j = i
let iterations = 0
let last_matched_i0 = suffix[i-1].i0
while j < |suffix| and lcp[j] >= lcp[i]:
if (suffix[j].i0 + lcp[i] + 1) = last_matched_i0:
iterations++
last_matched_i0 = suffix[j].i0
j++
print 'pattern = ' .. suffix[i][0..lcp[i]] .. ' iterations = ' .. iterations
print 'starting at ' .. suffix[j-1].i0 .. ' to ' .. suffix[i-1].i0 + lcp[i]
skip pattern if wanted
(suffix[j].i0 + lcp[i] + 1) = last_matched_i0
确保匹配的模式是连续的。
我们假设suffix[j]
包含suffix[j-1]
,如果它们都是模式,因为在排序后缀数组ab
中总是会出现abab
实施例: 3ababab65
后缀
排序后缀以及最长公共前缀(LCP - 后缀): LCP(i)是SUFFIX(i)和SUFFIX(i-1)之间最长的公共前缀
LCP候选人:
可能的模式:
您必须稍微修改代码才能处理以下情况:
巴
您的后缀为aba和ababa,LCP为3
或者你可以这样做...... Shortest Repeating Sub-String ... Donno它的效率如何......但更容易。