对于这串代码实际所花时间是100次 我们用大O表示则是O(1);我们可能有疑问如果所需要的是200次300次包括几万次来说 ,我们仍然用O(1)来表示 ,计算机cpu现在家用基本等达到每秒50亿次
即使它取到最高的32位来说他所含有的时间复杂度仍然是O(1)
kaka今天讲解时间复杂度
首先一点 什么是时间复杂度 我们为什么要去考虑时间复杂度 我们如何去计算时间复杂度 ?
我们引入时间复杂度的概念 就是去计算算法的基本操作的执行次数
void Dnc(int N)
{
int count =0
for (int i = 0; i < N; i++)
{
++count;
for (int j = 0; j < N; j++)
{
++count;
}
}
for (int k = 0; k < N; k++)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
}
对于这串代码 我们所执行的次数 可以说是
但是通常我们在写代码时我们是不用去看整串代码的运行次数的 ,我们只要去看个大概就行,
因此我们应用大O渐进表示法
1 ,用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
使用大O的渐进表示法以后,Func1的时间复杂度为:。
当我们看Dunc()时如果 N=1000时,那么就是1002010我们用1000000,并不比它相差多少
所以我们用来表示
常见的时间复杂度举例
void Dunc(int N, int M)
{
int count = 0;
for (int i = 0; i < N; i++)
{
count++;
}
for (int j = 0; j< N; j++)
{
count++;
}
}
这串代码的时间复杂度就是O(M+N),我们暂时不能确定到底是o(M)大还是o(N)大如果 O(M)远大于O(N)时间复杂度就是 O(M)为之相反O(N);
void Dunc(int M)
{ int count=0;
for(int i=0;i<100;i++)
{
count++;
}
printf("%d" count);
}
对于这串代码实际所花时间是100次 我们用大O表示则是O(1);我们可能有疑问如果所需要的是200次300次包括几万次来说 ,我们仍然用O(1)来表示 ,计算机cpu现在家用基本等达到每秒50亿次
即使它取到最高的32位来说他所含有的时间复杂度仍然是O(1)
void Buddle(int *a,int n)
{ assert(a);
for(size_t end=n;end>0;--end)
{ int exchange = 0;
for(size_t=1;i<end;i++)
{ if(a[i - 1] > a[i])
Swap(&a[i - 1], &a[i]);
exchange = 1;
} if(exchange==0)
break;
}
}
对于这串代码 最好的情况就是有序,但是我们在一般是要考虑最坏的情况 就是每个数字两两互相交换 就需要(n-1)n/2 那么时间复杂度就是
int hedge(int* a, int n, int x)
{
assert(a);
int begin = 0;
int end = n - 1;
while (begin < end)
{
int mid = begin + ((end - begin) >> 1);
if (a[mid] < x)
begin = mid + 1;
else if (a[mid] > x)
end = mid - 1;
else
return mid;
}
}
对于二分查找最好的就是直接找到这个数字但是最坏情况就是找不到或者在一点相当小的空间里
那么就是那么它N=
long long Doc(size_t N)
{
if (N == 0)
{
return 1;
}
return Doc(N - 1) * N;
}
在递归中 我们在不停的调用 Doc(n),Doc(n-1),......直到Doc(2),Doc(1)调用了n次;
那么这段递归的函数来说就是O(n);
long long Doc(size_t N)
{
if (N == 0)
{
return 1;
}
return Doc(N - 1) * Doc(N - 2);
}
对于这串代码我们反复在调用O(N),每串调用中都在延长函数数的调用,因此时间复杂度是O(n^2)