回复 9# sjtusonic
题目没有说得很清楚,我这里补充一些。 首先,log2(N)是指算法复杂度。比较一组值之中的最小值,最简单的方法就是遍历一遍,这样复杂度就是O(N)。
下面我说得都是软件上并行算法的考虑,对硬件由于最近接触,所以不太明白,是否也能这样实现。
比较一组值中的最小值,可以把问题分解为,比较前N/2个值中的最小值和比较后N/2个值中的最小值,然后将2个值比较,这样就求出的答案。 接着前N/2个值和后N/2个值的比较也这样分解,直到分解为一个比一个。 递归表达式为T(N)=2T(N/2)+O(1)
这样复杂度仍是O(N),只不过用的是分治的方法。但是如果是并行编程的思想,理论上T(N/2)前面的系数2是可以去掉的,递归表达式就是
T(N)=T(N/2)+O(1),这样算法复杂度就是O(log2(n)).
简单来说,相当于 第一个时钟周期,比较了N/2组值的大小(一次比较是比较两个值,所以是N/2组比较),这样我剩下的问题就是在N/2个值里找最小。然后第二个时钟周期,进行N/4比较,这样剩下问题就是在N/4个值中找最小。
例如数据(1,2,4,5,7,8,9,-2)
第一个时钟周期,比较了(1,2) (4,5) (7,8) (9,-2) ,剩余值 1 ,4 ,7 ,-2
第二个时钟周期,比较了(1,4) (7,-2) ,剩余值1,-2
第三个时钟周期,比较了(1,-2) ,剩余值-2
这样就在log2(8)个周期里找到了最小值。
不知道这样算不算是,软件思维搞硬件。 |