Algorithm 如何在数据流中查找循环/重复?

Algorithm 如何在数据流中查找循环/重复?,algorithm,data-structures,Algorithm,Data Structures,我在一次采访中遇到了一个有趣的问题。但我无法回答,也无法在谷歌上找到 问题如下: 您将获得一个数据流。在变量声明的帮助下,您可以发现数据中是否存在重复或循环 数据流的示例包括: 100100100100 0001000100010001 100100010001 10...0010....010....01(where 0....0 is 0^10^10^10) 如何解决这个问题?有解决此类问题的算法吗?蛮力解决方案将使用地图或字典,即,对于stream100100,它将是: dict["1"

我在一次采访中遇到了一个有趣的问题。但我无法回答,也无法在谷歌上找到

问题如下:

您将获得一个数据流。在变量声明的帮助下,您可以发现数据中是否存在重复或循环

数据流的示例包括:

100100100100
0001000100010001
100100010001
10...0010....010....01(where 0....0 is 0^10^10^10)

如何解决这个问题?有解决此类问题的算法吗?

蛮力解决方案将使用地图或字典,即,对于stream
100100
,它将是:

dict["1"]++
dict["10"]++
dict["100"]++
dict["1001"]++
等,直到找到重复的最大长度。然后我们删除第一个符号并重复,即删除
1
,剩下
00100
进行分析:

dict["0"]++
dict["00"]++
dict["001"]++
dict["0010"]++
等等

最后,我们在映射上迭代并打印具有多个值的所有键


有更有效的算法,但我想这是最简单的。

我认为解决这个问题必须有两种方法

1。最长重复子串问题

这是一个众所周知的问题,它在线性时间内有解。您必须为字符串构造
后缀树
,然后对其进行分析。 详情请查收

2。重复子串问题(任何)


您可以修改
最长重复子字符串
以查找任何重复子字符串。

它适用于字符串,是的,但我很好奇,它适用于流吗?如果您可以等待流结束,您可以对整个流数据使用此算法。若您必须在流时动态地执行此操作,我认为您可以修改前缀树构造算法,然后动态地添加新元素。并在每次提供新数据时进行检查stream@Gor当然,一切都是可以修改的,但是你提到的算法并不完全适合所描述的问题…@为什么不,我们只需要一个缓冲区大小
max\u len\u of\u repeation\u to\u find
,它将用作滑动窗口……是的,它将与一个额外的参数(如max\u len\u of \u repeation\u to\u find)一起工作。但我很好奇,因为OP没有提到任何这样的参数。