什么是算法?
算法(algorithm):指令的集合,是为解决特定问题而规定的一系列操作。
通俗点讲:算法是同一问题的不同解题方法,算法往往针对特定数据结构的。
算法的五个特征:
1、输入:算法需要入口参数或者有些是不需要的
2、输出:一个算法如果没有输出,那么要算法干嘛?主要是根据输入的参数来得到最终结果并输出。
3、可行性:这个算法是能解决我的问题的,就是能不能行的意思。
4、确定性:算法在不同情况下,所执行的目标,或者期待的结果是不会变的。不可能运行一次是这个结果,运行n次就是其他结果了,除了产生随机数这样的。
5、有穷性:算法不会死循环。
测算算法的优劣
测试算法的好坏主要是按照2个维度来判定的:
1、时间测算(时间复杂度)
2、空间测算(空间复杂度)
一个算法运行20年才能运算出结果,那我要这个算法干嘛?这就是一个差算法。大概上面意思来看其实就是一个算法运行的时间和所占空间来判定算法优劣。
时间频度 T(n) : 一个算法执行所耗费的时间,理论上是算不出来的,必须上机测试,但是不可能也没必要对每个算法都上机测试,那么我们可以认为一个算法花费的时间与算法中的语句的执行次数成正比。哪个算法中语句执行次数多,它花费的时间就多。
时间复杂度(Time Complexity)
通常简化公式中叫 Big O
我们用公式来表示就是:T(n) = O(n)
我们通常需要知道问题的规模而不是具体的次数,所以引入了时间复杂度。算法的时间是随着问题规模的扩大而变化的。
时间复杂度分析要点:
1、不考虑必须要做的操作
2、不考虑常数项
3、不考虑低次项
时间复杂度三种情况及表示:
O 一般时间复杂度讲的是“最差”的情况(使用最多)
Ω(欧米伽)时间复杂度最好情况
⊙(西塔)时间复杂度最好和最坏是同一级别
常用的时间复杂度级别
常数阶O(1)
对数阶O(log2n)
线性阶O(n)
线性对数阶O(n*log2n)
平方阶O(n²)
立方阶O(n³)
……
k次方阶O(n^k)
指数阶O(2^n)
阶乘阶O(n!)
空间复杂度(Space Complexity)
算法的存储量包括:
1、程序本身所占空间;
2、输入数据所占空间;
3、辅助变量所占空间
输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序本身之外的辅助变量所占额外空间。
空间复杂度是对一个算法在运行过程中临时占用的存储空间大小的量度,一般也作为问题规模n的函数,以数量级形式给出,记作:S(n) = O(g(n))
空间复杂度比时间复杂度分析要少,一般都只分析时间复杂度。
算法验证
1、不能肉眼观察
如果一个算法的量级别比较少,我们肉眼可以观察出来,但是达到一个阶级次呢?肉眼肯定会看错,并且也看不过来。
2、要有多个样本验证
一个算法我们要能模拟多个样本来验证这个算法最终的输出结果是不是“确定性”的。
3、自己的算法与正确的算法做比较
比如我自己写的选择排序算法,那么需要和Java中的自带数组排序算法来个比较,看看输出的结果是否一致。
一般情况下,我们都会自己写验证程序,比如随机造出很多数据,然后正确的算法和我们自己写的算法来比较,程序最终比较完成会输出是一致的还是不一致的。