我对数据结构的一点小总结

在下才疏学浅,望各路大神指点一二

解决一个实际的问题,实际上是处理相应的数据。所谓的万物皆数,并不是说万物都以数组成,而是可以用数据进行抽象。用计算机解决实际问题,就是需要从实际问题中抽象出问题对象的属性(特性),以及问题对象元素之间的关系,对象的操作。而,如何有效的组织抽象出来的属性,以及如何描述对象元素间的关系影响到操作的实现,以及操作的效率。

有效的数据组织可以大大提高操作的效率,如果是杂乱无章的数据,那执行操作的效率就比较低了。就简单以试卷资料分类而言,如果自己的资料和各科的试卷是随意放置不进行整理的话,如果某天你突然想找哪科第几次月考的试卷的时候,你就需要一张一张的去找,所以许多同学会用一个小夹子将各科的试卷进行分类,这实际上就是一种对数据的组织管理。数据对象就是各科试卷,分配的依据就是 试卷属于哪个科目,当然如果你还想再提高效率,则可以进一步对各科试卷进行细分,比如将周考,月考,期中考,期末考,分类,再在各个类下按时间顺序进行排列,那么这样的效率又大大提高了。所以如何进行有效的数据组织可以提高解决问题的效率。

有效的数据组织管理是编写一个好程序的前提,当然还需要相应的算法,但是数据组织结构又是算法设计的前提。所以在编写程序之前,要分析好数据的存储,以及数据之间的关系,并采取相应存储结构和表示方法。如上例,对试卷的组织管理可以看成树型结构加上顺序结构,试卷作为树根,各科试卷作为根的孩子,各科试卷所代表的期中,期末,周考,月考又是它本身的孩子,最后所剩下的试卷以时间顺序排放,这是一种顺序结构(空间相邻)。

数据结构这门学科则是专门研究如何对数据进行组织管理。研究数据的逻辑结构以及如何将数据存储在计算机内部的存储结构以及定义在其上的算法。首先,数据的存储结构分为,顺序存储和链式存储。什么是顺序存储?什么是非顺序存储?,顺序存储是数据在计算机内部的存储是选定一块连续的内存空间存储数据,通过数据间的物理地址的相邻来描述数据之间逻辑上的相邻。而链式存储在内存中可以看出一个一个独立的小内存块,各个内存块之间的联系通过指针来表示。一般来说顺序存储较为方便进行查找操作,链式存储较容易实现插入删除操作。
其次,数据的逻辑结构分为,线性,树形,图状(网状),集合,数据间的关系类似与 一对一 , 一对多, 多对多 , 无序,的关系。
1
 对于线性结构,线性结构的定义是,在元素不为空的情况下,存在唯一的一个被称为第一个的元素和最后一个的元素,其它元素则都有唯一的前驱和后继,抽象出来就是一串数据序列。对于线性结构在计算机内部的存储表示可以分为顺序存储表示和链式存储表示,顺序存储表示,借用动态数组,通过数组的下标描述数据之间的逻辑关系,链式存储则是借用指针,通过指针描述数据的先后关系。
对于线性结构,基本的操作是对数据的查找,修改,删除操作。在实际问题中,解决线性关系的问题较容易解决,只需要按照元素的顺序进行相应的操作即可。如何对线性表元素的操作则需要根据实际问题进行具体抽象,像书中的 队列,栈 ,字符串 , 数组 都是针对某类具有相同操作特征问题的抽象 , 队列和栈的特殊在与,元素的增添删除只能在端点进行 , 字符串则是规定数据元素只能为字符类型 , 数组则是对元素进行了划分,一维数组是 n , 二维数组则是 m * n , 三维则是 mnz …,将整体的元素进行划分,再进行相应的操作。
2
对于树形结构,定义则是,在任意一棵非空树中,有且仅有一个称为根的结点,当n>1时其余节点可分为m个互不相交的有限集,每个集合本身又是一棵树,并称为根的子树。对于树形结构在计算机内部也能通过顺序表和链表进行表示,对于用顺序表表示一个树的话,建立一个二维数组进行描述元素之间的关系,0表示无关系,1 表示有关系,这样就描述了一棵树,通过链表进行描述树,则通过指针相连来表示数据之间具有关系。通过根节点的指针能够找到它所有的孩子对树形结构最主要的操作是遍历。对于二叉树而言,具有前序中序后序三种遍历方式,还可以进行层序遍历。
在解决实际问题中,树形结构可以看成从大类到小类的过程,即数据元素之间具有层序关系,将具体问题抽象出来,建立相应的存储结构,定义算法即可解决问题。
3 
对于图状结构,结点之间的关系是任意的,任意两个数据之间都可能相关。图分为有向图和无向图两大类,对于无向图的存储结构,一般用邻接矩阵和多重链表进行存储,有向图的存储结构,一般以十字链表和邻接表表示有向图,图的表示主要是对顶点和边的结构设计,如十字链表和邻接多重表的边的结构,即存储了当前边的信息,也能找到以分别以改顶点为出边或者入边的下一条边,这样就能够提高查找效率,能够快速判断两顶点之间是否相连(只要从一个顶点开始所有,比如从fist_out->next_out->nxet_out,判断路径上是否有点为需要找的顶点,如果有则有相连路径,直接退出,如果找完所有都没找到,则不存在,存储的信息越多,则查找的效率一般越快,以空间换取时间。 对于图也主要是遍历操作,以及求最短路径问题。在解决实际问题中,图状结构不像之前的关系一样有明显的先后或者层次关系。各个数据元素之间都可以具有联系,比如各个城市之间的交通线路就可以看成是一个巨大的公路交通网,如何选取一条从A城市到B城市的最短路径问题就是经典的图的问题。

最后是算法的分析和实现,算法的分析建立在实际问题上,具体实现在于数据的存储结构。算法是处理问题的方法,具有 正确性,健壮性,可读性,以及效率和低存储性,设计何种类型的算法取决于实际问题。对于计算机处理的大部分问题主要是查找,所以在此对查找算法进行分析。查找就是关键字的比对,通过比对关键字,找到对应的数据。对查找而言,最坏的情况无非就是把所有的元素都访问一次,这样就能判断能够序列中是否存在给定关键字的元素。如果对数据进行排序,由于排序之后,数据之间具有一些隐含关系,所以如果每次查找和中间比较,可以进一步缩小查找范围,所以每次进行相同操作,逐步缩小范围,进行最多log 2 n 次之后即可判断序列中是否存在该元素。这种查找方法即折半查找,还有一种查找方式,即通过关键字进行查找啊,即hash查找,建立关键字到关键字的映射直接映射到相应的内存空间 。同查找相关的还有排序操作。排序是将一串序列按递增或递减顺序进行排列,主要的排序思路有,冒泡排序,交换排序,选择排序,基数排序。

个人认为,学习完数据结构,因该对实际问题能够有更深入的理解。对待一个实际问题能够快速确定问题对象数据的关系,以及如何在计算机内部表示,并且实现相关的数据的操作,能够清楚知道各种存储方式,表示方式和算法的优缺点和适用条件,比如,虽然二分查找的效率很高,但是因为它要维护它是有序的状态,所以每当需要增添元素的时候,都会消耗较多的时间资源去维护其有序性,当消耗的时间资源高于节省的时间资源那么二分查找效率就不是很适用了,这需要根据实际情况是较多的静态查找还是较多的动态查找。同理许多数据结构的设计需要结合实际问题的需求。
一般处理问题都是对数据的操作管理,从操作管理的角度出发,首先需要思考如何解决这个问题,写出相应的解题思路,以及解决问题过程中需要知道数据的哪些信息,对数据的存放要求。最后设计出了解决还问题的算法。在这个过程中,你需要考虑,数据是否需要经常性的更改,如果经常性更改是选择链式存储带来的维护效率比它在操作上消耗的效率哪个更多哪个更少,比如我在顺序存储结构下,用这个算法比较好,在链式存储结构下用那个算法比较好。如何 选用则是我们需要去考虑的问题。不单单从解决一个问题出发,还需要从更深层次方面上去考虑如何提高时间和空间的效率,怎么通过改变数据的存储表示,怎么定义数据的存储,来更有效率的解决问题。必要时还要考虑编码的复杂度。比如问你如何对一个规模为100万的数据进行排序,你该如何思考?这时候你需要具有分析问题的能力,不是简单的说用快速排序之类的方法直接解决这个问题,你需要进一步的了解数据的特征,你需要了解数据的对象是什么,数据对象具有哪些特征。通过数据的特征和对象再进一步分析如何存储数据,如何设计相应的解决方法(这就与之前学的存储结构和逻辑结构有关了),最后实现解决问题的程序。对于该题,因该先了解数据的对象,数据的范围,再设计相应的算法。虽然数据规模很大100万,但是如果数据的范围都是小于N的(并且这个N也不是很大),那么排序则利用桶排序只需要读入一遍就能够实现排序,当然如果数据的规模很大,数据的大小又是比较大的,利用桶排序则会消耗较多的内存空间,这时候采用快速排序较好。当然通过这个例子只是想表明一种从数据结构的角度去解决一个实际问题,设计解决问题的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值