要回答您的第一个问题,是的,这是正确的复杂顺序。大 O 表示法不会告诉您程序或算法需要多长时间才能运行。它只是相对于具有更好复杂性或更差复杂性的另一种方法来衡量其性能。为了帮助您对其进行概念化,O(1)将是一条指令,O(n)将是一个单循环,O(n^2)将是一个内部带有嵌套循环的循环。
要回答您关于O(n^2)比O(n log n)快的问题,它可能不会。我说可能是因为有许多因素决定了程序的速度,并且可以想象,复杂性更差的程序比复杂性更高的程序执行得更快。换句话说,大 O 表示法衡量算法的复杂性,而不是构成该算法的程序。
例如,假设您有两个程序,为简单起见,一个在O(n)时间内运行,另一个在O(n^2)时间内运行。
运行 10 个对象,具有O(n)时间的程序导致 100 毫秒。以O(n^2)时间运行程序会导致 10 毫秒。这是为什么?因为与第一个程序相比,执行工作所需的时间为 O(n^2)的程序少。
但是让我们看看 100 个对象会发生什么。具有O(n)时间的程序会产生 1000 毫秒,而具有O(n^2)时间的程序也会产生 1000 毫秒。对于较大的对象,它的增长速度要快得多,这就是为什么一般来说,优化复杂性会更好。
有些算法的复杂度无法降低,例如旅行商问题的变体,它询问是否存在一定长度的路径来通过他必须访问的所有城市。要获得有保证的最佳解决方案,您必须运行所有可能的场景,其中包含O(n!)的大 O 表示法,这已经非常糟糕了。幸运的是,有许多替代算法可以确定 98% 以内的解决方案,并且可以更快地执行。在O(n!)时间内运行的一组已知问题称为NP 问题。
我希望这能回答你的问题。