1、什么是算法?
是解决特定问题求解步骤的描述 例如:求解1+2+3+……+99+100的和?
在计算机中表现为指令的有序序列 方案1 方案2
并且每条指令表示一个或多个操作 int sum=0; i nt N=100;
说白了,就是求解一个问题的步骤 int N=100; int sum=(N+1)*N/2;
for(int i=1;i<=N;i++){
sum+=i;
}
方案1:随着N的增大,循环的次数也会增大,也就意味着执行的次数和运行的时间也会增大
方案2:随着N的增大,其执行次数只有一次,不会随着N的增大而增大
同一个问题,可以有多种不同的解决方案,也就是说可以用不同的算法去解决同一个问题
2、如何评价一个算法的好坏?
设计算法要提高程序运行的效率,这里效率大都指算法的执行时间
(1)事后统计方法:这种方法主要是通过设计好的程序和数据,利用计算机计时器对不同算法程序的运行时间进行比较,从而确定算法效率的高低
但是这样会有很多缺陷:
必须事先编好程序,再进行运行,如果程序处理的数据量较大,则会花费大量的时间和精力(计算一年都不成问题)
时间的比较主要依赖于计算机硬件和软件环境
算法的测试数据设计困难,在数据量较小的时候,不管什么算法其运行时间都是很微小的,相差几乎为零。如果数据量大了,算法的优越性就出来了,但是这样又会耗费时间
所以该种方式一般不予采纳
(2)事前分析估算方法:这种方法主要在计算机程序编制前,依据统计方法对算法进行估算
一个高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:
算法采用的策略、方法
编译产生的代码质量
问题的输入规模
机器执行指令的速度
第1条当然是算法好坏的根本,第2条要有软件来支持,第4条要看硬件性能
也就是说,抛开这些与计算机硬件、软件有关的因素:
一个程序的运行时间,依赖于算法的好坏和问题的输入规模。
所谓问题输入规模是指输数据入量的多少
3、时间复杂度
在这里以O(logn)级别的时间复杂度为例讲一下:
虽有循环,虽也随着N的增大而增大,但是这种增大属于 加速度减小的加速运动
int count=1;
int N=100000;
while(count<N){
count=count*2;
}
假设循环运行了x次,那么 2^x=N,所以x=log2(N)
最后得出一个结论:我们考虑的时间复杂度,都是最坏情况