数据结构和算法最佳解决方案说明

时间:2020-09-06 06:31:04

标签: algorithm data-structures

我正在为即将到来的秋天准备大量招募做准备,因此

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 更简单,只经历了一个循环。任何帮助将不胜感激,谢谢!

2 个答案:

答案 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)-操作。

简单并不总是意味着最有效。相反,效率通常很难理解。