算法和数据结构
著名计算机科学家N.Wirth教授提出一个公式:
算法+数据结构=程序
算法有五个重要特性
1.有穷性
2.确定性
3.可行性
4.输入
5.输出
要得到一个高效的算法,在设计算法时,就要对算法的执行时间有一个客观的分析。
一般的,把算法中包含的简单操作的次数的多少称为算法的时间复杂度,它是一个算法运行的相对量度。
int sum(int a[], int n)
{
int s = 0, i;
for (i = 0;i < n;i++)
s += a[i];
return s;
}
int sum(int a[], int n)
{
int s = 0,i = 0; //1,1
while (i < n) //n+1
{
s += a[i]; //n
i++; //n
}
return s; //1
}
这一串代码时间复杂度就是T(n)=3n+4
以下是几个计算时间复杂度的例子大家应该可以看懂
//矩阵相加
void matrixxadd(int a[][n], int b[][n], int c[][n])
{
int i, j; //1,1
for (i = 0;i < n;i++)
for (j = 0;j < n;j++)
c[i][j] = a[i][j] + b[i][j];
}
//4n*n+5n+2
x=x+1 //1
for(i=1;i<=n;i++) //n
x=x+1
for(i=1;i<=n;i++) //n*n
for(j=1;j<=n;j++)
x=x+1
for (i = 1;i <= n;i++) //n*(n-1)/2
for (j = i;j <= n;j++)
x = x + 1
void bubble_sort(int a[], int n)
{
int temp, i, j, change = 1;
for (i = n - 1, change = 1;i > 0 && change = 1;i--)
{
change = 0;
for(j=0;j<i;j++)
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
change = 1;
}
}
}
//最坏的情况n(n+1)/2
实际上,一般也没有必要精确的计算算法的时间复杂度,只要大致计算数量级就可以了。
T(n)=O(f(n))
给大家推荐一篇文章,对于时间复杂度讲述的十分详细。
时间复杂度