1,时间复杂度
时间复杂度:计算大概的语句运算次数。
大O的渐进表示法:
(1)用常数1代替所有加法常数。
(2)只保留最高阶项。
(3)如果最高阶项存在且不是1,则去掉与这个数相乘的常数。(3n^2=n^2)
例子(子函数部分):二分查找(必须是在排序好的数组中进行)
时间复杂度是:O(log 2 n)
#include<stdio.h>
fun(int k, int len,int a[])
{
int mid;
int left = 0;
int right = len - 1;
while (left < right)
{
mid = (left + right) / 2;
if (a[mid] == k)
{
break;
}
else if (a[mid] > k)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return mid;
}
例2:斐波那切数列
(1)反例:
时间复杂度是:O(2^n)
#include<stdio.h>
long long fun(size_t n)
{
return n < 2 ? n : fun(n - 1) + fun(n - 2);
}
//因为他的时间复杂度是n^2,导致时间占用过长。
(2)正例:
时间复杂度是:O(n)
#include<stdio.h>
#include<stdlib.h>
long long* fib(size_t n)//size_t是无符号整数
{
long long* fibarray =malloc(sizeof(long long) * (n + 1));
//(n+1)是为了防止n=0,导致数组空间不够。
//malloc需要stdlib.h头文件,且不会占用堆栈空间
fibarray[0] = 0;
fibarray[1] = 1;
for (int i = 2; i <= n; i++)
{
fibarray[i] = fibarray[i - 1] + fibarray[i - 2];
}
return fibarray;
}
int main()
{
//int n = 50;
//long long* result = fib(n);
//printf("%d", result[n]);
//free(result);
printf("%lld", *fib(10));
return 0;
}
//以时间换空间
2,空间复杂度(不是重点)
空间复杂度:计算大概定义的变量数量