matlab线性搜索,matlab实现二分法查找

上次谈到matlab实现数据的位图数结构,实现大量数据的排序和存储,节省时间和空间。

那么还是没有解决大量数据中查询特定数值的问题,有相关的解决办法,比如说,线性查找,即一个一个数据判断是否为真。

举个例子说,我们要用线性查找的办法判定n=100这个数值是否在1--250之间,将1--250之间的数字存储到a数组中,然后从从第一个数字开始,一个一个数字挨次做判断,n?=a(i),等于即为真,否则i++,那么做判断的次数的期望值即为250/2=125,得出最少要做125次才能判定n这个数是否存在于数组中。当遇到庞大的数据时候,这种方法显然力不从心,会浪费很多时间。

下面介绍用matlab实现二分法的查找,这将会打来很大的方便。

二分法的查找时通过记录数组中包含n(假设n在数组a中的某个位置)的元素范围的方式来解决问题。

注意:数组a已经使用位图数据结构的方法排序;

最初这个范围将是整个数组,将数组的中间元素和n进行比较,去掉该范围的一半以缩小范围。连续进行该程序,直到数组中发现n为止或者直到发现包含n的范围不存在时为止。在具有b个元素的数组a中,二分法大约要进行log2(b)次的查找。

到此看官可以关掉网页自己动手用熟悉的软件编译二分法查找的程序,有些代码看起来很简单,却要花费很多时间编译无bug的代码。历史上,knuth在其一书中指出,尽管第一个二分法查找的程序与1964年就已经公布,但第一个无bug的二分法查找程序直到1962年才出现。

下面是用matlab中实现二分法的查找的代码:

%二分法检测n值是否存在于数据中

m1=max(a);% m1%从左边趋近时的取值,每次取数组中的最小值

m2=min(a);% m2%从右边趋近时的取值,每次取数组中的最大值

for i=1:log2(a)+1

% for i=1:x

m=fix((min(m1)+max(m2))/2);

if n==m

break;

elseif n

m1=cat(2,m1,m);

elseif n>m

m2=cat(2,m2,m);

end

end

还是采用线性查找中用到的例子,用二分法模拟检测100是否在1--250之间,实验结果如下:

m1 = 250   125   109   101;

m2 = 1    63    94    97    99;

在处理海量的数据时候,二分法的优势一览无余,下面是处理130744314个数据,软件所用的时间(matlab中生成随机数最大的维数为130744314)

Elapsed time is 0.001722 seconds.(二分法)

Elapsed time is 0.588435 seconds.(线性法)

很明显线性法用的时间是二分法的341.7160倍。

注:上述在win7+matlab2009a下实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值