我想问下列两种方法的时间复杂性:
函数remove_duplicates()接受一个UNSORTED列表并删除列表中相同的元素。
代码1
def remove_duplicates(input_list):
result = []
k = -1 # to store the index of current element being checked
for i in input_list:
k += 1
flag = False
for j in range(0,k,+1):
if(input_list[j] == i):
flag = True
if(flag==False):
result.append(i)
else:
continue
return result
CODE 2
def remove_duplicates(input_list):
return list(set(input_list))
答案 0 :(得分:1)
只需使用list(set(input_list))
答案 1 :(得分:1)
由于您要求复杂性,让我们来看看您的第一个解决方案:
外部循环将运行n
次,n
是列表的长度。对于每次迭代,您将再次迭代第一个k
元素。因此,如果我们只计算所有内部循环,我们就有n + (n-1) + (n-2) + … + 2 + 1
次迭代。这是O(n²)。
要检查设定的解决方案,我们必须了解其工作原理。从列表创建集合将仅对列表进行一次迭代。对于我们在列表中找到的每个元素,该元素将添加到集合中。添加到集合是在(平均)恒定时间内完成的。总的来说,这是O(n)。
另一种解决方案是首先对列表进行排序,然后在上迭代以查找重复项。所以我们会X + O(n)
,其中X是排序算法的复杂性。由于我们不能比O(n)更快地排序,这种复杂性将决定完整算法的复杂性。
至于空间复杂性,第一个和第三个可以就地完成,所以我们最多需要恒定的空间。在最坏的情况下,该集合需要O(n)。
答案 2 :(得分:0)
关于优化的问题以及最快的问题"有很多变量,所以你应该总是在你期望代码运行的相同条件下用你的数据来分析它。请考虑以下代码:
import timeit
import random
import functools
def remove_duplicates_manual(input_list):
result = []
k = -1 # to store the index of current element being checked
for i in input_list:
k += 1
flag = False
for j in range(0,k,+1):
if(input_list[j] == i):
flag = True
if(flag==False):
result.append(i)
else:
continue
return result
def remove_duplicates_set(input_list):
return list(set(input_list))
l = [random.randint(0, 10) for x in xrange(1000)]
rd_manual = functools.partial(remove_duplicates_manual, l)
rd_set = functools.partial(remove_duplicates_set, l)
print(timeit.timeit(rd_manual, number=100))
print(timeit.timeit(rd_set, number=100))
此代码生成此输出:
3.648878
0.001779
因此,我们可以得出结论,假定0-10范围内的随机整数列表,set
方法通常会更快,但它可能会因您的数据和系统而异。此外,正如评论和其他答案中所提到的,还有很多方法可以调整您的手动算法以使其更快。
此外,您应该注意到某些数据甚至可能无法使用set
方法。 Python集需要可清除的数据类型(就像字典键一样),因此如果您要对可变数据类型列表(如其他列表)进行排序,则您将无法使用list(set(input_list))
。< / p>