如何计算Python函数的算法复杂性?
当需要显示算法的效率时,我们需要显示函数的算法复杂性——等等。在Python代码中,如何显示或计算函数的边界?通常,无法通过编程实现这一点(您会遇到停止问题) 如果您不知道从何处开始,您可以通过使用各种大小的输入运行一些基准测试(例如,使用如何计算Python函数的算法复杂性?,python,complexity-theory,big-o,Python,Complexity Theory,Big O,当需要显示算法的效率时,我们需要显示函数的算法复杂性——等等。在Python代码中,如何显示或计算函数的边界?通常,无法通过编程实现这一点(您会遇到停止问题) 如果您不知道从何处开始,您可以通过使用各种大小的输入运行一些基准测试(例如,使用时间模块)来了解函数将如何执行。您甚至可以收集足够的数据来怀疑运行时可能是什么。但这并不能给你一个严格的答案——为此,你需要从数学上证明你怀疑的界限事实上是正确的 例如,如果我在玩排序函数,并且观察到时间的增加大致与输入大小的平方成比例,我可能会怀疑这种排序的
时间
模块)来了解函数将如何执行。您甚至可以收集足够的数据来怀疑运行时可能是什么。但这并不能给你一个严格的答案——为此,你需要从数学上证明你怀疑的界限事实上是正确的
例如,如果我在玩排序函数,并且观察到时间的增加大致与输入大小的平方成比例,我可能会怀疑这种排序的复杂性是O(n**2)
。但这并不构成证据——特别是,一些在典型输入下表现良好的算法具有病态输入,导致性能非常差
为了证明界限实际上是
O(n**2)
,我需要看看算法在最坏的情况下做了什么——在本例中,我可能在分析一个选择排序,它重复地扫描列表的整个未排序部分,并选择最低的未排序数。很明显,我正在检查类似于n*(n-1)==O(n**2)
元素的东西。如果检查元素是一个常数时间操作,并且将最后一个元素放在正确的位置也不比O(n**2)
差,那么我的整个算法就是O(n**2)
如果您试图为自己的函数获取大O符号,您可能需要变量跟踪以下内容:
运行时;比较的次数;迭代次数;以及一些调查这些数据如何与数据大小相对应的计算。
最好先手动完成,这样您就可以检查自己对算法的理解