数据结构(c语言)-诸论
学习笔记
目录
文章目录
思维导图
一、什么是数据结构
1.概念:
- 数据 :所有能够输入到计算机中,且能被计算机处理的符号的集
- 数据元素(结点):是数据(集合)中的一个“个体”,它是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
- 数据项:是构成数据元素的不可分割的最小单位
- 数据对象:具有相同性质的若干个数据元素的集合,如整数数据对象是所有整数的集合
2.数据结构
* 定义:是指带结构的数据元素的集合(数据对象)。
2.1 逻辑结构
- 数据元素之间的逻辑关系,数据的逻辑结构与数据的存储无关,独立于计算机,它可看作从具体问题抽象出来的数据类型。
分类:
-
集合结构
-
元素之间同属于一个集合但是没有任何关系
-
-
线性结构
-
线性表、栈、队列、串
- 元素之间存在(一对一)关系
-
-
非线性结构
-
树形结构:
-
元素之间存在(一对多)关系
-
-
图形结构:
- 元素之间存在(多对多)关系
-
2.2 存储结构
-
数据的逻辑结构在计算机存储器中的存储表示称为数据的存储结构(也称为映射),也就是逻辑结构在计算机中的存储实现。
-
存储结构的4种方式
-
顺序存储:用一组连续的存储单元依次存储数据元素,物理存储位置反映逻辑位置。
例如:数组
-
链式存储:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。
例如:链表
-
索引存储:在存储数据元素信息的同时还建立附加的索引表。优点是查找效率高。
-
散列存储:一般情况物理上可以将数据元素存储在一片连续的区域内,需要通过函数hash(哈希)来确定存储位置。优点是查找效速度快。
-
2.3数据的操作
- 初始化:创建、销毁
- 数据操作:插入、添加、删除、修改
- 数据使用:查找、遍历
2.4总结
- 数据结构包括三个方面:逻辑结构、存储结构、数据运算
- 数据元素之间的逻辑关系 => 数据的逻辑结构。
- 数据元素及其关系在计算机中的存储方式=> 数据的存储结构(或物理结构)。
- 施加在该数据上的操作 => 数据运算。
3.数据类型
- 数据类型(date type)是一组性质相同的值的集合和定义在此集合上的一组操作的总称,是某种程序设计语言中已实现的数据结构。
- 整形[byte、short、int、long]
- 浮点型[float、double]
- 布尔型[boolean]
- 字符型[char]
4.抽象数据类型
-
抽象数据类型:指的是用户进行软件系统设计时从问题的数据模型中抽象出来的逻辑数据结构上的运算,而不考虑计算机的具体存储结构和运算的具体实现算法。
-
抽象数据类型的基本描述格式:
ADT 抽象数据类型名 { 数据对象:数据对象的声明 数据关系:数据关系的声明 基本运算:基本运算的声明 }
- 抽象数据类型定义中,数据的对象的类型,逻辑关系的具体存储方式以及操作的实现细节均可以忽略
-
数据结构角度求解问题的过程
二、算法及其描述
1.算法的定义
-
算法(algorithm)是对特定问题求解步骤的一种描述,它是指命令的有限序列。
-
算法5个重要特性:
(1)有穷性:在有穷步之后结束,算法能够停机。
(2)确定性:无二义性。
(3)可行性:可通过基本运算有限次执行来实现,也就是算法中每一个动作能够被机械地执行。
(4)有输入:有0个或者多个输入。
(5)有输出:有1个或者多个输出。
2.算法设计的5大目标
(1)正确性:要求算法能够正确地执行预先规定的功能和性能要求。
(2)可使用性:要求算法能够很方便地使用。
(3)可读性:算法的逻辑必须是清晰的、简单的和结构化的。
(4)健壮性:具有很好的容错性,即提供异常处理,能够对不合理的数据进行检查。
(5)高效性:执行时间少,占用的存储空间小。
3.算法描述
- 自然语言
- 流程图
- 盒式图
- 伪代码
- 高级语言
4.算法与程序的区别
- 算法侧重于对解决问题的方法描述,即要做什么。
- 程序是指使用某种计算机语言对一个算法的具体实现,即具体要怎么做。
算法用计算机语言描述 ==> 程序
三、算法分析
1.时间复杂度(Time complexity)
(1)程序执行时间:
-
事前统计方法
- 算法无关
- 书写算法的程序设计语言
- 编译产生的机器语言代码质量
- 机器执行指令的速度
- 算法相关
4. 问题的规模(数据个数)
5. 原始数据的值(最好、平均、最坏)
- 算法无关
-
事后统计方法
-
例:计算 s = 1+2+3+……+n
程序1: s=0;i=1; while(i<=n) { s+=i; i++; } 程序2: s=n*(1+n)/2;
- f(n):问题的规模为n时,算法中原操作重复执行的次数。例: 程序1 :f (n)=2*n+2 程序2: f (n)=1
- 一般情况下精确的f(n),很难找到,所以退而求其次,找f(n)的数量级函数T(n)
-
T(n)是f(n)的同等数量级函数,即存在正常数c,使得:T(n) = Ο(f(n))(“O”表示数量级)
例: f(n)=n3+2n 则 O(f(n))=O(n3) 特别地:f(n)=c (常量) 则O(f(n))=O(1)
(2)求O(f(n))的方法:
- 不需对算法的执行时间作出准确地统计(除非在实时系统中)
- 把精力集中在原操作上(特别是用到循环的时候)
例:求下列算法段的时间复杂度
for(i=1; i<=n; i++)
{
for(j =1; j <=i ; j++)
x=x+1;
}
解:f(n)=1+2+3+……+n=(1+n)n/2
则 O(f(n)) = O(n2)。
(3)时间复杂度随n变化情况的比较:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!)
2.空间复杂度(Space complexity)
- 用于度量一个算法运行过程中临时占用的存储空间(辅助空间)大小。