Python 如何在O(n)复杂度的列表中查找同一元素位置的差异(对于所有元素)

Python 如何在O(n)复杂度的列表中查找同一元素位置的差异(对于所有元素),python,python-3.x,Python,Python 3.x,我必须找出相同元素(对于所有元素)在O(n)复杂度中的位置差异? 假设我得到了列表[1,3,0,1,3,0,1] 然后1的位置差是3,3,6(所有一对之间的差) 因为0等于3 三等于三 我尝试使用字典来存储索引,但为了找到差异,我必须迭代所有索引,从而增加复杂性如果给定的数字重复atmost 2次,那么hashmap解决方案是最好的,它将在O(n)中给出答案 如果数字重复超过2次,则可以使用hashmap(元素作为键,其所有索引作为列表)并将元素的所有索引存储到其中。现在,只需在hashmap上

我必须找出相同元素(对于所有元素)在O(n)复杂度中的位置差异? 假设我得到了列表
[1,3,0,1,3,0,1]
然后
1
的位置差是
3,3,6
(所有一对之间的差) 因为0等于3 三等于三


我尝试使用字典来存储索引,但为了找到差异,我必须迭代所有索引,从而增加复杂性

如果给定的数字重复atmost 2次,那么hashmap解决方案是最好的,它将在O(n)中给出答案

如果数字重复超过2次,则可以使用hashmap(元素作为键,其所有索引作为列表)并将元素的所有索引存储到其中。现在,只需在hashmap上迭代,以计算所有事件之间的差异(最大值或最小值)

例:[1,0,1,3,3,0,1] 输出->[0,2][3,1][1,2]

这将需要O(n)时间迭代数组,O(m)时间迭代hashmap,其中m是重复的元素数。所以,基本上,算法将在线性时间内工作

def distance(lis,n):
    mp = dict()
    visited = dict() #only to store difference of first and second                               
                     #occurrence  difference
    answer = list()
    for i in range(n):
        if lis[i] in mp and not in visited:
            answer.append([lis[i],i-mp[lis[i]]])
            visited[lis[i]] = 1
        else:
            mp[lis[i]] = i

    return answer #contains number and difference as tuples
如果你想要所有的差异,这是最理想的情况,因为你需要配对,因此它不能在少于O(n**2)的时间内完成

请查看此项以获取解释


使用itertools中的熊猫和组合:

import pandas as pd
from itertools import combinations

l = [1,3,0,1,3,0,1]
s = pd.Series(l)
s.groupby(s).apply(lambda x: [j-i for i,j in combinations(x.index, 2)]).to_dict()
输出:

{0: [3], 1: [3, 6, 3], 3: [3]}

让我从一个事实开始,'3,3,6'中的'6'是丰富的信息,因为它来自之前的'3,3'。所以我不打算在我的输出中包含它,因为它增加了输出长度的平方,超过了您将发现的相同类型的对的数量。 您可以在O(n)中找到相邻'1'的所有距离,对吗?
您还可以为所有相邻的一个或两个或三个(或任何固定/有限数量的数字)执行此操作。您可以简单地将整个算法重复3次。问题是,您的列表中可能有“len(list)”个不同的整数,而在O(n)中则不可能这样做。在后一种情况下,您的簿记/内存大小为O(n),由于您需要查看列表中的每个元素并访问簿记以请求标识号的最后索引,因此您需要访问O(1)中的正确信息,我想这是不可能的。或者是否有一个智能数据结构允许这种情况?

输出失败[1,3,0,1,3,0,1],实际上这取决于不同的情况。正如您没有提到的,我们需要第一次和第二次出现的索引或最小索引。因此,方法将是相同的,只是您需要根据需求修改它。就像我使用一个访问过的hashmap来查看元素是否已经计数超过了无需。您正在搜索的解决方案在O(n)中是不可能的,因为您需要对每个重复的元素进行配对。从而使一对元素m-1重复m次。在这里,O(n**2)复杂性将起作用。使用HASMAP会使我们的解决方案更快。SohamNathani回答了任何问题,你会考虑接受吗?
{0: [3], 1: [3, 6, 3], 3: [3]}