本文主要是介绍信奥赛算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 头文件
- 算法
- 五大特征
- 算法复杂度
- 时间复杂度
- 空间复杂度
- 模拟和枚举算法
- 模拟算法
- 枚举算法
- 二分查找
- 查找 x
- 查找第一个大于等于x的数
- 查找第一个大于x的数
- lower_bound 和 upper_bound 函数
- 二分答案
- 递归
- 递推
- 前缀和
- 原理
- 差分
- 原理
头文件
#include < algorithm > 调用标准算法库
算法
解决问题的策略机制
五大特征
有穷性 :
必须能在执行有限个步骤之后终止
确切性:
每一步骤必须有确切的定义
输入项:
有0个或多个输入
输出项:
有一个或多个输出
可行性 / 有效性:
每个计算步骤都可以在有限时间内完成
算法复杂度
时间复杂度
算法的运行时间
时间频度是指语句执行的次数,也叫语句频度。它计算时间复杂度的一种方法。
for(int i=1;i<=n;i++)cout<<"Hello";
循环体执行n次,则时间频度记为O(n)
算法时间复杂:
O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(n^2)平方阶 < O(n^3)(立方阶) <O(2^n) (指数阶)
空间复杂度
算法所耗费的存储空间
算法所占存储空间:
本身所占的空间
运行过程中临时占用的空间
模拟和枚举算法
模拟算法
按照题目所述的方式来写,最终运行得出想要的结果
枚举算法
列举出所有可能的解,并逐一检验可行性
二分查找
二分查找也称折半查找,是一种效率较高的查找方法。
数组必须是升序序列
查找 x
二分查找与顺序查找的演示图对比:
时间复杂度
一般情况:O( logn )
最好情况下只需要进行1次比较就能找到目标元素:O( 1 )
int x;
cin>>x;
int mid,l=1,r=n;
while(l<=r){mid=(l+r)/2;if(a[mid]==x){ans=mid;break;}else if(a[mid]>x){r=mid-1;}else{l=mid+1;}
}
cout<<ans;
递归写法
int solve(int l,int r,int x){int mid=l+(r-l)/2;if(a[mid]==x) return mid;else if(a[mid]<x) return solve(mid,r,x);else if(a[mid]>x) return solve(l,mid,x);
}
查找第一个大于等于x的数
在一个有序的序列中查找第一个大于等于 x 的数 ( 数列中有重复的数字 )
int x;
cin>>x;
int mid,l=1,r=n,pos=-1;
while(l<=r){mid=(l+r)/2;if(a[mid]>=x){pos=mid;r=mid-1;}else {l=mid+1;}
}
cout<<pos;
查找第一个大于x的数
在一个有序的序列中查找第一个大于 x 的数 ( 数列中有重复的数字 )
int x;
cin>>x;
int mid,l=1,r=n,pos=-1;
while(l<=r){mid=(l+r)/2;if(a[mid]>x){pos=mid;r=mid-1;}else {l=mid+1;}
}
cout<<pos;
lower_bound 和 upper_bound 函数
lower / upper_bound(a+第一个下标,a+最后一个下标+1,查找元素名) - a
lower_bound(a+1, a+n+1, x) - a
lower_bound()函数返回数组 a 中大于等于 x 的第一个元素的地址
upper_bound(a+1, a+n+1, x) - a
upper_bound()函数返回数组 a 中大于 x 的第一个元素的地址
找不到元素则返回n+1
二分答案
答案有一个区间,在这个区间中二分,直到找到最优答案
是否用二分答案解题:
答案在一个区间内
直接搜索不好搜,但是容易判断一个答案可行不可行
该区间对题目具有单调性,即:在区间中的值越大或越小,题目中的某个量对应增加或减少。
递归
函数不断调用自身,直到调用的对象已知
递归两大要素:
1. 调用自身函数
2. 停止递归条件
递推
顺推:从已知的初始条件出发,逐步推出要解决的问题
逆推:从问题出发逐步推到已知条件
前缀和
前缀和是数组的前n项和
原理
sum[r] = a[1] + a[2] + a[3] + a[l-1] + a[l] + a[l + 1] … a[r];
sum[l - 1] = a[1] + a[2] + a[3] + a[l - 1];
sum[r] - sum[l - 1] = a[l]+ a[l + 1] + …+ a[r];
差分
差分是一种用于对数组的某一区间进行计算操作的算法
原理
b[ i ] = a[ i ]- a[ i - 1];
这篇关于信奥赛算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!