二分查找

本文详细介绍了二分查找算法的不同应用场景及其实现方法,包括在有序数组中查找指定元素及其边界情况,以及查找最接近目标值的元素等。通过具体代码示例展示了如何高效地解决这些问题。

参见编程珠玑chap4 chap9,和编程之美3.3

 

 

 

给定一个有序(不降序)数组arr,

  1. 求任意一个i使得arr[i]等于t,不存在返回-1

 

不变式:x[low]< =t<=x[high]
 

 

int biSearch(int *arr, int low, int high, int t)

{

    int mid;

 

    while(low<=high)

    {

        mid=low+(high-low)/2;

        if(arr[mid]==t)

        {

            return mid;

        }

        else if(arr[mid]>t)

        {

           high=mid-1;

        }

        else

        {

            low=mid+1;

        }

    }

    return -1;

}

  



 

  1. 如存在重复元素,求最小的i使得arr[i]等于t,不存在返回-1

 

不变式:x[low]< t<=x[high] return high
 

 1 int biSearch(int *arr, int start, int end, int t)
 2 
 3 {
 4 
 5     int high, low, mid;
 6 
 7     //x[l]<t=<x[u]
 8 
 9     high=end+1;
10 
11     low=start-1;
12 
13     while(low+1!=high)
14 
15     {
16 
17         mid = low + (high-low)/2;
18 
19         if(t<=arr[mid])
20 
21         {
22 
23             high=mid;
24 
25         }
26 
27         else
28 
29         {
30 
31             low=mid;
32 
33         }
34 
35     }
36 
37     if(high>=end+1 || arr[high]!=t)
38 
39     {
40 
41         return -1;
42 
43     }
44 
45     else
46 
47     {
48 
49         return high;
50 
51     }
52 
53 }

 

 

 

  1. 如存在重复元素,求最大的i使得arr[i]等于t,不存在返回-1

 

不变式:x[low]<= t<x[high] return low


 

 1 int biSearch(int *arr, int start, int end, int t)
 2 
 3 {
 4 
 5     int high, low, mid;
 6 
 7     //x[l]<=t<x[u]
 8 
 9     high=end+1;
10 
11     low=start-1;
12 
13     while(low+1!=high)
14 
15     {
16 
17         mid = low + (high-low)/2;
18 
19         if(t<arr[mid])
20 
21         {
22 
23             high=mid;
24 
25         }
26 
27         else
28 
29         {
30 
31             low=mid;
32 
33         }
34 
35     }
36 
37     if(low<=start-1 || arr[low]!=t)
38 
39     {
40 
41         return -1;
42 
43     }
44 
45     else
46 
47     {
48 
49         return low;
50 
51     }
52 
53 }

 

 

  1. 求最大的i使得arr[i]小于t,不存在返回-1

 

不变式: x[low] <t<=x[high], return low

 

 1 int biSearch(int *arr, int start, int end, int t)
 2 
 3 {
 4 
 5     int high, low, mid;
 6 
 7     //x[l]<t=<x[u]
 8 
 9     high=end+1;
10 
11     low=start-1;
12 
13     while(low+1!=high)
14 
15     {
16 
17         mid = low + (high-low)/2;
18 
19         if(t<=arr[mid])
20 
21         {
22 
23             high=mid;
24 
25         }
26 
27         else
28 
29         {
30 
31             low=mid;
32 
33         }
34 
35     }
36 
37     if(low<=start-1 || arr[low]>t)
38 
39     {
40 
41         return -1;
42 
43     }
44 
45     else
46 
47     {
48 
49         return low;
50 
51     }
52 
53 }

 

 

 

  1. 求最小的i使得arr[i]大于t,不存在返回-1

不变式:x[low]<=t<x[high]return high

 

测试程序:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 
 6 void init(int *a, int n)
 7 {
 8     for(int i=0; i<n; i++)
 9     {
10         a[i]=(i)/3+1;
11     }
12 }
13 
14 void print(int *a, int n)
15 {
16     for(int i=0; i<n; i++)
17     {
18         cout<<a[i]<<" ";
19     }
20     cout<<endl;
21 }
22 
23 int biSearch(int *arr, int start, int end, int t)
24 {
25     int high, low, mid;
26     //x[l]<t=<x[u]
27     high=end+1;
28     low=start-1;
29     while(low+1!=high)
30     {
31         mid = low + (high-low)/2;
32         if(t<=arr[mid])
33         {
34             high=mid;
35         }
36         else
37         {
38             low=mid;
39         }
40     }
41     if(low<=start-1 || arr[low]>t)
42     {
43         return -1;
44     }
45     else
46     {
47         return low;
48     }
49 }
50 
51 int main()
52 {
53     int n=5;
54     int arr[n];
55 
56     init(arr, n);
57     print(arr, n);
58     for(int i=-2; i<n+1; i++)
59         cout<<i<<":"<<biSearch(arr, 0, n-1, i)<<endl;
60 
61 
62     return 0;
63 }

转载于:https://www.cnblogs.com/eric-blog/archive/2012/08/17/2644269.html

MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值