im目前正在开设ds&a udemy课程。我偶然发现了一个提示如下的问题:
“给出列表数组,找出第一个列表数组”
中的第二个列表数组缺少什么整数在课程中提供了两种解决方案,一种被认为是“强力”解决方案,另一种是最优解决方案。
以下是解决方案:
def finderBasic(list1,list2):
list1.sort()
list2.sort()
for i in range(len(list1)):
if list1[i] != list2[i]:
return list1[i]
def finderOptimal(list1,list2):
d = collections.defaultdict(int)
for num in list2:
d[num] = 1
for num in list1:
if d[num] == 0:
return num
else:
d[num] -= 1
本课程说明 finderOptimal 是解决问题的一种更理想的方法,因为它可以解决O(n)或线性问题。有人可以进一步向我解释为什么。我只是觉得 finderBasic 更简单,只经历了一个循环。任何帮助将不胜感激,谢谢!
答案 0 :(得分:1)
您将是正确的,如果只是通过循环,第一个解决方案会更好。 -正如您所说的,一次循环(整个)花费O(n)时间,一次,两次或c次(只要c足够小)都没关系。 / p>
但是,这里的繁重操作正在排序,因为它需要cca n * log(n)时间,该时间大于O(n)。这意味着,即使您在第二个解决方案中两次运行了for循环,也仍然比排序一次更好。
请注意,访问字典键大约需要O(1)时间,因此循环时间仍然是O(n)时间。
引用:https://wiki.python.org/moin/TimeComplexity
基本解决方案对于读者而言可能会更好,因为它非常简单明了,但更为复杂。
答案 1 :(得分:0)
免责声明:我对python不熟悉。
在第一个示例中,您没有考虑两个循环。这些sort()
调用中的每个调用都至少具有两个嵌套循环以实现排序。最重要的是,通常在排序时可以获得的最佳性能是O(n log(n))。
第二种情况避免了所有排序,仅使用“纸牌”来标记存在的内容。此外,它使用作为哈希表的字典。我相信您已经了解到哈希表提供了恒定的时间-O(1)-操作。
简单并不总是意味着最有效。相反,效率通常很难理解。