我正在尝试找到一个算法,该算法返回列表中重复对的数量。
实施例: 输入:[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)
答案 0 :(得分:3)
这是一个在O(N)中运行的算法。
答案 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)