(运行时间的比较)假设求解问题的算法需要 f(n) 毫秒,对下表中的每个函数 f(n) 和时间 t,确定可以在时间 t 内求解的问题的最大规模n。
1秒钟 | 1分钟 | 1小时 | 1天 | 1月 | 1年 | 1世纪 | |
---|---|---|---|---|---|---|---|
lgn | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
n | 1000 | 60000 | 3600000 | 864E5 | 2592E6 | 31536E6 | 31536E8 |
nlgn | 140 | 4894 | 204094 | 3943234 | 97659289 | 1052224334 | 86788101610 |
![]() | 31 | 244 | 1897 | 9295 | 50911 | 177583 | 1775837 |
![]() | 10 | 39 | 153 | 442 | 1373 | 3159 | 14664 |
![]() | 9 | 15 | 21 | 26 | 31 | 34 | 41 |
n! | 6 | 8 | 9 | 11 | 12 | 13 | 15 |
这道题就是通过反函数求解,当一个算法需要 f(n) 毫秒才能完成时,那么时间t内的最多完成的步骤应该是 inverse_f(t),inverse_f表示 f 的反函数。所以第一纵列所有的函数都是有对应的反函数的。
这里面有两个特殊的函数,一个是nlgn,一个是n!。(本书中lg的意思是log2),这两个没法直接求解,可以用代码求解,通过二分逼近法来求。以下是我的python代码。
import math
Second = 1000
Minute = Second * 60
Hour = Minute * 60
Day = Hour * 24
Month = Day * 30
Year = Day * 365
Century = Year* 100
def nlgn(n):
return n * math.log(n, 2)
def inverse_nlgn(t):
if t <= 1:
return None
if t == 2:
return 2
startNumber = 1
endNumber = None
testNumber = None
while True:
if endNumber != None and endNumber - startNumber <= 1:
testNumber = startNumber
break
if endNumber == None:
testNumber = startNumber * 2
else:
testNumber = (endNumber + startNumber) / 2
result = nlgn(testNumber)
if result < t :
startNumber = testNumber
elif result > t :
endNumber = testNumber
else :
break
return testNumber
def n_ex(n):
result = 1
for i in range(1, n+1):
result *= i
return result
def inverse_n_ex(t):
if t < 1:
return None
if t == 1:
return 1
startNumber = 1
endNumber = None
testNumber = None
while True:
if endNumber != None and endNumber - startNumber <= 1:
testNumber = startNumber
break
if endNumber == None:
testNumber = startNumber * 2
else:
testNumber = int((endNumber + startNumber) / 2)
result = n_ex(testNumber)
if result < t :
startNumber = testNumber
elif result > t :
endNumber = testNumber
else :
break
return testNumber
n = Second
print("n = %d" % n)
print("nlgn %d" % inverse_nlgn(n))
print("n! %d" % inverse_n_ex(n))
print("n^2 %d" % math.sqrt(n))
print("n^3 %d" % math.pow(n, 1.0/3.0))
print("2^n %d" % math.log(n, 2))