有效地找到重复对的数量

时间:2017-02-02 04:58:17

标签: python algorithm performance iteration big-o

我正在尝试找到一个算法,该算法返回列表中重复对的数量。

实施例: 输入:[13,4,8,4,13,7,13,9,13] 输出:7 (4 13' s出来6对,2个4' s出1对)

我的算法可以提高效率吗?我希望它比Theta(n ^ 2)

更快

这就是我所拥有的:

my_List=[13,3,8,3,13,7,13,9,13]

pairs=0
alreadySeen=[]

for element in my_List:
  howMany=0
  if element in alreadySeen:
    False
   else:
    howMany=my_List.count(element)
    pairs=pairs+((howMany*(howMany-1))/2)
    howMany=0
    alreadySeen.append(element)

print(pairs)

5 个答案:

答案 0 :(得分:3)

这是一个在O(N)中运行的算法。

  1. 迭代元素一次,创建每个元素及其计数的字典。 您的示例的此步骤的输出是{13:4,4:2,8:1,...}
  2. 迭代该dict并计算每个元素的对数。每个元素的对数可以被认为是从N个元素的列表中选择2个项目。这可以通过使用公式(N *(N-1))/ 2计算combinations而不重复来完成。因此对于4个元素,有(4 * 3)/ 2 = 6对。

答案 1 :(得分:2)

@Hesham Attia已经提供了正确的算法,这是Counter的简单实现:

>>> from collections import Counter
>>> l = [13,4,8,4,13,7,13,9,13]
>>> sum(x * (x - 1) // 2 for x in Counter(l).values())
7

答案 2 :(得分:0)

这是一个javascript代码,你可以把它转换为phython代码,复杂度是线性的~O(n)

this

答案 3 :(得分:0)

这是一种简单有效的方法,用于查找列表中所有可能的重复对,时间复杂度为O(N)。

l = [13,3,8,3,13,7,13,9,13]
# Two pairs of 13 and One pair of 3
# Sum equals to Three
alreadySeen = []
total_no_of_pairs = 0
for i in range(len(l)):
    if l[i] not in alreadySeen:
        alreadySeen.append(l[i])
    else:
        # If element l[i] is present in alreadySeen list
        # Indicates a Pair and increments count
        # Remove element for creating a new pair
        total_no_of_pairs +=1
        alreadySeen.remove(l[i])

print(total_no_of_pairs)

输出:

3

答案 4 :(得分:0)

时间复杂度:O(N)

arr = list(map(int,input().split()))
    d = {}
    for i in range(len(arr)):
        if arr[i] in d.keys():
            d[arr[i]] += 1
        else:
            d[arr[i]] = 1
    ans = 0
    for val in d.values():
        if val > 1:
            ans += val*(val-1)//2
    print(ans)