编程珠玑第九|十章学习总结

前面的习题主要是循环展开,预处理,查表等技巧。

可以测得循环展开之后速度明显有所加快,为什么?因为循环展开有利于指令的并行运算。

def f(l,n):
    i = 0
    while i <n:
        if   l[i]&1==1:    i+=1;break
        elif l[i+1]&1==1:i+=2;break
        elif l[i+2]&1==1: i+=3;break
        elif l[i+3]&1==1: i+=4;break
        elif l[i+4]&1==1: i+=5;break
        elif l[i+5]&1==1: i+=6;break
        elif l[i+6]&1==1: i+=7;break
        else:i+=7
def f2(l,n):
    i=0
    while i<n:
        if l[i]&1==1:break
        i+=1;
t = [i*2 for i in range(100000)]
t+=[11]
test(f,args=[t,100001],case=500)
test(f2,args=[t,100001],case=500)

7 查表对0— 2m 进行预处理,计算它们的1的位数。另外答案给出了比较trick的一招:

b &=b-1这样可以对为1的位进行迭代。

12 多项式计算的更快算法:

def f(a,x):
    if x==0:return a[0]
    y = a[0]
    for a_k in a[1:]:
        y = y*x+a_k
    return y
print(f([1,1,1,1,1],2))

第十章给出了一些节约空间的办法,比如使用稀疏结构,编码,动态分配,重新计算等技术。

1 :因为将数据压缩是需要编码解码的,这就必然要写多余的一部分代码。

5 :利用近似函数和单个的十进制数字来获取所需要的精度。

6 :(a)使用逻辑运算来进行解码:

def decode(num):
    return num>>4,num&0xf
def encode(a,b):
    return (a<<4)|b
def readdata(str):
    i,n = 0,len(str)
    while i < n:
        byte = str[i:i+8]
        print(decode(int(byte,2)))
        i+=8
readdata('0010001010001001')

8 如果姓名都是中文,则可以大大减少需要的字节数。

MMDDYYYY
MM<=12,DD<=31,YYYY<=3000
4bit,5bit,12bit
DDD-DD-DDDD
10bits 7bits,14bits

9 可以采取字典树来节约空间,同时注意26个字母只需要26bit就可以搞定,再加上该位置的编号(index<=100000),6个字节即可建立一层树的节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值