Algorithm 大O的运行时间粗略估计

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(n^2),我该如何表达 运行时间(以秒为单位)对于较大的n值,10^6

我需要一个粗略的估计,以知道是否需要优化或我可以 继续我的代码…时间限制为0.6秒


问题不在于时间复杂度的计算……而在于从时间复杂度估算运行时间。

大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密集型)。