数据结构(一) - 绪论
绪论
算法的定义:
对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。
简而言之,算法就是解决问题的方法和步骤
算法的描述:
- 自然语言:英文、中文
- 流程图:传统流程图、NS流程图
- 伪代码:类语言:类C语言
- 程序代码:C语言、JAVA
算法与程序:
- 算法是解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。
- 程序使用某种设计语言对算法的具体实现
概念
-
一个好的算法首先要具备正确性,然后是健壮性、可读性,在几个方面都满足的情况下发,主要考虑算法的效率
-
算法的效率以以下两个方面来考虑:
- 时间效率: 算法所消耗的时间
- 空间效率: 算法执行过程中所消耗的存储空间
-
算法时间的度量
- 可以依据该算法编制的程序在计算机上执行所消耗的时间来度量
两种度量方法:
-
事后统计
- 将算法时间,测算其时间和空间的开销
- 缺点:编写程序实现算法将花费较多的时间和精力;所得实验结果依赖于计算机的软硬件登环境因素,掩盖算法本身的优劣
-
事前分析
-
对算法所消耗资源的一种估算方法
-
算法运行时间 = (每条语句的执行次数 * 该语句执行一次所需要的时间) 所有语句求和 , 又称为语句频度
-
每条语句执行一次所需的时间,一般是随机器而异的。取决于机器的指令性能、速度及编译代码的质量。是由机器本身
软硬件环境决定的,它与算法无关。
所以,我们可以假设执行每条语句所需的时间均为单位时间。此时对算法的运行时间的讨论就可转化为讨论该算法中所有
语句的执行次数,即频度之和了 -
若由某个辅助函数f(n), 使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。
记作T(n)=O(f(n)),称O(f(n))为算法的渐进3时间复杂度(O是数量级的符号),简称时间复杂度n 越大算法的执行时间越长
- 排序:n为记录数
- 矩阵:n为矩阵的阶数
- 多项式:n为多项式的系数
- 集合:n为元素的个数
- 树: n为树的结点的个数
- 图:n为图的顶点数与边数
-
-
算法时间复杂度的定义
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作:T(n)=O(f(n))
它表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐进时间复杂度
分析算法时间复杂度的基本方法
忽略所有低次幂项和最高次幂系数,体现增长率的含义
方法:
-
找出语句频度最大的那条语句作为基本语句
-
计算基本语句的频度得到问题规模n的某个函数f(n)
-
取其数量级用符号"O"表示
-
有些情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同
例如:在数组中,顺序查找某个元素,返回其所在的位置。- 最好情况是1次
- 最坏情况n次
- 平均时间复杂度:O(n)
算法时间效率的比较:
渐进空间复杂度
-
空间复杂度:算法所需存储空间的度量,记作:S(n) = O(f(n)),其中n为问题的规模(或大小)
-
算法主要占据的空间
-- 算法本身要占据的空间,输入/输出,指令,常数,变量登
-- 算法要使用的辅助空间列如:将数组逆序排列有不同的算法
//空间复杂度:S(n) = O(1)
public static int[] rever(int[] arr) {
int n = arr.length;
int t = 0;
for (int i = 0; i < n / 2; i++) {
// 后面的元素
t = arr[n - i - 1];
arr[n - i - 1] = arr[i];
arr[i] = t;
}
return arr;
}
//空间复杂度S(n)=O(n)
public static int[] rever2(int[] arr) {
int[] tmp = new int[4];
int n = arr.length;
for (int i = 0; i < n; i++) {
tmp[i] = arr[n - i - 1];
}
for (int i = 0; i < n; i++) {
arr[i] = tmp[i];
}
return arr;
}
本文内容引自青岛大学 王卓老师的讲课内容
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/16027962.html