5
功率编程:O(1 ^ N),O(N ^ 1),O(2 ^ N),O(N ^ 2)合而为一
根据程序的运行方式,编写出表现出四种常见的O大 时间复杂度的程序(或函数)。无论采用哪种形式,都需要一个正整数N,您可以假设它小于2 31。 当程序以其原始形式运行时,它应该具有恒定的复杂性。也就是说,复杂度应为Θ(1)或等效地为Θ(1 ^ N)。 当程序反向运行时,它应该具有线性复杂度。也就是说,复杂度应为Θ(N)或等效地为Θ(N ^ 1)。 (这是有道理的,因为N^1被1^N逆转。) 当程序被加倍,即,级联到本身,并运行它应具有指数复杂性,特别是2 Ñ。也就是说,复杂度应为Θ(2 ^ N)。 (这是有道理的,因为2在2^N是双1中1^N)。 当程序被加倍执行并反转并运行时,它应具有多项式复杂度,尤其是N 2。也就是说,复杂度应为Θ(N ^ 2)。 (这是有道理的,因为N^2被2^N逆转。) 这四种情况是您唯一需要处理的情况。 请注意,为精确起见,我使用大theta(Θ)表示法而不是大O,因为您的程序的运行时必须在上下两方面受所需复杂度的限制。否则,仅在O(1)中编写一个函数就可以满足所有四个点。了解这里的细微差别不是太重要。主要是,如果您的程序针对某个常数k执行k * f(N)运算,则很有可能为Θ(f(N))。 例 如果原始程序是 ABCDE 那么运行它应该花费恒定的时间。也就是说,无论输入N是1还是2147483647(2 31 -1)或两者之间的任何值,它都应在大致相同的时间内终止。 程序的反向版本 EDCBA 应该以N为单位花费线性时间。也就是说,终止所花费的时间应与N大致成比例。因此N = 1花费的时间最少,N = 2147483647花费的时间最多。 该程序的两倍版本 ABCDEABCDE 以N表示,应该花费2到N的时间。也就是说,终止所花费的时间应该大致与2 N成正比。因此,如果N = 1在大约一秒钟内终止,则N = 60将花费比宇宙年龄更长的时间。(不,您不必测试。) 程序的加倍和反转版本 EDCBAEDCBA 应该花费以N为单位的平方时间。也就是说,终止所花费的时间应与N * N大致成比例。因此,如果N …