基本概念
1.数据结构起源
计算机除了数值计算问题以外还需要解决现实生活中很多的问题,而这些问题涉及到现实中很多复杂的对象,不同对象之间具有复杂的关系,数据结构正是描述这些对象之间复杂关系的。但数据结构并非研究复杂算法的一门学科。
2.数据结构基本概念
- 数据:
程序中要操作的对象,用于描述客观事物。可被输入到计算机,也可被计算机处理。如:
- 1
- 数据对象:
性质相同的数据元素的集合
- 1
- 2
- 数据元素:
组成数据的基本单位(集合中具体的一个元素/成员/节点)
- 1
-
数据项:
数据元素中基本组成部分 -
数据结构:
数据对象中数据元素(节点)之间的关系
3.数据结构的逻辑关系
4.数据结构的物理结构
5.数据运算
6.算法
特定问题的求解步骤,表现为指令的有序集合。语言不重要,思想更重要!是解决问题的思想和方法!
7.数据结构和算法的关系
数据结构只是静态的描述数据元素之间的关系,算法是在数据结构的基础上设计和现实相应的解决问题的步骤。高效的程序需要有效的结合数据结构和算法。相辅相成。
8.算法特点
- 输入:具有0个或多个输入
- 输出:至少有一个输出
- 有穷性:在有限步骤之后就会结束
- 确定性:每一步都有确定的含义不出现二义性
- 可行性:在计算机上可运行实现
9.算法效率的度量
- 算法最终要编译成具体的计算机指令
- 每一条指令在具体的计算机CPU上运行时间是固定的
- 通过具体的n的步骤的多少就可以推导出算法的复杂度
9.1事后统计法
含义:
比较不同算法对同一组输入数据的运行处理时间
缺陷
- 为了获得不同算法的运行时间必须编写相应程序
- 运行时间严重依赖硬件以及运行时的环境因素
- 算法的测试数据的选取相当困难
- 事后统计法虽然直观,但是实施困难且缺陷多
9.2事前分析估算
含义
依据统计的方法对算法效率进行估算
影响算法效率的主要因素
- 算法采用的策略和方法
- 问题的输入规模
- 编译器所产生的代码
- 计算机执行速度
9.3常规估算注意事项
- 注意1:判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。
- 注意2:在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。
10.大O表示法
- 算法效率严重依赖于操作(Operation)次数数量
- 在判断时首先关注操作数量的最高次项
- 操作数量的估算可以作为时间复杂度的估算
O(5) = O(1)
O(2n + 1) = O(2n) = O(n)
O(n2+ n + 1) = O(n2)
O(3n3+1) = O(3n3) = O(n3)
11.空间复杂度
算法的空间复杂度通过计算算法的存储空间实现
S(n) = O(f(n))
其中,n为问题规模,f(n))为在问题规模为n时所占用存储空间的函数
大O表示法同样适用于算法的空间复杂度
当算法执行时所需要的空间是常数时,空间复杂度为O(1)
空间与时间的策略
多数情况下,算法执行时所用的时间更令人关注
如果有必要,可以通过增加空间复杂度来降低时间复杂度
同理,也可以通过增加时间复杂度来降低空间复杂度
12.面试题(时间和空间的互换)
在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。设计一个算法,找出出现次数最多的数字。