时间复杂度
算法时间复杂度定义: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量 级。算法的时间复杂度,
也就是算法的时间量度,记作:T(n) =O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和 f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。
这样用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。 一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。
显然,由此算法时间复杂度的定义可知,我们的三个求和算法的时间复杂度分别 为O(n),O(1),O(n^2)。
我们分别给它们取了非官方的名称,O(1)叫常数阶、O(n)叫线 性阶、O(n^2)叫平方阶等。
推导大O阶: 1.用常数1取代运行时间中的所有加法常数。 2.在修改后的运行次数函数中,只保留最高阶项。 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 得到的结果就是大O阶。
——《大话数据结构》
常数阶
int sum=1;
int x=0;
int y=10;
all=x+y+sum;
时间复杂度:O(4)化简为O(1)
线性阶
寻找与规模相关的循环体,计算O(1)序列的运行次数
for(int i=0;i<n/2;i++){
int temp=arr[i];
arr[i]=arr[len-1-i];
arr[len-1-i]=temp;
}
arr[]={1,2,3,4}实现逆序arr[]={4,3,2,1}
时间复杂度:O(n/2)化简为 O(n)
对数阶
for(int i=1;i<n;i*=2){
//O(1)序列
}
时间复杂度:2^(次数)>= n 时,循环停止,
化简即:O(log n)
平方阶
循环嵌套
for(int i=0;i<n;i++){
for(int j=0,j<n;j++){
//O(1)序列
}
}
时间复杂度:O(n^2)
for(int i=0;i<n;i++){
for(int j=0,j<n-1-n;j++){
//O(1)序列
}
}
时间复杂度:观察知,共有 n(n-1+1)/2 次,
化简即:O(n^2)
算法效率:O(1)>O(log n)>O(n)>O(n^2)
//冒泡排序
int BubbleSort(int* arr, int len) {
bool flag = true;
for (int i = 0; i < len; i++) {//i 控制次数
for (int j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
flag = false;
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if (flag ==true) {
break;
}
}
最优时间复杂度:O(n)
时间复杂度:O(n^2)
空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公 式记作:S(n)=0(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的 函数。——《大话数据结构》