032day(STL中的二分查找算法)

本文详细介绍了STL中binary_search、lower_bound及upper_bound函数的使用方法,包括基本类型和自定义排序规则下的二分查找,并通过示例代码演示了如何在不同场景下应用这些算法。

《2017年11月11日》【连续032天】

标题:STL中的二分查找算法;

内容:A.观看MOOC12.2;

B.

binary_search:

(一)在从小到大排好序的基本类型数组上进行二分查找;

binary_search(数组名+n1,数组名+n2,值);

区间[n1,n2),下标为n2的元素不在查找区间(可对照031day);

在该区间内查找“等于”“值”的元素,返回值为ture(找到)或false(未找到);

“等于”的含义:a 等于 b <=> a<b和b<a都不成立       注:a等于b并不是 a==b;

(二)在自定义排序规则排好序的,元素为任意的T类型的数组中进行二分查找;

binary_search(数组名+n1,数组名+n2,值,排序规则结构名());

区间[n1,n2);

在该区间内查找“等于”“值”的元素,返回值为ture(找到)或false(未找到);

查找时的排序规则,必须和排序时的规则一致!

“等于”的含义:a 等于 b <=>“a必须在b前面”和“b必须在a前面”都不成立;

struct Rule{   //按个位数从小到大排序 
bool operator()(const int & a1,const int & a2){
return a1%10<a2%10;
}
}; 
void Print(int a[],int size){
for(int i=0;i<size;++i){
cout<<a[i]<<" ";
}
cout<<endl;

int main()
{
int a[]={12,45,3,98,21,7};
sort(a,a+6);
Print(a,6);
cout<<"result:"<<binary_search(a,a+6,12)<<endl;
cout<<"result:"<<binary_search(a,a+6,77)<<endl;
sort(a,a+6,Rule());
Print(a,6);
cout<<"result:"<<binary_search(a,a+6,7)<<endl;
    cout<<"result:"<<binary_search(a,a+6,8,Rule())<<endl; //98和8在此排序结构下满足等于的条件;

lower_bound:二分查找下界:

(一)在对元素类型为T的从小到大排好序的数组中进行查找:

T * lower_bound(数组名+n1,数组名+n2,值);

返回一个指针 T * p;

区间[n1,n2);

*p是查找区间里下标最小的,大于等于“值”的元素。如果找不到,p指向下标为n2的元素;

(二)在元素为任意的T类型,按照自定义排序规则排好序的数组中进行查找:

T*lower_bound(数组名+n1,数组名+n2,值,排序规则结构名());

返回一个指针 T*p;

*p是查找区间下标最小的,按自定义排序规则,可以排在“值”后面的元素,如果找不到,p指向下标为n2的元素;

upper_bound:二分查找找上界;

(一)元素类型为T,从小到大排好序的数组中查找:

T*upper_bound(数组名+n1,数组名+n2,值);

 

返回一个指针 T * p;

*p是查找区间里下标最小的,大于“值”的元素。如果找不到,p指向下标为n2的元素;

(二)在元素为任意的T类型,按照自定义排序规则排好序的数组中进行查找:

T*upper_bound(数组名+n1,数组名+n2,值,排序规则结构名());

*p是查找区间下标最小的,按自定义排序规则,必须排在“值”后面的元素,如果找不到,p指向下标为n2的元素;

#define NUM 7
int main()
{
int a[NUM]={12,5,3,5,98,21,7};
sort(a,a+NUM);
Print(a,NUM);
int*p=lower_bound(a,a+NUM,5);
cout<<*p<<","<<p-a<<endl;
p=upper_bound(a,a+NUM,5);
cout<<*p<<endl;
sort(a,a+NUM,Rule());
Print(a,NUM);
    p=lower_bound(a,a+NUM,16,Rule());
cout<<*p<<" "<<p-a<<endl;
p=upper_bound(a,a+NUM,5,Rule());
cout<<*p<<" "<<p-a;

明日计划:学习multiset;

 

 

 

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值