重修数据结构 C#版 (未完,更新12月16日)
本文学习资料为: http://wenku.baidu.com/view/38f60e040740be1e650e9af8.html
本文的目标是通过我自身的学习过程中,尽量将一些概念、定义,加之自己的理解摘录下来(尽量做到原著的精简版吧),有兴趣的童鞋可以一起来学习,已经有经验的高人们请绕行:)
那么,做好思想准备了吗?
(倒计时,5、4、3、2、1……)
开始吧,先来个目录吧(再填充内容)
第1章绪论...........................................................................................................................1
1.1 数据结构
1.1.1 学习数据结构的必要性
我们知道,虽然每个人都懂得英语的语法与基本类型,但是对于同样的题目,每个人写出的作文,水平却高低不一。程序设计也和写英语作文一样,虽然程序员都懂得语言的语法与语义,但是对于同样的问题,程序员写出来的程序不一样。有的人写出来的程序效率很高,有的人却用复杂的方法来解决一个简单的问题。
如果只学会了程序设计的语法和语义,那么你只能解决程序设计三分之一的问题,而且运用的方法并不是最有效的。但如果学会了数据结构的概念,就能在程序设计上,运用最有效的方法来解决绝大多数的问题。
*****以上希望能加强下我们学习的动力)******
1.1.2 基本概念和术语
1、数据(Data)
数据是外部世界信息的载体,它能够被计算机识别、存储和加工处理。
包括:数值(整数、实数、复数)、非数值(字符、文字、图形、图像、声音等)
2、数据元素(Data Element)和数据项(Data Item)
数据元素是数据的基本单位,一个数据元素可由若干个数据项(Data Item)组成。数据项是不可分割的、含有独立意义的最小数据单位。
例如:数据库中一张数据表,其中一行数据记录可以看作是一个“数据元素”,其中每一列(字段)就是该组成该数据元素的数据项。
3、数据对象(Data Object)
数据对象是性质相同的数据元素的集合。
例如,整数数据对象是{0,±1,±2,±3,…},字符数据对象是{a,b,c,…}。
4、数据类型(Data Type)
数据类型是高级程序设计语言中的概念,数据类型规定了程序中对象的特性。
数据类型可分为两类
- 原子类型(非结构):例如 整型、实型、字符型等
- 结构类型:例如 数组
结构类型的成分可以是非结构的(原子的),也可以是结构的。我的理解是: int[2]={1,2};int[2][2]={{1,2},{3,4}}
原子类型是无法再分割的数据类型了,这个比较好理解。数组是相同数据类型的集合,可分割,姑且理解为它是有结构的吧。
5、数据结构(Data Structure)
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
是不是有一点抽象?其实我们把本质放大1000倍来看:数据库一般有若干张数据表,其中单个表我们比作是数据元素,表与表之间存在特定关系,我们把数据库的这种关系称为“数据结构”。这样是不是好理解一点?理解了,那么我们就再缩小1000倍来探求本质。
数据结构通常分四类:
(1)集合(Set);
(2) 线性结构(Linear Structure);
(3) 树形结构(Tree Structure);
(4) 图状结构(Graphic Structure)
数据结构包括数据的逻辑结构和物理结构。
数据的逻辑结构(Logic Structure)是从具体问题抽象出来的数学模型;
数据的物理结构又称为存储结构(Storage Structure),是数据在计算机中的表示(又叫映像)和存储,包括数据元素的表示和存储以及数据元素之间关系的表示和存储。
数据的存储结构包括:顺序存储结构和链式存储结构两种。
数据在计算机中的存储就两种方式:顺序 和 链式。记住重点就可以了:),接下来来理解何为顺序,何为链式吧。
顺序存储结构(Sequence Storage Structure):把逻辑上相邻的数据元素存储在物理位置相邻的存储单元中。
在C#语言中用数组来实现顺序存储结构。因为数组所分配的存储空间是连续的,所以数组天生就具有实现数据顺序存储结构的能力。
链式存储结构(Linked Storage Structure):对逻辑上相邻的数据元素不要求其存储位置必须相邻。
链式存储结构中的数据元素称为结点(Node),在结点中附设地址域(Address Domain)来存储与该结点相邻的结点的地址来实现结点间的逻辑关系。这个地址称为引用(Reference),这个地址域称为引用域(Reference Domain)。
我的理解是:在链式数据结构中,假设其中一个数据元素叫Node1,在Node1的中存储了Node2的地址。这个地址叫引用,存储这个引用的地方我们叫引用域。
简单点理解就是,每个Node包含一个引用域,用于存放逻辑上的下一个Node的引用地址。
1.2 算法
1.2.1算法的特性
算法(Algorithm)是对某一特定类型的问题的求解步骤的一种描述,是指令的有限序列。
算法的特性:
1、有穷性(Finity)
2、确定性(Unambiguousness)
3、输入(Input)
4、 输出(Output)
5、 能行性(realizability)
问题:我们写一个程序,是不是就是算法呢?
算法的含义与程序非常相似,但二者有区别。
我的理解是,程序的概念要比算法大,“算法”更像是程序中的一段逻辑或者一个方法。但算法不一定就是程序语言写的一段可执行的代码,自然语言、框图、伪代码都可以描述算法。
1.2.2算法的评价标准
1、正确性(Correctness)
2、可读性(Readability)
3、健壮性(Robustness)
4、运行时间
5、占用空间
1.2.3算法的时间复杂度
如果算法只有一个一重循环,则算法的基本操作的执行频度与问题规模n呈线性增大关系,记作O(n),也叫线性阶。常用的还有平方阶O(n2)、立方阶O(n3)、对数阶O(log2n)等。
第2章线性表.....................................................................................................................22
线性表是最简单、最基本、最常用的数据结构。线性表是线性结构的抽象(Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线性关系。
线性表特点:数据元素是一个接一个的排列。
2.1 线性表的逻辑结构.........................................................................................................22
2.1.1 线性表的定义.....................................................................................................22
线性表(List)是由n(n≥0)个相同类型的数据元素构成的有限序列。
2.1.2 线性表的基本操作.............................................................................................22
2.2 顺序表.............................................................................................................................24
2.2.1 顺序表的定义.....................................................................................................24
在计算机内,保存线性表最简单、最自然的方式,就是把表中的元素一个接一个地放进顺序的存储单元,这就是线性表的顺序存储(Sequence Storage)。
线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,用这种方式存储的线性表叫顺序表(Sequence List) 。
假设顺序表中的每个数据元素占w个存储单元,设第i个数据元素的存储地址为Loc(ai),则有:
Loc(ai)= Loc(a1)+(i-1)*w 1≤i≤n
式中的Loc(a1)表示第一个数据元素a1的存储地址,也是顺序表的起始存储地址,称为顺序表的基地址(Base Address)。
也就是说,只要知道顺序表的基地址和每个数据元素所占的存储单元的个数就可以求出顺序表中任何一个数据元素的存储地址。并且,由于计算顺序表中每个数据元素存储地址的时间相同,所以顺序表具有随机存取的特点。 C#语言中的数组在内存中占用的存储空间就是一组连续的存储区域,因此,数组具有随机存取的特点。所以,数组天生具有表示顺序表的数据存储区域的特性。
>>>>>>>>>>>>>>>>>>>>> mark
2.2.2 顺序表的基本操作实现.....................................................................................29
2.2.3 顺序表应用举例.................................................................................................35
2.3 单链表.............................................................................................................................38
2.3.1 单链表的定义.....................................................................................................39
2.3.2 单链表的基本操作实现.....................................................................................46
2.3.3 单链表应用举例.................................................................................................56
2.4 其他链表.........................................................................................................................61
2.4.1 双向链表.............................................................................................................61
2.4.2循环链表..............................................................................................................64
2.5 C#中的线性表.................................................................................................................64
本章小结.................................................................................................................................67
习题二.....................................................................................................................................67
第3章栈和队列.................................................................................................................69
3.1 栈.....................................................................................................................................69
3.1.1 栈的定义及基本运算.........................................................................................69
3.1.2 栈的存储和运算实现.........................................................................................70
3.1.3 栈的应用举例.....................................................................................................82
3.1.4 C#中的栈.............................................................................................................87
3.2 队列.................................................................................................................................87
3.2.1队列的定义及基本运算......................................................................................87
数据结构(C#语言版)
目录 II
3.2.2 队列的存储和运算实现.....................................................................................89
3.2.3 队列的应用举例...............................................................................................103
3.2.4 C# 中的队列.....................................................................................................104
本章小结...............................................................................................................................105
习题三...................................................................................................................................105
第4章串和数组...............................................................................................................106
4.1 串...................................................................................................................................106
4.1.1 串的基本概念...................................................................................................106
4.1.2 串的存储及类定义...........................................................................................106
4.1.3 串的基本操作的实现.......................................................................................111
4.1.4 C#中的串...........................................................................................................115
4.2 数组...............................................................................................................................117
4.2.1 数组的逻辑结构...............................................................................................117
4.2.2 数组的内存映象...............................................................................................118
4.2.3 C#中的数组.......................................................................................................119
本章小结...............................................................................................................................121
习题四...................................................................................................................................121
第5章树和二叉树...........................................................................................................123
5.1 树...................................................................................................................................123
5.1.1 树的定义...........................................................................................................123
5.1.2 树的相关术语...................................................................................................124
5.1.3 树的逻辑表示...................................................................................................125
5.1.4 树的基本操作...................................................................................................126
5.2 二叉树...........................................................................................................................126
5.2.1 二叉树的定义...................................................................................................127
5.2.2 二叉树的性质...................................................................................................128
5.2.3 二叉树的存储结构...........................................................................................129
5.2.4二叉链表存储结构的类实现............................................................................132
5.2.5 二叉树的遍历...................................................................................................137
5.3 树与森林.......................................................................................................................141
5.3.2 树、森林与二叉树的转换...............................................................................144
5.3.3 树和森林的遍历...............................................................................................147
5.4哈夫曼树........................................................................................................................147
5.4.1哈夫曼树的基本概念........................................................................................147
5.4.2哈夫曼树类的实现............................................................................................149
5.4.3哈夫曼编码........................................................................................................153
5.5 应用举例...............................................................................................................154
5.6 C#中的树...............................................................................................................157
本章小结...............................................................................................................................158
习题五...................................................................................................................................159
第6章图...........................................................................................................................161
6.1 图的基本概念................................................................................................................161
6.1.1 图的定义.............................................................................................................161
6.1.2 图的基本术语...................................................................................................161
数据结构(C#语言版)
目录 III
6.1.3 图的基本操作...................................................................................................165
6.2 图的存储结构...............................................................................................................166
6.2.1邻接矩阵............................................................................................................167
6.2.2 邻接表...............................................................................................................172
6.3 图的遍历.......................................................................................................................185
6.3.1 深度优先遍历...................................................................................................185
6.3.2 广度优先遍历...................................................................................................188
6.4 图的应用.......................................................................................................................189
6.4.1 最小生成树.......................................................................................................189
6.4.2 最短路径...........................................................................................................199
6.4.3 拓扑排序...........................................................................................................207
本章小结...............................................................................................................................210
习题六...................................................................................................................................210
第7章排序.......................................................................................................................213
7.1 基本概念.......................................................................................................................213
7.2 简单排序方法...............................................................................................................214
7.2.1 直接插入排序...................................................................................................214
7.2.2 冒泡排序...........................................................................................................216
7.2.3 简单选择排序...................................................................................................217
7.3 快速排序.......................................................................................................................219
7.4 堆排序...........................................................................................................................222
7.5 归并排序.......................................................................................................................230
7.6 基数排序.......................................................................................................................232
7.6.1 多关键码排序...................................................................................................232
7.6.2 链式基数排序...................................................................................................233
7.7 各种排序方法的比较与讨论.......................................................................................235
7.8 C#中排序方法...............................................................................................................235
本章小结...............................................................................................................................236
习题七...................................................................................................................................236
第8章查找.......................................................................................................................238
8.1 基本概念和术语............................................................................................................238
8.2 静态查找表...................................................................................................................238
8.2.1 顺序查找...........................................................................................................238
8.2.2 有序表的折半查找...........................................................................................239
8.2.3 索引查找...........................................................................................................242
8.3 动态查找表...................................................................................................................243
8.4 哈希表...........................................................................................................................252
8.4.1 哈希表的基本概念...........................................................................................252
8.4.2 常用的哈希函数构造方法...............................................................................253
8.4.3 处理冲突的方法...............................................................................................254
8.5 C#中的查找方法...........................................................................................................256
本章小结...............................................................................................................................256
习题八...................................................................................................................................256
参考文献.......................................................................................................................................257