打击函数的时间复杂度是多少?

哪个函数的时间复杂度较低?为什么?我想比较 python 中的两个列表,但我不知道哪个函数比其他函数更快。

def compare_with_set(list1, list2):
    return list(set(list1) & set(list2))


def compare_with_zip(list1, list2):
    return [i for i, j in zip(list1, list2) if i == j]


def compare_with_for(list1, list2):
    list3 = []
    for item in list1:
        if item in list2:
            list3.append(item)
    return list3


a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]

compare_with_set(a, b)
compare_with_zip(a, b)
compare_with_for(a, b)

回答

TL; 博士

在现实世界中,这取决于您使用的数据。小规模的方法之间的差异可以忽略不计,而大规模的方法之间的差异却很大。

大 O 符号

话虽这么说,如果你正在寻找类似的理论大O符号,那么我们就来看看如何list()set()zip()实施。一个非常基本的经验法则是将范围内的每个循环视为n有序n,然后进行加法、乘法等
。例如,该函数compare_with_for()的复杂度为 O(n^2),因为它迭代 list1 (n) 并且对于每个元素遍历 list2 (n) 所以 n*n=O(n^2)。

编辑:用户在评论中回答了其他大 O 近似值。像Dor Meiri这样的用户,他们的努力值得称赞。我不会把他们的答案改写成我的,所有的功劳都是他们的。

Python 中的执行时间

并且为了计时您的代码的执行,您可以简单地使用timeittime.perf_counter 按照用户Dor Meiri 的建议来执行

以下是使用后者的方法:

import time

def compare_with_set(list1, list2):
    return list(set(list1) & set(list2))


def compare_with_zip(list1, list2):
    return [i for i, j in zip(list1, list2) if i == j]


def compare_with_for(list1, list2):
    list3 = []
    for item in list1:
        if item in list2:
            list3.append(item)
    return list3


a = [1, 2, 3, 4, 5]
b = [9, 8, 7, 6, 5]

start = time.perf_counter()
compare_with_set(a, b)
end = = time.perf_counter()
duration_compare_with_set = end - start

start = time.perf_counter()
compare_with_zip(a, b)
end = = time.perf_counter()
duration_compare_with_zip = end - start

start = time.perf_counter()
compare_with_for(a, b)
end = = time.perf_counter()
duration_compare_with_for = end - start

编辑1:更改time.time()time.perf_counter()所建议多尔美日。

编辑 2:改进格式。

  • It is better to use time.perf_counter() instead of time.time() for measuring duration
  • @rmaleki compare_with_set is O(n) in average and O(n^2) in worst case (set creation is O(n), set iteration is O(n), set search is O(1) in the average case and O(n) in worst case) compare_with_zip is O(n) in worst case (because iteration is O(n), appending and comparing is O(1))

以上是打击函数的时间复杂度是多少?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>