一,什么是数据结构和算法?
数据结构是计算机存储,组织数据的方式,之相互之间存在特定关系的数据元素的集合。
算法是定义良好的计算过程,简单来说算法就是一系列的计算步骤,用来将输入数据转化成为输出结果。
二,算法的效率
衡量一个算法的好坏,一般是从时间和空间的角度来衡量的。时间复杂度主要衡量一个算法的运行快慢,空间复杂度主要衡量一个算法运行所需要的额外空间。·
(一)时间复杂度:
算法中基本操作的执行次数,为算法的时间复杂度。
例如以下的代码:
void Func(int N)
{
int count = 0;
//代码段1
for (int i = 0; i < N ; ++ i)
{
for (int j = 0; j < N ; ++ j)
{
++count;
}
}
//代码段2
for (int k = 0; k < 2 * N ; ++ k)
{
++count;
}
//代码段3
int M = 10;
while (M--)
{
++count;
}
}
代码段1:在i中,循环n次;在i增大时,j随着i的增大,也进行循环且每当i增加1,j循环n次。所以 代码段一的循环次数是n^2。
代码段2:k会循环2n次。
代码段3:当M为0时会结束,所以循环次数为10次。
所以对于这个Func函数,它的具体操作次数是:
F(N) = N ^ 2 + 2 * N + 10
但是准确的时间复杂度,不方便对代码的效率进行比较,我们只需要大概的执行次数,就可以来评估代码效率的高低。
大O的渐进表示法:去掉了对结果影响不大的项,简洁地表示了执行次数
用1表示常数;只保留最高阶项;去掉相乘的常数。
对于上面的例子,可以写作:O(N^2)
(二)空间复杂度
不是算新开辟的字节数,而是算为了算法临时开辟的对象变量的个数。
空间复杂度也是一个数学表达式,也可以使用大O的渐进表示法。
(三)常见复杂度的对比
O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!)
logn默认是以2为底的,要注意不是10。
一般来说,对于复杂度是立方阶以上的算法就不推荐使用了。