一数据结构概述
1数据结构的认识
计算机解决数据的输入、输出和操作(数据的存储和数据的运算);
在计算机中需要实现不同数据类型元素之间的数据的存储和运算功能;可以使用数据结构和处理逻辑实现。
综述:其实质数据结构指的是对于数据元素之间的逻辑关系和存储关系。并通过运算实现数据元素的访问和操作。
数据逻辑关系:也称为逻辑结构,主要包含线性结构和非线性结构(树形结构、图形结构);
数据存储关系:表示数据在内存中的存储结构,主要顺序存储和链式存储;
数据的运算:数据基本运算、数据的排序、分类、增、删、改、查、等运算方式。
1.1数据的逻辑结构
所谓的逻辑结构,指的是数据元素之间的逻辑关系,具体包含有:集合关系、线性关系、非线性关系(树形结构和图形结构);
-
集合关系
所谓的集合关系,指的是多个数据元素同属于一个集合中,元素之间没有其它任何关系。
-
线性关系
所谓的线性关系,指的是同一个集合中的多个元素之间满足一对一的线性结构关系:
1) 起始数据元素没有直接前驱,有且仅有一个直接后继;
2) 末尾数据元素没有直接后继,有且仅有一个直接前驱;
3) 中间的所有数据元素,有且仅有一个直接前驱和直接后继;
实例:一个班级学生管理,所有的学生都有一个编号(学号)
序号连续存在的,其中某一个学号所相邻的元素,
-1 为前驱, +1后继。
-
层次结构
所谓的层次结构,也称为分层结构关系,也称为树形结构。元素之间满足一对多的逻辑关系。
1) 起始数据节点有且仅有一个,没有直接前驱,可以有多个直接后继;
2) 末尾数据节点可以有一个或者多个,其中任意一个末尾数据节点没有直接后继,有且仅有一个直接前驱;
3) 中间的所有数据节点,有且仅有一个直接前驱,可以有一个或者多个直接后继。
-
网状结构
所谓的网状结构,也称为图形结构关系,元素之间满足多对多的逻辑关系。
1) 起始数据顶点可以是多个,末尾数据顶点也可以是多个;
2) 任意一个数据顶点,都可以有多个直接前驱和直接后继。
-
-
1.2数据的存储结构
所谓的存储结构,指的是数据元素在内存中的存储方式,通过存储方式表示数据元素的逻辑关系,存储结构主要包含:
-
散列存储
所谓的散列存储,主要用于集合关系数据元素的存储,集合中数据元素在内存中根据数据元素的特殊字段(称为关键字key)随机地址空间存储。在访问的过程中通过字段信息访问,所以称为hash存储。
-
顺序存储
所谓顺序存储,指的是集合中的数据在内存中开辟连续存储空间存储,通过数据元素存储位置的序号表示元素之间的逻辑关系。
-
链式存储
所谓链式存储,指的是集合中数据元素在内存中随机开辟存储空间存储,通过数据元素存储空间的地址表示元素之间的逻辑关系。
1) 前驱数据元素存储空间中,存储前驱数据元素本身和后继数据元素存储空间的地址,实现前驱对后继数据元素的访问。
2) 后继数据元素存储空间中,存储后继数据元素本身和前驱数据元素存储空间的地址,实现后继对前驱数据元素的访问。
-
索引存储
所谓的索引存储,指的是在存储数据(顺序存储或者链式存储)的同时,创建一个附件索引表(存储数据的索引信息)。
索引存储结构 = 数据文件 + 索引表。
意义:提供数据访问的效率。
2数据结构基本概念
-
数据(Data)
所谓数据,指的是信息的载体,是能够输入到计算机中并能被计算机所识别、存储和处理的符号;
-
数据元素(Data Element)
所谓的数据元素,是数据的基本单位,又称为记录(Record),其实质是一条数据信息。
-
数据类型(Data Type)
是对数据元素的抽象(数据类型是对数据元素取值范围与运算的限定,最终用计算机语言的数据类型进行存储)。
3数据结构的定义
所谓的数据结构指的是用于研究数据元素之间的逻辑关系和存储关系,在对数据结构的定义中需要表示整个数据结构中的数据元素集合和数据元素之间的关系集合;
DS = (D, R)
其中:D 表示数据元素集合;R 表示数据元素之间的关系集合;
4数据结构的总结
注意:
在运算过程中,具体运算的实现:
运算逻辑由逻辑结构决定;
具体实现算法由存储结构决定。
二,算法的概述
1算法的概念
1.1算法的定义
所谓的算法(Algorithm),指的是一个有穷规则(或语句、指令)的有序集合。
它确定了解决某一问题的一个运算序列。对于问题的初始输入,通过算法有限步的运行,产生一个或多个输出。
1.2算法的特性
1) 有穷性:算法执行的步骤(或规则)是有限的;
2) 确定性:每一个步骤是确定的,无二义性;
3) 可行性:每一个步骤能够在有限时间范围内完成;
4) 输入:在运行的时候,需要由一个或者多个数据输入;
5) 输出:在运行结束后可以得到一个或者多个输出。
1.3算法和程序的区别
-
共同点:
算法和程序都是为了完成某个任务或解决某个问题而编制的规则(或语句)的有序集合
-
不同点:
a. 算法必须是有穷的,而程序不一定是有穷的并且实际程序中绝大多数都是无穷的。
b. 算法与计算机无关,但程序依赖于具体的计算机语言;
c. 算法可忽略一些语法细节问题,重点放在解决问题的思路上,但程序必须严格遵循相应语言工具的语法。
d.算法本身不能在计算机中执行,需要转换为程序才能执行。
2算法的评估
对于所设计的算法应用需要评估其优劣,具体评估的思路
- 算法的时间复杂度(算法执行所消耗的时间),决定程序运行(解决问题)的效率;
- 算法的空间复杂的(算法执行所消耗辅助空间),决定程序运行的空间利用率。
- 容易理解、容易编程和调试、容易维护
2.1算法的时间复杂度
2.1.1算法的时间复杂度计算
所谓算法时间复杂度计算,指的是将算法所有语句执行时间的累加。
问题的规模 :输入数据量的大小,用n来表示。
算法的时间复杂度 :算法消耗时间,它是问题规模的函数 T(n)。
语句的频度f:指语句执行的次数
语句执行周期t:指语句每次执行消耗的时间
语句消耗的时间:频度f * 周期t
整个算法的时间复杂度:表示算法所有语句消耗的时间累积和。
for(i = 0; i < n; i++) { /* 语句的频度 n */
printf("test"); /* 语句的频度 n*1 */
for (j = 0; j < n; j++) { /* 语句的频度 n*n */
for (k = 0; k < n; k++) { /* 语句的频度 n*n*n */
}
}
}
整个算法的时间复杂度:n+n+n^2+n^3 => n^3 + n^2 + 2n n-> ∞ T(n) = n^3
2.1.2算法的时间复杂度度量
算法效率——用依据该算法编制的程序在计算机上执行所消耗的时间来度量。(算法时间是由控制结构和原操作的决定的)
记号——引用了“O”。“O”表示一个 数量级的概念。
根据算法中语句执行的最大次数(频度)来 估算一个算法执行时间的数量级。
时间复杂度:算法中基本操作重复执行的次数是问题规模n的某个函数f(n),
T(n) = O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
T(n)的量级通常有:
O©——常数级,不论问题规模多大,T(n)一致,因而是理想的T(n)量级;
O(n)——线性级;
O(n2),O(n3)——平方、立方级;
O(log2n),O(n*log2n) —— 对数、线性对数级;
O(2^n)——指数级,时间复杂度最差。
当n的取值不同,时间复杂度不同。需要根据不同n值选择合适的方式处理。
2.1.3复杂算法时间复杂度
对于复杂的算法,一般采用分段实现,将复杂的算法分解为多个简单子算法,在计算时间复杂度的时候,可以通过时间复杂度的累加实现,实质是最值问题(算法最终时间复杂度由时间复杂度最差的决定)。
2.2算法的空间复杂度
设算法对应问题的体积(或规模)为n,执行算法所占存储空间的量级为D(n),则D(n)为算法的空间复杂度(Space Complexity)。
3数据结构及算法
程序 = 数据结构 + 算法。