一、什么是数据结构
1、数据结构的起源
-
数据结构不是研究数值计算的这些是数学家应该研究的问题,它是研究计算机存储、组织数据的方式问题的学科,数据结构会影响算法的效率,合适的数据结构可以带来更高的运行或存储效率。
-
1968年,美国的高纳德(Donald E. Knuth)教授《基本算法》,开创了数据结构课程体系的先河。
-
程序设计 = 数据结构 + 算法
-
凭借一句话获得图灵奖的Pascal之父——Nicklaus Wirth,让他获得图灵奖的这句话就是他提出的著名公式:“算法+数据结构=程序”。
-
这个公式对计算机科学的影响程度足以类似物理学中爱因斯坦的“E=MC^2”——一个公式展示出了程序的本质。
-
2、数据结构的基本概念
-
数据(data):所有能输入到计算机中去的描述客观事物的符号
-
数据项(data item):有独立含义的数据最小单位,也称域(field)
-
数据元素(data element):数据结构的基本单位,也称节点(node)或记录(record)
-
数据结构(data structure):数据元素和数据元素关系的集合
-
算法(algorithm):是对特定问题求解步骤的一种描述,是指令的有限序列
typedef struct Student { char name[20]; // 结构成员就是 数据项 int id; short arg; float score; }Student; int main() { Student stu = {"张三",1001,20,100}; // 结构变量 stu 就是数据元素 // 初始化的数值就是 数据 Student stus[5] = { {"张三",1001,20,100}, {"张三",1001,20,100}, {"张三",1001,20,100}, {"张三",1001,20,100}, {"张三",1001,20,100} }; // stus结构体数组 就是数据结构一种 // 算法 for(int i=0; i<5; i++) { printf("%s %d %hd %f\n",stus[i].name,stus[i].id,stus[i].age,stus[i].score); } }
3、数据结构的三个方面
-
数据的逻辑结构:元素之间具有什么关系。
逻辑结构描述了数据之间的关系和组织方式,不考虑具体的存储细节。常见的逻辑结构包括线性结构、树形结构和图形结构等。线性结构包括数组、链表、栈和队列等;树形结构包括二叉树、堆和平衡树等;图形结构包括有向图和无向图等。
-
数据的存储结构:元素在内存中如何存储的。
存储结构定义了数据在计算机内存或外存中的表示方式。不同的存储结构可以影响数据的访问和操作效率。常见的存储结构有顺序存储和链式存储。顺序存储将数据元素顺序存放在一段连续的内存空间中,可以通过下标访问元素;链式存储使用指针将数据元素链接在一起,可以灵活地插入、删除元素。
-
数据结构的算法:数据结构应具有的功能或擅长的功能。
算法是解决特定问题的步骤和规则的描述。数据结构与算法密切相关,合适的数据结构可以提高算法效率。常见的数据结构算法包括遍历、搜索、插入、删除和排序等。选择合适的数据结构和算法可以优化程序的性能和资源利用情况。
综上所述,逻辑结构、存储结构和算法是数据结构的三个重要方面,它们共同构成了数据在计算机中的表示、组织和操作方式。
二、数据元素之间的逻辑结构有四种基本类型
-
集合:数据元素之间除了同属一个集合外没有其它关系。
集合是最简单的逻辑结构,其中的元素之间没有任何特定的顺序或关系。每个元素在集合中都是独立的,没有前驱或后继。集合中的元素通常是独立的个体,没有关联。集合的典型例子是数学中的集合概念。
-
线性结构:数据元素之间存在一对一的关系,也被称为线性表,简称为表,最具代表性的就是数组、链表。
线性结构是一种有序的逻辑结构,数据元素之间存在一对一的关系。每个元素都恰好有一个前驱和一个后继,除了第一个元素没有前驱,最后一个元素没有后继。线性结构可以用线性表、栈和队列等数据结构来表示。
-
树型结构:数据元素之间存在一对多的关系,如:族谱关系、组织关系。
树形结构是一种分层的逻辑结构,数据元素之间存在一对多的关系。每个元素可能有一个父元素和多个子元素,每个子元素也可能有自己的子元素。树形结构的典型例子是计算机文件系统中的目录结构。
-
图状结构:数据元素之间存在多对多的关系,如:地铁、高铁线路图。
图形结构是一种多对多的逻辑结构,数据元素之间存在多对多的关系。图形结构由节点(顶点)和边组成,节点表示数据元素,边表示元素之间的关系。图形结构广泛应用于网络、社交关系和路由等领域。
总结起来,集合是无序的,线性结构中元素有序且一对一关系,树形结构中元素有层级关系,图形结构中元素之间存在多对多的关系。这些逻辑结构在数据结构和算法中被广泛应用,用于解决不同类型的问题。
三、数据结构的存储结构
数据结构在计算机内存中的存储包括数据元素的存储和元素关系的表示。
元素之间的关系在计算机中有两种不同的表示方法,顺序表示和非顺序表示。
1、顺序存储结构
数据存储在一段连续的空间中,用数据元素在存储器中的相对位置来表示数据元素的关系。
int arr[10]; arr[4]; arr[]
-
优点:随机访问方便,访问效率极高。
-
缺点:插入、删除不方便。
2、链式存储结构
结构中的数据元素存放在彼此独立的地址空间中,每个独立的地址空间称为节点。
在每一个数据元素中增加一个存放另一个元素地址的指针,用来表示数据元素之间的关系。
-
优点:插入、删除方便,空间利用率高。
-
缺点:随机访问不方便,只能由前到后逐个访问。
四、逻辑结构和存储结构的关系
逻辑结构和存储结构是数据结构的两个重要概念,它们之间存在紧密的关系。
逻辑结构描述了数据元素之间的逻辑关系和组织方式,它关注的是数据元素之间的逻辑关系,而不考虑具体的存储方式和物理结构。常见的逻辑结构有线性结构、树形结构、图结构等。
存储结构(也称为物理结构)描述了数据结构在计算机内存或磁盘等存储介质上的存储方式和组织方式。它关注的是如何将数据元素存储在计算机内存中以便高效地进行访问。常见的存储结构有顺序存储结构和链式存储结构等。
逻辑结构和存储结构之间的关系是:
-
顺序存储结构:顺序存储结构适合描述线性结构,其中的数据元素按顺序存储在一块连续的内存空间中。例如,数组就是一种典型的顺序存储结构,它可以用来表示线性表。
-
链式存储结构:链式存储结构适合描述树形结构和图结构,其中的数据元素通过指针或引用连接起来,存储在零散的内存块中。例如,链表就是一种典型的链式存储结构,它可以用来表示单链表、双链表等。
在实际应用中,逻辑结构和存储结构是相互关联的。选择适当的存储结构可以更好地支持逻辑结构的操作和运算。不同的逻辑结构可能对应不同的存储结构,同一种逻辑结构也可以有多种不同的存储结构实现方式。选择合适的存储结构可以提高数据的操作效率和存储空间利用率。
数据结构 | 表 | 树 | 图 |
---|---|---|---|
顺序 | 顺序表 | 顺序树 | 矩阵 |
链式 | 链式表 | 链式树 | 邻接表(顺序+链式) |
五、数据结构的运算
数据结构是计算机科学中的重要概念,常见的数据结构包括数组、链表、栈、队列、树、图等。这些数据结构支持许多常见的运算,以下是其中一些常见的运算:
-
插入(Insertion):将一个元素插入到数据结构的特定位置,例如在数组中插入一个元素或在链表中插入一个节点。
-
删除(Deletion):从数据结构中删除一个元素,例如从数组或链表中删除一个元素,或者从树或图中删除一个节点。
-
查找(Searching):在数据结构中查找特定的元素,例如在数组或链表中查找一个元素,或者在树或图中查找一个节点。
-
遍历(Traversal):按照一定的顺序访问数据结构中的所有元素,例如按顺序遍历数组或链表中的元素,或者按照深度优先搜索或广度优先搜索遍历树或图中的节点。
-
排序(Sorting):将数据结构中的元素按照一定的顺序重新排列,例如对数组或链表进行排序,常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。
-
合并(Merging):将两个或多个数据结构合并成一个,例如合并两个有序数组或链表,或者合并两个树或图。
-
查找最小或最大值(Minimum/Maximum):在数据结构中查找最小或最大的元素,例如在数组或链表中查找最小或最大的元素,或者在树或图中查找最小或最大的节点。
-
修改(Modification):修改数据结构中的一个或多个元素的值,例如在数组或链表中修改特定位置的元素值,或者在树或图中修改特定节点的值。
这只是一部分常见的数据结构运算,不同的数据结构可能支持不同的运算,具体运算取决于数据结构的特性和应用