看到Hey!Linux張貼出的一道面試題
我感覺性能多耗在排序和列表內元素兩兩比較上,我想了另一種思路:源列表生成一個集合,源列表和新集合各項元素總和的差就是重復的那個數,代碼如下:
#!/usr/bin/env python3
arr1 = [i for i in range(1,1000000)]+[500000]
arr4 = set(arr1)
print(sum(arr1)-sum(arr4))
代碼略簡潔,那性能是不是也會更好呢?為了明顯比較兩種算法性能,我將列表范圍擴大到1~1000000,并將重復值設在中位數500000,將他的算法重寫如下:
#!/usr/bin/env python3
arr1 = [i for i in range(1,1000000)]+[500000]
arr4 = sorted(arr1)
i = len(arr4) - 1
for x in range(i):
y = x + 1
if arr4[x] == arr4[y]:
print(arr4[x])
分別測試,結果分別為0.53s和0.70s,我的算總和再相減的方法略快點,不過也不一定,看情況:
當重復值在出現在列表前幾個元素,則列表內兩兩元素比較算法快,因為只需比較前幾個元素就結束;但當重復值越往后,列表內兩兩元素比較的方法相應就更慢了~