以下内容为学习总结,若有幸被大神看到,望指正其不准,补充其不足。万分感谢!!!
一、数据结构
(一)概念
百度百科:
数据结构是计算机存储、组织数据的方式。
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
数据结构往往同高效的检索算法和索引技术有关。
我的理解:
描述在内存中,数据元素之间的关系
(二)数据结构的结构分类
1、逻辑结构
- 定义
逻辑结构:指描述数据元素之间的前后关系,也叫称逻辑关系。
-
分类
-
集合结构
集合结构中的元素之间除了“同属一个集合” 的相互关系外,他们之间是并列的关系,别无其他关系;
-
线性结构
线性结构中的元素存在一对一的相互关系。
-
树形结构
树形结构中的元素存在一对多的相互关系。
-
图形结构
图形结构中的元素存在多对多的相互关系。
-
2、存储结构(物理结构)
-
定义
是指数据的逻辑结构在计算机存储空间的存放形式。即描述的是数据具体在内存中的存储。
-
分类
存储结构包括:表、堆栈、队列、数组、树、二叉树、图 等
主要分为两类:
-
顺序存储结构
把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。数组就是顺序存储结构的典型代表。如下图所示:
-
链式存储结构
把数据元素存放在内存中的任意存储单元里,也就是可以把数据存放在内存的各个位置。这些数据在内存中的地址可以是连续的,也可以是不连续的。如下图所示:
-
顺序存储于链式存储的区别
在于数据所占存储空间是否连续,顺序存储结构存储地址必是连续的;链式存储结构存储地址不是一定是连续的。
-
-
二、算法
(一)概念
百度百科:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,
算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
我的理解:
相当于以面向过程的思路解决问题的方法
(二)算法的特性
-
有穷性:
算法的执行步骤是有限的,算法的执行时间也是有限的。
-
确定性(确切性):
算法的每个步骤都有确切的 意义;即不会出现二义性。
-
可行性:
算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)
通俗讲:算法是可用的,可以解决当前问题。
-
输入:
一个算法具有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始值(即如果一个算法本身给出了初始条件,那么此时可以没有输入)。
-
输出:
算法至少有一个输出。输出形式可以是打印,也可以返回一个或多个值,也可以显示某些提示等。‘
(三)算法的设计要求
1、正确性
这是必然的
2、可读性
此要求可作为选取算法的一种判断条件
3、健壮性
-
健壮性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性。
-
通俗的讲,一个好的算法应该具有捕获异常/处理异常的能力。另外,对于测试人员的压力测试、边界值测试等刁难的测试手段,算法应该能够轻松的扛过去。
4、空间复杂度
- 算法执行时占用的内存。目前硬件提供的使用内存越来越多,所以在实际开发中,一般不考虑算法的空间复杂度,而且通常还会用空间换取时间。
5、时间复杂度
定义:
在算法分析中,算法的执行时间与原操作执行次数之和成正比的,所以用关键代码的执行次数来描述时间复杂度。
描述表达式:O(f(n));
有以下几种情况:
执行次数表达式G(n) | 时间复杂度O(f(n)) | 描述 |
---|---|---|
465465 | O(1) | 常数阶 |
3log(2)n+4 | O(logn) | 对数阶 |
3n+4 | O(n) | 线性阶 |
2n+3nlog(2)n+14 | O(nlongn) | nlogn阶 |
3n^2+4n+5 | O(n^2) | 平方阶 |
2n3+2n2+n+6 | O(n^3) | 立方阶 |
2^n | O(2^n) | 指数阶 |
总结:
-
时间复杂度有小到大:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)、O(n3)。
-
幂次时间复杂度有小到大O(2n)、O(n!)、O(n^n)
计算方式
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
举例:
上表中立方阶为例:G(n)=2n3+2n2+n+6
- 按第1条描述:加法常数为6,用1替换,此时G(n) =2n3+2n2+n+1;(如果是常数阶,表达式内没有变量,此时G(n)=1,结束).
- 按第2条描述:只保留最高阶项,此时G(n)=2n^3
- 按第3条描述:擦去常数项,此时G(n) = n^3.
- 最后得到的g(n)表达式就是f(n)=n^3。
(四)算法优劣的评定
一般算法的好坏是通过算法的时间复杂度和空间复杂度一起评定的,优质的算法使用内存小,运算时间短
(五)常见排序算法是时间复杂度
三、数据结构与算法之间的关系
(一)两者的关系
- 数据结构为算法提供服务。算法围绕数据结构操作。
- 程序 = 数据结构 + 算法。
(二)程序的好坏评定
程序的好坏可以根据这个公式来评定:
程序的好坏 = 时间复杂度 + 空间复杂度 + 应用场景 (重要)