Python 如果我的函数有两个嵌套的for循环,它是否以二次时间运行?
我正在学习用大O符号分析算法。我通过Ranum&Miller's工作。其中一项任务如下: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:
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