主题:数据结构篇
数据结构篇
为什么说程序=数据结构+算法?程序可以看成处理数据的一个过程,而数据形式各种各样,所以非常有必要把数据以及数据间的关系搞清楚,而这正是数据结构。
按我的理解,数据结构就是图的结构,一般的数据结构书都是从线性表开始,然后到树,最后才讲图,我觉得应该先说图。
什么是图?定义为图G={V,E},它是顶点集和边集的集合,其中顶点集不能为空。这是图的数学定义,我们要从这个定义背后看到它的实质。顶点集V,就是我们在程序中会遇到的‘数据’,我们有时也称结点,比如
int a=1,b=2,c=3;
a,b,c都有相同的数据长度,也有相同的类型。还有复杂点的
struct _myType{
char *name;
int age;
}a,b,c;
像这样的都可看成结点,它们是我们研究的对象。
除此之外,我们还关心顶点间的关系,这就是边集E。其实关系非常简单,无非是有关系和无关系两种,而关系的表现却非常多样,比如,朋友关系,同事关系==。边集形象地表示为两顶点间有没有边,如果两顶点有关系,就说它们直接联通。
OK,按边集的不同,图就有不同的几种形式。
1、边集为空,那G=V,是完全离散的点,做为集合,元素间没有任何关系。
比如
int a=41;
char *name="I love programming!";
double pi=3.14;
显然这些数据找不出任何关系,它们只是在同一个模块内,同一个集合中。这样的情况比较少见,这也是我们学完C语言后所能达到的编码水平,感觉编程太枯燥太无味了,从‘两个数比较大小’到‘三个数比较大小’的程序就会让程序乱得让人受不了。
2、边集为任意的非空形态,这是一种一般的形式,那数据结构就是图。(多对多)
图的算法在数据结构的算法中有非常重要的地位,也就是正因为这个原因。这样的图在现实中也是非常常见,比如我们的交际网,我们现在的Internet等。
拿到这样的数据结构,我们会关心什么?图的连通性,以及最短连通性,最小子图(生成树),最短路径等。以后会了解到这些算法。
另外两种都是特殊情况,也是我们比较熟悉的线性结构和树型结构。
3、边集为某种线性形态,它侧重表达了顶点的有序性。(一对一)
也就是我们常说的线性表。对于这里关系,我们可以定义“《”关系,也就是我们所说的‘前趋’和‘后继’,线性结构是非常理想的结构。
4、边集为某种树型形态。(一对多)
为什么这样的树型结构会这么有用,我还不太清楚,我想可能它体现了我们的思维方式,比如我们的文件以及目录管理,根目录下有文件也有子目录,子目录下也有文件和子目录,再比如我们的学校管理,学校分院系,院下面再分专业,同一专业下还可以分班,同一个班还有不同的学号,这样的管理模式就体现了树型结构。
这是数据结构的整体体系,写在前面是希望大家能够把握。以后会由浅到深的展示它们的实现、常用的算法以及运用它们能解决的问题。
为什么说程序=数据结构+算法?程序可以看成处理数据的一个过程,而数据形式各种各样,所以非常有必要把数据以及数据间的关系搞清楚,而这正是数据结构。
按我的理解,数据结构就是图的结构,一般的数据结构书都是从线性表开始,然后到树,最后才讲图,我觉得应该先说图。
什么是图?定义为图G={V,E},它是顶点集和边集的集合,其中顶点集不能为空。这是图的数学定义,我们要从这个定义背后看到它的实质。顶点集V,就是我们在程序中会遇到的‘数据’,我们有时也称结点,比如
int a=1,b=2,c=3;
a,b,c都有相同的数据长度,也有相同的类型。还有复杂点的
struct _myType{
char *name;
int age;
}a,b,c;
像这样的都可看成结点,它们是我们研究的对象。
除此之外,我们还关心顶点间的关系,这就是边集E。其实关系非常简单,无非是有关系和无关系两种,而关系的表现却非常多样,比如,朋友关系,同事关系==。边集形象地表示为两顶点间有没有边,如果两顶点有关系,就说它们直接联通。
OK,按边集的不同,图就有不同的几种形式。
1、边集为空,那G=V,是完全离散的点,做为集合,元素间没有任何关系。
比如
int a=41;
char *name="I love programming!";
double pi=3.14;
显然这些数据找不出任何关系,它们只是在同一个模块内,同一个集合中。这样的情况比较少见,这也是我们学完C语言后所能达到的编码水平,感觉编程太枯燥太无味了,从‘两个数比较大小’到‘三个数比较大小’的程序就会让程序乱得让人受不了。
2、边集为任意的非空形态,这是一种一般的形式,那数据结构就是图。(多对多)
图的算法在数据结构的算法中有非常重要的地位,也就是正因为这个原因。这样的图在现实中也是非常常见,比如我们的交际网,我们现在的Internet等。
拿到这样的数据结构,我们会关心什么?图的连通性,以及最短连通性,最小子图(生成树),最短路径等。以后会了解到这些算法。
另外两种都是特殊情况,也是我们比较熟悉的线性结构和树型结构。
3、边集为某种线性形态,它侧重表达了顶点的有序性。(一对一)
也就是我们常说的线性表。对于这里关系,我们可以定义“《”关系,也就是我们所说的‘前趋’和‘后继’,线性结构是非常理想的结构。
4、边集为某种树型形态。(一对多)
为什么这样的树型结构会这么有用,我还不太清楚,我想可能它体现了我们的思维方式,比如我们的文件以及目录管理,根目录下有文件也有子目录,子目录下也有文件和子目录,再比如我们的学校管理,学校分院系,院下面再分专业,同一专业下还可以分班,同一个班还有不同的学号,这样的管理模式就体现了树型结构。
这是数据结构的整体体系,写在前面是希望大家能够把握。以后会由浅到深的展示它们的实现、常用的算法以及运用它们能解决的问题。