数据结构和算法是计算机软件相关专业的基础课程,要想从事编程工作,无论是否是科班出身,都不可能绕过这部分知识。
从本篇开始,我会详细的复习一遍数据结构以及算法。
数据结构
数据结构: 是相互之间存在一种或多种特定关系的数据元素的集和。
基本概念
数据
数据: 是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号的集和。
数据包括: 整型等数值类型,以及声音图片等非数值类型。
数据元素
数据元素: 是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
数据项
数据项: 一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。
数据对象
数据对象: 性质相同的数据元素的集和,是数据的子集。
逻辑结构和物理结构
我们把数据结构划分为逻辑结构和物理结构。
逻辑结构
逻辑结构: 是指数据对象中数据元素之间的相互关系。
逻辑结构可分为以下四种:
- 集合结构: 集合结构中的数据元素除了同属于一个集合之外,他们之间没有其他关系
- 线性结构: 线性结构中的数据元素之间是一对一的关系
- 树形结构: 树形结构中的数据元素之间存在一种一对多的关系
- 图形结构: 图形结构的数据元素之间是多对多关系
物理结构(存储结构)
物理结构: 是指数据的逻辑结构在计算机中的存储形式。
根据物理结构的定义,实际上就是如何把数据元素存储到计算机的存储器中。存储器主要针对内存而言,外部存储器的数据组织通常用文件结构来描述。
物理结构可分为以下两种:
- 顺序存储: 是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的
- 链式存储: 把数据元素放在任意的存储单元,这组存储单元可以是连续的,也可以是不连续的
抽象数据类型
数据类型
数据类型: 是指一组性质相同的值的集合以及在此集合上的一些操作的总称。
抽象是指抽取出事物具有的普遍性的本质。抽象是一种思考问题的方式,隐藏了繁杂的细节,只保留实现目标所必须的信息。
抽象数据类型
抽象数据类型(Abstruct Data Type,ADT): 指一个数学模型及定义在该模型上的一组操作。
算法
算法: 是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的特性
算法具有五个基本特性: 输入、输出、有穷性、确定性和可行性。
输入输出
算法具有零个或多个输入,算法至少有一个或多个输出。
有穷性
有穷性: 指算法在执行有限的步骤后,自动结束而不会出现无限循环,并且每个步骤在可接受的时间内完成。
确定性
确定性: 算法的每一步骤都具有确定的含义,不会出现二义性。
可行性
可行性: 算法的每一步都必须是可行的。
算法的设计要求
- 正确性
- 可读性
- 健壮性
- 时间效率高和存储量低
函数的渐进增长
函数的渐进增长: 给定两个函数 f(n) 和 g(n),如果存在一个整数 N,使得对于所有的 n > N,f(n) 总是比 g(n) 大,那么,我们就说 f(n) 的增长渐进快于 g(n)。
判断一个算法的效率时,函数中的常数和其他次要项可以忽略,而更应关注最高阶项的阶数。
算法的时间复杂度
在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模 n 的函数,进而分析 T(n) 随 n 的变化情况并确定 T(n) 的数量级。算法的时间复杂度,也就是算法的时间的度量,记作: T(n) = O(f(n))。他表示随问题规模 n 的增大,算法的执行时间的增长率和 f(n) 的增长率相同,称为算法的渐进时间复杂度,简称时间复杂度。
这样用大写 O 来体现算法时间复杂度的记法,称之为大 O 表示法。
一般情况,随着 n 增大,T(n) 增长最慢的算法为最优算法。
推导大 O 阶方法
- 用常数 1 取代所有加法常数
- 只保留最高阶
- 如果最高阶存在且不是 1,则去除与这个项相乘的常数