14天阅读挑战赛
努力是为了不平庸~
目录
知识点
算法:
是为了解决某类问题而规定的一个有限长的操作序列。
简单来说就是一系列的计算过程,用来将输入的数据转化为输出结果。
一个算法必须满足一下5个重要特性
1、有穷性,在执行完有穷步后结束,且每一步在有穷时间内完成。
2、确定性,执行的每步操作明确,不会产生二义性。
3、可行性,所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
4、输入,一个算法有0个或多个输出。
5、输出,一个算法有一个或多个输出。
时间复杂度:
衡量一个算法的运行快慢。
空间复杂度:
衡量一个算法运行所需要的额外空间。
时间复杂度分析举例
1、常量阶
算法的执行次数是一个常数,不管这个常数有多大,时间复杂度都是O(1)。下述代码块的时间复杂度就是O(1)。
int k,i;
for(i=0;i<100;i++)
{
k++;
}
2、多项式阶
算法的时间复杂度是多项式,例如O(n),O(
),O(
)。
T(n)=O(n)
for(i=0;i<n;i++)
{
k++;
}
T(n)=O()
int a=0,b=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
a++;
}
for(int i=0;i<n;i++)
{
b++;
}
对于有多个循环的语句,时间复杂度由最深层循环内的基本语句的频度决定。
T(n)=O()
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
{
a++;
}
3、指数阶
由于指数阶算法的运行效率极差,所以编程时,一般极力避免出现指数阶的算法。例如
O(
)、O(
)等。
4、对数阶
运行效率较高。所以一般算法时间复杂度追求对数阶。
for(int i=0;i<n;i=i*2)
{
a++;
}
上述算法的时间复杂度T(n)=O(Log2n)
空间复杂度分析举例
题目描述
数组逆序排列,将一维数组a中的n个数逆序存放到原数组中。
算法1
for(int i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-1-i];
a[n-1-i]=t;
}
算法2
for(int i=0;i<n;i++)
{
b[i]=a[n-i-1];
}
for(int i=0;i<n;i++)
{
a[i]=b[i];
}
算法1借助一个变量t,与问题规模n大小无关,所以空间复杂度为O(1)。
算法2需要借助一个大小为n的辅助数组b,所以空间复杂度为O(n).
总结
分析算法一般从两个方面分析,时间复杂度和空间复杂度。一般情况下,运算空间是较为充足的,所以,时间复杂度就是分析的重点。 因此,在编写算法的过程中,我们要尽可能的降低算法的时间复杂度。
通过本节课的学习,让我们初步了解了算法,明白了如何评价一个算法的好坏。