数据结构基础知识的理解(算法和算法分析)

算法是为了解决某类问题而规定的一个有限长的操作序列,简而言之,算法就是解决问题的方法和步骤。程序使用某种程序设计语言对算法的具体实现。程序 = 数据结构 + 算法, 数据结构通过算法实现操作,算法根据数据结构设计程序。

一个算法必须有五个重要特性:有穷性,确定性,可行性,输入,输出。
评价算法优劣的基本标准:正确性,可读性,健壮性,高效性。
一个算法首先要具备正确性,然后是健壮性,可读性。在几个方面都满足的情况下主要考虑的是算法的效率。算法的效率主要考虑时间效率,空间效率。
1.时间效率:算法所耗费的时间。
2.空间效率:指的是算法执行的过程中所耗费的储存空间。
3.时间效率和空间效率是相互矛盾的。

考虑算法效率在目前情况下主要考虑的是时间效率。
算法运行时间 = 一个简单操作所需的时间 * 简单操作次数,由于每条语句执行一次所需要的时间是由机器本身软硬件环境决定的,与算法无关。所以我们可以假设执行每条语句 所需的时间均为单位时间。此时对算法效率的研究就可以转化为对所有语句执行次数的研究。

例:
for(int i = 1; i <=n; i++) // n + 1 次
for(int j = 1; j <= n; j++) // n * (n + 1) 次
{
a[i][j]= 1; // n * n 次
}
总运行次数为 :f(n) = 2 * n * n + 2 * n + 1;
T(n) = n * n;
当 n 趋向于无穷大时,T(n) / f(n) = 2;则称 f(n) 是 T(n) 的同数量级函数 。记作 T(n) = O(f(n)) , O(f(n))称为算法的渐进时间复杂度(O是数量级符号),简称时间复杂度。

时间复杂度的定义:
一般情况下,算法中基本语句重复执行的次数是问题规模 n 的某个函数 f(n) ,算法的时间量度记作: T(n) = O(f(n));
它表示随问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。

例:
分析时间复杂度
i = 1;
while(i <= n)
i = i * 2;
解题思路:
显然 i = i * 2;是基本语句;
当循环 1 次:i = 1 * 2 = 2;
当循环 2 次:i = 2 * 2 = 2^2;
当循环 3 次:i = 2^2 * 2 = 2^3 ;
当循环 x 次:i = 2 * 2 * 2 * 2 * 2 * 2… = 2^x;
设基本语句执行的次数为x,由循环条件得
i <= n.
所以,2^x <= n;
所以,x <= log(2) n;
所以,2^f(n) <= n, 即 f(n) <= log(2) n, 取最大值,f(n) = log(2) n;
所以该程序的时间复杂度 T(n) = O(log(2) n);

综上:
分析时间复杂度的三个步骤
1.找到基本语句;
2.执行次数表示为关于 n 的函数;
3. 找出函数的数量级用“O”表示;

补充:
1.有的情况算法中基本操作的重复执行次数还和问题的输入数据集有关。例如查找数组中的等于常数 e 的元素,基本操作的次数会和数组中每一元素的位置有关。这种情况下,总是考虑最坏的情况。
时间复杂度运算规则:
加法规则:T(n) = T1(n) + T2(n) = O(f1(n)) + O(f2(n)) = O( max ( f1(n), f2(n) ) );
乘法规则:T(n) = T1(n) * T2(n) = O(f1(n)) * O(f2(n)) = O( f1(n) * f2(n) );

文章借鉴:《数据结构》(C语言版)(第二版)人民邮电出版社;青岛大学–王卓老师

发布了11 篇原创文章 · 获赞 22 · 访问量 6498

猜你喜欢

转载自blog.csdn.net/m0_46168903/article/details/103993914
今日推荐