【问题标题】:Python find duplicate adjacent sequences in list [closed]Python在列表中找到重复的相邻序列[关闭]
【发布时间】: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:不,我不能假设循环长度有限制,除了循环不能大于每次迭代中总列表大小的一半。
  • 我不同意这个问题的结束。它的措辞可以更好,但它是关于用于在线检测子序列重复的算法的具体问题。

标签: python list cycle


【解决方案1】:

这是我能给的最好的。

from math import floor
sample = samples[0]
def find_max_seq(sample):
    max_possible_size_ans = floor(len(sample)/2)
    possible_size_ans = list(range(1,max_possible_size_ans+1))
    max_idx = len(sample)-1
    outs = []
    for size in possible_size_ans:
        last_idx= 0
        start_idx = 0
        while last_idx < max_idx :
            first_pair = sample[start_idx:start_idx+size]
            second_start = start_idx+size
            second_pair = sample[second_start:second_start+size]
            if first_pair == second_pair:
                outs.append(first_pair)
            start_idx +=1
            last_idx = second_start+size
            
    return outs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2022-01-05
    相关资源
    最近更新 更多