如果我们有n值和相应的运行时间,我们怎么能猜出程序的大O速度?请注意,我不是来自CS背景,我已经做了一些阅读以将事情放在上下文中,但此时我完全无能为力。
答案 0 :(得分:1)
没有任何人可以告诉你,这将有助于你将来回答类似的问题。我建议你阅读这本书Intro to algorithms并尝试理解这个概念,如果你需要在采访中回答这些问题,那么可能会很好地利用你的时间。
答案 1 :(得分:1)
没有一般程序可以始终有效,但有许多技术通常都很强大。
假设程序的运行时具有以下“标准”形式之一:
如果它确实有这些形式之一,这里有一些有用的技术来确定控制big-O表达式的常量。
如果你的函数有运行时O(n k ),那么(对于大n)运行时将大致为T(n)= c·n k 。确定c和k是什么的一个非常有用的技术是使用log-log plot。假设您查看log T(n)和log(c·n k )的值。注意
log(c·n k )= log c + k log n
这意味着如果你有一个log-log图,其中因变量是log T(n)而自变量是log n,那么任何多项式都将作为一条线出现。然后,您可以使用任何标准线性回归技术来获得与该行匹配的最佳拟合线,您可以从中恢复上述表达式中的log c和k。从那里,算法的运行时间将是O(n k )
如果您的运行时是指数级的(即某些a)的O(a n ),那么您可以使用标准日志图来恢复基数a。如果你的函数对于某些常数a和c大约是T(n)= c·a n ,那么取右边的日志就可以了
log(c·a n )= log c + n log a
这意味着如果你绘制T(n)与log c + n log a,你会得到一些直线。然后,您可以进行回归以恢复log c和log a,从中可以读取运行时为O(a n )。
希望这有帮助!
答案 2 :(得分:0)
你可以在数学上找到它(这是保证给出正确结果的方法,除非你犯了很多错误),或者凭经验(通过测量)。第二种方法经常给出正确的结果,但可以被欺骗。
对于实证结果,我从n = 1到n = 10开始,然后每次继续增长10%,绘制图表,直到花费太长时间。使用与n成比例的存储器的算法通常具有"跳跃"在内存要求进入下一个缓存级别时的执行时间;将n增加10%意味着您可以找到这些跳跃。
然后有一些算法,数据中的微小变化会导致时间上的巨大差异。对于NP完全问题,同一问题的一些实例可以很容易解决,有些可能非常难。或矩阵乘法,其中明显(和慢)算法的执行时间可能具有巨大变化,具体取决于n。