考研二战失利,决定学习学习算法找工作。打卡学习算法的第一天。
一、什么是算法。
算法往往是是针对特定数据结构的同一问题的不同方法
二、如何评价算法的优劣?
算法的优劣由两个元素决定:时间复杂度、空间复杂度。
(1).时间复杂度
时间复杂度是衡量算法优劣的一个重要标准,计算时采用大O表示法。计算需注意如下:
1.计算时不考虑必须要做的操作如赋值、程序初始化等;
2.计算时应采用算法最坏情况时的时间复杂度作为算法最终的时间复杂度。
3.计算后的数值不考虑常数项和低次项。
如下列算法:
void mySort(int a[],int n)
{
for(int i=1; i<n; i++)--------------------------------------1
for(int j=i-1; j>=0&&a[j]>a[j+1]; j--)--------------------2
Swap(&a[j+1],&a[j]);------------------------------3
}
该算法是插入排序,语句1执行了n次。语句2在数组有序即最好情况时每次循环仅执行1次,总执行n次,在数组倒序即最坏情况时每次循环均执行i次,总执行(1+n)*n/2次。3语句循环内语句,忽略不计。取最大次数为时间复杂度则O(n)=n^2/2+n/2,忽略掉低次项及常数项,该算法的最终时间复杂度为O(n)=n^2.
算法时间复杂度大小排序:
O(1)<O(log n)<O(n)<O(nlog n)<O(n^a)<O(a^n)
(2)空间复杂度:
一般计算算法的空间复杂度多计算其额外空间复杂度即在要求给出的程序占有空间基础上额外添加的空间复杂度。如在进行排序时,给定了一个数组空间,而在写程序时额外多定义了一个数组来保存原有数组,那么这个多定义的数组所占有的空间即为我们所求的额外空间复杂度,而如果要求了同时输出排序好的数组和原有数组,那么这个多定义的数组便不占有额外空间,因为它是要求的。
第一天,要求不那么高,到此为止,躺床睡觉。