瑞士计算机科学家Niklaus Wirth 教授提出:算法+数据结构=程序
算法:对数据运算的描述。
数据结构:数据的逻辑结构和存储结构
程序设计:针对实际问题选择一种好的数据结构和设计一个好的算法。
要设计出一个好的程序,就必须有好的算法。好的算法在很大程度上取决于描述实际问题的数据结构,必须建立在研究数据的特性及数据之间存在的关系的基础之上。
数据(data):描述客观事物的符号集合;
数据元素(data element):数据的基本单位,有时一个数据元素可由若干个数据项组成;
数据项(也称字段、域、属性):具有独立含义的最小标识单位;
数据对象(data object):具有相同性质的数据元素的集合。
数据结构(data):带有结构的数据元素的集合。
一般包括三方面内容:
1.数据的逻辑结构。数据元素之间的逻辑(或抽象)关系
①线性结构
数据元素(结点)之间存在着一对一的关系,且结构中仅有一个开始结点和一个终端结点,其余结点都是仅有一个 直接前趋和一个直接后继。如线性表,栈和队列。
②非线性结构
数据元素之间存在着一对多或多对多的关系,即一个结点可能有多个直接前趋和多个后继。如树,图,网状。
2.数据的存储结构(物理结构)。数据元素及其关系在计算机内的存储方式
两个结构
①顺序存储结构:向量中各元素按其逻辑关系”顺序“存储。
②链式存储结构:向量中各元素通过指针连接存储在内存中。
四种基本的存储方法实现
①顺序存储方法:把逻辑上相邻的结点存储在物理位置上也相邻的连续存储单元里;
②链接存储方法:用一组不一定连续的存储单元存储逻辑上相邻的元素,元素间的逻辑关系是由附加的指针域表示的;
③索引存储方法:在存储元素信息的同时,还建立附加的索引表。表中的索引项一般形式是:(关键字,地址)。关键字是能唯一标识一个元素的一个数据项或多个数据项的组合。
④散列存储方法:根据元素的关键字直接计算出该元素的存储地址。
3.数据的运算。对数据元素施加的操作(行为)
常用的运算:检索、插入、删除、更新、排序
数据类型(data type):一个值的集合和定义在这个值集上的一组操作的总称。
按”值“的不同特性划分
①原子类型(非结构类型):其值不可分解,例如基本类型(整型、实型、字符型和枚举型)以及指针类型和空类型等简单类型
②结构类型:其值可由若干个分量(或成分)按某种结构组成,它的分量可以是非结构型的,也可以是结构型的。例如数组、结构等。
抽象数据类型(Abstract Data Type,ADT):是抽象数据的组织和与之相关的操作。例如并、交、差运算
算法:对特定问题的求解步骤的一种描述,指令的有限序列。
特性
- 有穷性:算法在执行有穷步后能结束
- 确定性:每一指令有确切的含义,无二义
- 可行性:每一操作都可以通过已经实现的基本运算执行有限次来实现
- 输入:零个或多个人输入
- 输出:一个或多个输出
算法的评价标准
(1)正确性:对于一切合法的输入数据,该算法经过有限时间的执行都能得到正确的结果;
(2)时间复杂性:执行算法所耗费的时间;
(3)空间复杂性执行算法所耗费的存储空间;
(4)易于理解、易于编程、易于调试。
时间复杂度
运行时间=算法中每条语句执行时间之和
每条语句执行时间=频度*语句执行一次所需时间
但是不同计算机系统执行一次基本操作的时间是千差万别,不能用一个统一的标准来衡量
(渐进)时间复杂度:T(n)=O(f(n))
n-问题规模