deff(l,n):
i = 0while i <n:
if l[i]&1==1: i+=1;breakelif l[i+1]&1==1:i+=2;breakelif l[i+2]&1==1: i+=3;breakelif l[i+3]&1==1: i+=4;breakelif l[i+4]&1==1: i+=5;breakelif l[i+5]&1==1: i+=6;breakelif l[i+6]&1==1: i+=7;breakelse:i+=7deff2(l,n):
i=0while i<n:
if l[i]&1==1:break
i+=1;
t = [i*2for 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多项式计算的更快算法:
deff(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)使用逻辑运算来进行解码:
defdecode(num):return num>>4,num&0xfdefencode(a,b):return (a<<4)|b
defreaddata(str):
i,n = 0,len(str)
while i < n:
byte = str[i:i+8]
print(decode(int(byte,2)))
i+=8
readdata('0010001010001001')
前面的习题没有什么太多讲得,主要是循环展开,预处理,查表等技巧。习题7习题7查表对0—2m2^m进行预处理,计算它们的1的位数。另外答案给出了比较trick的一招:b &=b-1 b &=b-1 这样可以对为1的位进行迭代。习题12习题12多项式计算的更快算法:def f(a,x): if x==0:return a[0] y = a[0] for a_k in a[1:]: