程序=数据结构+算法
Program equals data structure plus algorithm
一.基本概念
Basic conceptiom
数据元素(元素/记录/结点/顶点)Data elements
(elements/records/nodes/vertices)
数据>数据元素(组成数据的基本单位)>数据项(构成数据元素的不可分割的最小单位)
如:学生表>个人记录>学号、姓名
数据对象:性质相同的数据元素的集合,是数据的子集
结构:数据元素相互之间的关系Structure: The relationship between data elements
逻辑结构的种类
Types of logical structures
划分方式一:
(1)线性结构:线性表,栈,队列,串
Linear structure: linear table, stack, queue, string
(2)非线性结构:树,图
Nonlinear structures: Trees, graphs
划分方式二:四类基本逻辑结构:
(1)集合结构
Set structure
(2)线性结构(一对一)
Linear structure (one-to-one)
(3)树形结构(一对多)
Tree structure (one-to-many)
(4)图状结构/网状结构
Graph structure/network structure
存储结构的种类
(1)顺序存储结构
Sequential storage structure
(2)链式存储结构
Chain storage structure
(3)索引存储结构
Indexed storage structure
(4)散列存储结构
Hash storage structure
(1)顺序存储结构:用一组连续的存储单元依次存储数据元素,元素之间的逻辑关系由存储位置来表示。C语言中用数组来实现顺序存储结构。
(2)链式存储结构:用一组任意的存储单元存储数据元素,元素之间的逻辑关系由指针来表示。C语言中用指针来实现顺序存储结构。
(3)索引存储结构:在存储数据元素信息的同时,还建立附加的索引表。索引项:(关键字,地址) 。稠密索引Dense Index;稀疏索引Sparse Index。
(4)散列存储结构:根据数据元素的关键字直接计算出存储地址。
数据类型和抽象数据类型
Data types and abstract data types
高级语言(如C语言)的数据类型明显的或隐含的规定了在程序在程序执行期间变量和常量的所有可能取值范围,以及所允许进行的操作。
数据类型Data Type:一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。
数据类型=值的集合+值集合上的一组操作
抽象数据类型Abstract Data Type,ADT:一个数学模型(逻辑结构)以及定义在此数学模型上的一组操作(抽象运算)。不考虑计算机内的具体存储结构与运算的具体实现算法。
抽象数据类型的形式定义:(D,S,P)
D数据对象,S是D上的关系集,P是对D的基本操作集
抽象数据类型的定义格式:
参数表:
赋值参数(只提供输入值)
引用参数(提供输入值且返回操作结果)
算法和算法分析
Algorithms and algorithm analysis
算法的描述
自然语言:英文,中文
流程图:传统流程图,NS流程图
伪代码:类语言:类C语言
程序代码:C语言程序
算法与程序
算法特性:
1.有穷性
2.确定性
3.可行性
4.输入:0或多个
5.输出:一个或多个
算法设计的要求:
Requirements for algorithm design
1.正确性Correctness
2.可读性Readability
3.健壮性Robustness
4.高效性Efficiency
(健壮性,乍一听:哇哦)
算法效率
Algorithm efficiency
1.时间效率Time efficiency:算法所耗费的时间
2.空间效率Spatial efficiency:算法执行过程中所耗费的存储空间
二者有时候矛盾
算法时间效率的度量
A measure of the time efficiency of an algorithm
算法时间效率,可以依据该算法编制的程序,在计算机上执行,所消耗的时间来度量。
两种度量方法:
事后统计Post hoc statistics:实现算法,然后测量时间和空间的开销。(缺点是可能比较依赖计算机软硬件的条件就是会掩盖算法本身的一些优劣情况)
事前分析Prior analysis:对算法要耗费的资源进行估算的方法。
所以一般更多采用事前分析法
事前分析法
算法运行时间=一个简单操作所需的时间×简单操作次数
算法运行时间=∑每条语句的执行次数(语句频度)×该语句执行一次所需的时间(一般由机器本身软硬件环境决定,与算法无关)
假设每条语句执行一次所需的时间均为单位时间,即讨论算法运行时间就是讨论频度之和
数组vs链表
最近看一位印度top ceder的B站视频,讲的好棒