Algorithm 大O的运行时间粗略估计
如果我的程序的时间复杂度是,比如说O(n^2),我该如何表达 运行时间(以秒为单位)对于较大的n值,10^6 我需要一个粗略的估计,以知道是否需要优化或我可以 继续我的代码…时间限制为0.6秒Algorithm 大O的运行时间粗略估计,algorithm,big-o,time-complexity,Algorithm,Big O,Time Complexity,如果我的程序的时间复杂度是,比如说O(n^2),我该如何表达 运行时间(以秒为单位)对于较大的n值,10^6 我需要一个粗略的估计,以知道是否需要优化或我可以 继续我的代码…时间限制为0.6秒 问题不在于时间复杂度的计算……而在于从时间复杂度估算运行时间。大O已经相当粗糙了。尽管如此,这意味着您将执行大约10^12次,或者一万亿次迭代 例如,i7 4770K在3.9 GHz时每秒有1272.73亿条指令。一般来说,这是一个毫无意义的指标,但由于我们做得非常粗略,它将不得不这样做 在每次迭代一条指
问题不在于时间复杂度的计算……而在于从时间复杂度估算运行时间。大O已经相当粗糙了。尽管如此,这意味着您将执行大约10^12次,或者一万亿次迭代 例如,i7 4770K在3.9 GHz时每秒有1272.73亿条指令。一般来说,这是一个毫无意义的指标,但由于我们做得非常粗略,它将不得不这样做 在每次迭代一条指令时,显然需要大约8秒才能完成
实际上,每次迭代可能需要几条指令,但迭代次数也可能较少(如n/2)。如果您给我们一个示例代码,我可以更好地猜测。您需要大致了解一个基本任务需要多少时间,才能估计不同算法的运行任务 例如,让我们假设您的基本任务是
void func(){sleep(1)};
现在您知道,一个O(1)复杂度算法只需调用一次func(),这需要1s
看看其他例子:
O(1) -> 1 * 1s
O(N) -> N * 1s
O(N2) -> (N^2) * 1s
如果不粗略估计任务的执行时间,就不可能给出准确的答案。无法根据某段代码的大O级计算或估计其运行时间 Big-O告诉您一个方法如何根据要执行的操作进行扩展。它不知道执行一个操作需要多长时间。此外,CPU在并行执行某些操作方面可能是好的,也可能是坏的,这使得它更加困难 确定是否存在性能瓶颈的唯一方法是执行以下操作:
如果您还知道该代码的Big-O评级,那么您可以使用该评级来确定瓶颈是否会成倍恶化,例如,如果您将要处理的项目数增加一倍。获取运行时间的最简单方法是使用给定的
n
对算法进行基准测试(运行几次并使用平均值)。如果时间比您为估计运行时分配的时间长,那么您需要近似计算
您可以使用以下公式获得具有O(n^x)
(多项式)复杂度的算法的精确运行时间:c_x*n^x+c_x-1*n^(x-1)…+c_1*n+c_0
其中乘法器c_x。。。c_0
可以是任何值。它们取决于算法的细节、您的cpu、调度程序状态以及许多其他因素
您可以通过使用n
值运行代码来估计这些乘数,该值足够小,不会占用分配给估计的更多时间,并创建统计信息。您可以使用多项式回归模型来估计乘数。通过估算,您可以将乘法器应用于上述公式,以使用任意值n
近似运行时。估计的准确性取决于您收集了多少统计信息,以及与统计信息中使用的n
值相比,您估计的n
值要大多少,以及复杂性的顺序(高于二次可能不是很有用)
多项式回归方法本身远远超出了这个问题的范围。我建议你读一本统计课本。这里有一个
当然,,您必须了解,这些测量值和估计值仅适用于您在硬件上运行的算法的实现,与其他算法的实现值或其他硬件上的测量值不可比较。无法使用大O符号进行执行时间估计释放@rsd_的副本您应该执行并测量时间,而big O表示法告诉您代码是如何伸缩的,而不是需要多长时间。也就是说,一个O(n^2)算法将花费4倍的时间来完成一个n是两倍大的问题。它没有告诉你一个给定的n需要多长时间,因为还有太多的其他因素。除了创建一个测试用例并自己测量它之外,没有办法确定它需要多长时间。复杂性是根据程序的操作或步骤来定义的。一个步骤和完成一个步骤(以及整个程序)所需的实际秒数没有关系(加起来,BigO忽略常量和低阶步骤)。实际执行取决于许多因素,如CPU速度、CPU核数、程序性质(例如IO密集型或CPU密集型)。