【发布时间】:2021-02-22 11:13:07
【问题描述】:
我有一个正整数列表(索引),并希望找到循环(此处:重复相邻的列表元素序列)作为迭代算法的一部分。迭代次数小于10^6。在每次迭代中,列表都会附加一个数字(最初列表为空),并且应检查列表是否有循环。列表大小通常应小于 10^6,通常在 0 - 10^5 范围内,整数可能小于 10^6。
带有循环的列表示例(这里,更一般地说,列表可能超出循环,并且可能包含多个甚至嵌套的循环):
- [0,5,6,1,3,5,6,1,3,8,7,0] --> [5,6,1,3]
- [0,2,4,3,3,3,0,1,6,7] --> [3],[3]
- [2,1,1,3,3,1,1,3,3,4,5] --> [1],[3],[1],[3],[1,1, 3,3]
- [7,6,2,3,2,1,7,1,9,1,7,1,9,0,4] --> [1,7,1,9]
没有循环的列表示例:
- [0,5,6,3,5,6,1,3,8,7,0]
- [0,2,4,0,1,6,7]
- [2,1,3,4,5]
- [7,6,2,3,2,1,7,1,9,1,7,1,0,4]
最快(也可以选择最优雅/pythonic)的方法是什么**
- 查找是否存在循环,返回 True 或 False,然后
- 可选:返回所有循环,有或没有任何类型的循环排序(例如,按列表中第一个循环元素的索引,然后按循环长度)?
【问题讨论】:
-
所以你有一个 10^6 次迭代的循环,每次迭代你要么添加一个数字,要么不添加一个数字到列表中,添加数字后,你想检查循环列表?
-
这是一个非常广泛的问题。请尝试研究问题和现有解决方案。然后通过您尝试过的代码示例来这里解决更具体的问题(如果您遇到任何问题)。
-
我认为有一种方法可以使用后缀树或类似的东西来做到这一点。
-
@fishstix44:不,我不能假设循环长度有限制,除了循环不能大于每次迭代中总列表大小的一半。
-
我不同意这个问题的结束。它的措辞可以更好,但它是关于用于在线检测子序列重复的算法的具体问题。