什么是算法?
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
算法有什么性质?
算法有五大性质
- 1.有穷性:算法的有穷性是指算法必须能在执行有限个步骤之后终止
- 2.确定性:算法的每一步骤必须有确切的定义
- 3.可行性:算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成
- 4.输入:一个算法有零个或多个输入
- 5.输出:一个算法至少一个或多个输出
我们可以总结出一句话: 程序=数据结构+算法+编程语言
我们先设置一个简单的算法,实现模拟1~999元之间的商品竞猜
#include<iostream> using namespace std; int main() { int x,n,time=0; cout << "请输入商品价格:"; cin >> x; system("cls"); //调用DOS命令清屏 while (1) { cout << "请输入竞猜价格:"; cin >> n; if (n > x) { cout << "高了" << endl; time++; } else if (n < x){ cout << "低了" << endl; time++; } else { cout << "恭喜,猜对了" << endl; time++; break; } } cout<<"共猜了"<<time<<"次"<<endl; return 0; }
输入商品价格为650
然后从一个自己喜欢的数,若高了则每次降100,低了每次升一百,直到输出相反或猜对,若输出相反则每次加10或减10,以此类推
开始我先输入300,然后在按照上面步骤开始竞猜
根据竞猜结果可以知道我们猜了10次
那有没有什么办法可以减少竞猜次数?
我们可以从500开始竞猜,若高了或低了,我们就可以排除掉一半的答案,每次排除掉一半答案,则竞猜次数就可以减少,这就是二分查找(也叫折半查找)的简单应用
我们该怎么评价一个算法的优越性
我们主要通过四个方面来评价一个算法
- 1.时间复杂度:算法的时间复杂度是指执行算法所需要的计算工作量。一般用O()表示
- 2.空间复杂度:算法的空间复杂度是指算法需要消耗的内存空间。
- 3.正确性:算法的正确性是评价一个算法优劣的最重要的标准。
- 4.可读性:算法的可读性是指一个算法可供人们阅读的容易程度。适当的注释很重要
- 5.健壮性:健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。
我们再通过一个例子来更好的认识算法
例: 输入三个数a,b,p,求a*b mod p的值;#include<iostream> using namespace std; typedef long long LL; int main(){ LL a,b,p; cin>>a>>b>>p; cout<<a*b%p<<endl; return 0; }
看起来没有什么问题,82=16,16/1=16余0
但如果我们输入的数大一些呢?
是不是很奇怪,正正得负? 那是应为这些数乘起来就已经超过了 long long 的取值范围,所以溢出了。那能不能想一些办法优化一下?
但然有,古人云:只要思想不滑坡,办法总比困难多
我们先解决乘法问提,看下图
所以按照以上思路我们可以编写以下程序来求ab mod p#include<iostream> using namespace std; typedef long long LL; int power(LL a,LL b,LL p){ LL ans=0; for(;b;b >>= 1){ //每次右移一位,相当于除二 if(b&1) ans=(ans+a)%p; //用按位与运算判断b是否等于1 a=a*2%p; } return ans; //返回答案 } int main(){ LL a,b,p; cin>>a>>b>>p; cout<<power(a,b,p)<<endl; return 0; }
这就是算法的重要作用,在处理很多或很大的数据的时候算法就能发挥它的重要作用