|
|
发表于 2007-6-28 18:37:00
|
显示全部楼层
Re:请教一下这个问题
恩,可能有朋友怀疑这个算法的效率
我们来分析一下把
其他操作没什么说的,耗时的操作是 m=searchInB(W); //在B[N]中查找 使得 2^m<=W<2^(m+1)
这一步吧,在数组B[]查找.
看看B的大小,假设是32位机,也就是说最大整数是0xffffffff<2^32
也就是说B中最大的数可以到2^32(多了就溢出了),这样B中最多有32个元素:1,2,4,8,16,32,...
在B中查找一个数,假设我们就是采用挨个查找,我们也最多比较32次就有结果了,确切的来说平均查找次数为
16次,而且大家可以注意到,每次分解后的数都比原来的数至少小一半,所以下一次再查找的时候,它会落在前部分的空间里,也就是说能很快找到了
所以查找也不是很耗时,如果你想加速这个算法,在查找的时候可以采用2分查找,不过要小心上下界相加可能溢出的情况
//--------
上面朋友说的移位求解是这样的
12是1010(2进制),但是在计算机中是0000 0000 0000 0000 0000 0000 0000 1010(32位)
采用右移,如果第n次中移出的数是1 则有2^n
就这样循环32次,
结果还是 2^3+2^2
这个方法的时间是个常数时间,也就是说肯定会移动32次
//--------
恩,用哪个方法,还是自己斟酌吧~
|
|