算法导论 1-1 跟算法复杂度有关的计算问题

(运行时间的比较)假设求解问题的算法需要 f(n) 毫秒,对下表中的每个函数 f(n) 和时间 t,确定可以在时间 t 内求解的问题的最大规模n。

表格(1个月这里按30天算)
 1秒钟1分钟1小时1天1月1年1世纪
lgn2^{1000}2^{600000}2^{3600000}2^{^{864E5}}2^{2592E6}2^{31536E6}2^{31536E8}
\sqrt{n}1000^{2}60000^{2}3600000^{2}864E5^{2}2592E6^{2}31536E6^{2}31536E8^{2}
n1000600003600000864E52592E631536E631536E8
nlgn1404894204094394323497659289105222433486788101610
n^{2}3124418979295509111775831775837
n^{3}10391534421373315914664
2^{n}9152126313441
n!68911121315

 

 

 

 

 

 

 

 

 

 

这道题就是通过反函数求解,当一个算法需要 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))

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值