Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果我的函数有两个嵌套的for循环,它是否以二次时间运行?_Python_Python 3.x_Algorithm_Big O - Fatal编程技术网

Python 如果我的函数有两个嵌套的for循环,它是否以二次时间运行?

Python 如果我的函数有两个嵌套的for循环,它是否以二次时间运行?,python,python-3.x,algorithm,big-o,Python,Python 3.x,Algorithm,Big O,我正在学习用大O符号分析算法。我通过Ranum&Miller's工作。其中一项任务如下: def findMinQuad(aList): overallmin = alist[0] for i in aList: issmallest = True for j in a List: if i > j: issmallest = False if issmallest:

我正在学习用大O符号分析算法。我通过Ranum&Miller's工作。其中一项任务如下:

def findMinQuad(aList):
    overallmin = alist[0]
    for i in aList:
        issmallest = True 
        for j in a List: 
            if i > j:
                issmallest = False
        if issmallest: 
                overallmin = i 

    return overallmin
编写两个Python函数来查找列表中的最小值。第一个功能应该是
将每个数字与列表中的其他数字进行比较 您的逻辑是正确的,您分析自己实现的方法的方式正是应该如何实现的

可能让人困惑的是第二个,在这种情况下,您调用的是一些函数,这些函数已经在语言库中实现了。这也有自己的复杂性,在这个例子中是O(n)

如果您想使自己的方法具有线性复杂性,则可以通过以下方式实现:

  • 定义最小变量
  • 循环遍历数组,并将循环中的值与定义的最小值进行比较
  • 如果最小>循环值,则将其重新分配给最小

  • 您的逻辑是正确的,您分析自己实现的方法的方式正是应该如何实现的

    可能让人困惑的是第二个,在这种情况下,您调用的是一些函数,这些函数已经在语言库中实现了。这也有自己的复杂性,在这个例子中是O(n)

    如果您想使自己的方法具有线性复杂性,则可以通过以下方式实现:

  • 定义最小变量
  • 循环遍历数组,并将循环中的值与定义的最小值进行比较
  • 如果最小>循环值,则将其重新分配给最小

  • 您分析和计算算法复杂性的逻辑是正确的。然而,我怀疑你的老师可能不喜欢你写的代码

    线性函数的问题
    def find_min_linear(列表):
    返回最小值(a_列表)
    
    您被要求编写一个函数,返回列表的最小值,为此,您。。。使用python内置函数返回列表的最小值

    这对于任何实际应用都是一个好主意,因为python内置函数可能比您自己编写的任何函数都要快;您可以相信它没有bug,而不是浪费时间检查您自己的代码是否有bug

    但是你的老师可能更感兴趣的是你提出了一个求最小值的算法,而不是你知道已经有一个python内置函数可以做到这一点。
    min
    函数确实是线性的,但该函数的存在只是因为有人能够首先提出一个线性算法,并用它来实现该函数 . 事实上,我发现你的老师没有明确禁止你在这个作业中使用python内置的
    min
    max
    ,这让我很不安。如果我是一名学生,我可能会提到内置函数存在并以线性时间执行,然后我会编写自己的函数而不使用现有函数

    二次函数的问题
    def find_min_quadratic(一个列表):
    最小值=列表[0]
    对于\u列表中的\u编号:
    对于范围内的项目(len(a_列表)):
    如果最小值>一个值:
    最小值=一个最小值
    返回最小值
    
    从技术上讲,你的函数是有效的,它是二次函数。然而,内部for循环很麻烦。从不使用变量
    ;它的唯一目的是确保循环有一个
    n
    迭代(其中
    n
    是列表的长度)。循环体将始终执行完全相同的操作;
    if
    中的条件将始终为true或false;如果它是真的,那么
    min\u number=a\u number
    将一次又一次地将相同的值写入相同的变量

    换句话说:在for循环中重复执行这个
    if
    语句毫无意义;只要执行一次

    def find_min_quadratic(一个列表):
    最小值=列表[0]
    对于\u列表中的\u编号:
    #对于范围内的项目(len(a_列表)):
    如果最小值>一个值:
    最小值=一个最小值
    返回最小值
    
    Tadaaaaaa!只需少一行,算法仍能正确执行并返回列表的最小值

    该算法现在是线性的,而不是二次的。你的老师要你做一个二次算法。您可能认为可以添加一个for循环,使您的算法具有二次性。这在技术上是正确的,但是下面的算法也可以工作:

    def find_min_quadratic(一个列表):
    最小数量=查找最小线性(列表)
    对于范围内的项目(len(a_列表)**2):
    蜂巢=57
    返回最小值
    
    毫无疑问,这个函数是二次函数——我们明确地包含了一个运行
    n^2
    迭代的循环。但是你的老师可能觉得你在取笑他们

    此外,如果你仔细阅读,你的作业文本上会说“第一个函数应该将每个数字与列表中的其他数字进行比较。”。你的二次函数没有这样做

    二次算法 您已经找到了一个线性算法(通过从二次函数中删除一行),所以现在您仍然需要找到一个二次函数。这有点违反直觉,就我个人而言,我非常不喜欢这个任务。编写算法通常遵循以下步骤:

  • 表达问题
  • 找到一个算法来解决这个问题
  • 分析算法的复杂性
  • 找到一种新的算法,以较低的复杂度解决问题
  • 因此,按照这些思路进行的任务将非常有意义:

  • 编写一个函数来查找列表的最小值
  • 分析函数的复杂性
  • 如果你的函数不是线性的,那么写一个新函数来寻找线性时间内列表的最小值
  • 如果你已经找到了线性函数,那么寻找一个效率较低的函数是很尴尬的
    def findMinLin(aList):
        minsofar = aList[0]
        for i in aList:
            if i < minsofar:
                minsofar = i
        return minsofar