评估算法的核心指标
评估算法优劣的核心指标是什么?
1.时间复杂度(流程决定)
2.额外空间复杂度(流程决定)
3.常数项时间(实现细节决定)
何为常数时间的操作?
如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定时间,这样的操作就是常数时间的操作。
例如:①在进行加法运算时,加法所用的时间与相加的两个数字的大小是没有关系的
②取出数组中第一千位置和一千亿位置的数字,二者所需的时间是相同的,数组内部是根据计算偏移量进行寻址的,不是遍历。
常见的常数时间的操作
常见的算数运算(+、-、*、/、%等)
常见的位运算(>>、>>>、<<、|、&、^等)
赋值、比较、自增、自减操作等
数组寻址操作
此处提及一下>>与>>>的区别:
>>为带符号右移,在你右移的过程中符号位是0最高位就补0,符号位是1最高位就补1
>>>为不带符号右移,在你右移的过程中,最高位全部用0进行补充
总之,执行时间固定的操作都是常数时间的操作
利用选择排序算法推导时间复杂度
假定有一个数组,数组中有n个元素
1.遍历数组中0~n-1元素,找到最小值的位置,把最小值与0位置上的数做交换
2.遍历数组中1~n-1元素,找到最小值的位置,把最小值与1位置上的数做交换
。。。。。。。。
遍历数组中n~n-1元素,找到最小值的位置,把最小值与n位置上的数做交换
那么:选择排序一共执行了多少次常数级别的操作呢?
上面步骤1:n个数进行了比较后交换
上面步骤2:n-1个数进行了比较后交换
。。。。。。。。
交换的次数每次都是1,最终有n次交换,n为常数可以忽略
总的比较次数实际上是一个等差数列(n+(n-1)+。。。)==>最终可以简化的写成一个二次函数n的平方
结论:选择排序的时间复杂度就是O(n平方)
利用冒泡排序算法推导时间复杂度
假定有一个数组,数组中有n个元素
第一轮:下标为0的数字与下标为1的数字作比较,大的数字放在后面。重复操作,直到下标为n-1的数字与下标为n的数字做完交换
第二轮:也是从下标为0的数字与下标为1的数字作比较。。。直到下标为n-1的数字与下标为n-2的数字作比较并做完交换
。。。。。。。。
时间复杂度:第一轮有n-1对数字要进行比较并交换,第二轮有n-2对数字要进行比较并交换。。。。
同样为一个等差数列(n-1)+(n-2)+(n-3)+。。。。。
所以冒泡排序的时间复杂度为O(n平方)
利用插入排序算法推导时间复杂度
假定有一个数组,数组中有n个元素
1.保证数组下标0~0之间有序,这个是肯定保证的
2.保证数组下标0~1之间有序,假设下标为1的数小于下标为0的数,那么这两个数字就作交换
3.保证数组下标0~2之间有序,0~1之间已经有序,2位置的数与1位置的数作比较,若2大,就和1作交换,若还大再和0作交换
。。。。。。。。
4.保证数组下标0~n之间有序,0~n-1之间已经有序,n位置的数向前逐个比较,若小就交换,若大就停止交换
时间复杂度(有两种极端情况):
①数组按照下标顺序为1,2,3,4,5,6。这种情况下时间复杂度为O(n)
②数组按照下标顺序为6,5,4,3,2,1。这种情况下需要交换次数为:1+2+3+4+5为等差数列,时间复杂度为O(n平方)
注意:此时的时间复杂度要按照最坏情况进行估计,所以插入排序的时间复杂度为O(n平方)
如何确定算法流程的时间复杂度?
当完成了表达式的建立,只要把最高阶项留下即可。低阶项都去掉,高阶项的系数也去掉。
记为:O(忽略掉系数的高阶项)
意义:当你的样本量大到一定程度,你会发现低阶项和高阶项的系数都变得不再重要了。
时间复杂度它是衡量算法流程的一种指标
额外空间复杂度
1.若你在程序中不需要开辟新的空间,只是申请了有限个变量,这时我们就称额外空间复杂度为O(1)
2.若你的程序中开辟了一个额外数组,那么我们就称你的额外空间复杂度为O(n)
3.若用户想实现的功能就是拷贝出和它传过来的参数一样的新数组进行返回,那么我们申请的数组的额外空间复杂度为O(1)
定义:额外空间复杂度与功能无关,只是为了支持这个需求你必须开辟的额外空间
常数项时间
若实现的逻辑的时间复杂度相同,此时我们就应该把常数项时间考虑进去
这时如果我们继续对两个算法进行拆分涉及到的东西就会很多,最简单的方法就是构造两个大样本,拿到程序中跑,比较时间
一个问题的最优解是什么意思?
在时间复杂度的指标上,一定要尽可能的低,先满足了时间复杂度最低这个指标后,使用最少的空间的算法流程
作者:http://cnblogs.com/lyc-code/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。