最近狼哥写一个图像算法,需要将一个指定的数,在一个数组中,查找到第一个比指定的数大的索引值,这个事情,如果不要求流水处理的话,最简单的办法就是逐个查询查询就完事了,但是由于需要做流水实现,同时还需要控制资源使用,单纯的使用查询也没有问题,但是资源上不够划算,所以这个时候就需要我们的二分法上线了,帮助我们快速的实现查找定位工作。
再写代码之前,我们的知道二分法是个啥玩意,维基百科二分法定义如下:在计算机科学中,二分查找算法也称折半搜索算法,对数搜索算法,是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
二分法里说了两个核心的点,一个是有序数组,这个就限定了它的使用范围,必须是有序的序列,无序的没法用;第二个是每一次搜索范围缩小一半,这个就极大的加快了搜索速度。举个简单的例子,对于256个数据的有序数组,顺序查找最慢需要256个周期,而二分法则只需要8个周期即可。
二分法实现时需要注意两个问题,一是跳出循环的条件,另一个是左右端点的变化规则,这里我们以闭区间的情况来说明,即搜索范围为[L,R],这里L和R都是可以取到值。此种情况下:
跳出循环的条件为 L <=R
左右端点变化规则如下:
定义mid为中值,即 mid = (L + R)/ 2;目标值为T,数组为X[n], 如果X[mid] < T, L = mid + 1; 否则 R= mid - 1。
以上就是二分法的原理和实现需要注意的事项点。基于此,狼哥做了一个流水线的二分查找算法的实现,可以流水搜索特定值索引值,适合图像算法的流水线实现,算法可以在256个数据中,一个周期给出一个搜索结果,整个模块消耗资源也不多,1k左右的lut即可。matlab实现代码可以去星球获取。
图像课程,开发板-->淘宝店铺:胡狼FPGA
咨询微信:MyWork666888
*******往期精彩文章列表********
基于Zynq的图像处理入门课程