其实说实话,大一刚来的时候就学了数据结构,当时学的数据结构是下面图片中的这一本,不过说来惭愧,当时因为入门时C语言学的太菜,以致于开这门课的时候思惟跟不上就抵触,不用解释,就是给本身找借口,坦白说吧,就是没好好学,不过人非圣贤,孰能无过,人生不免会犯点错,及时改正仍是个好孩子,所以,我决定把以前没学好的数据结构从新补回来。算法
首先从定义上来讲的话,好像对数据结构没有什么一个统一的、标准的答案,我找了好几本书,挑了一个我认为还计较好理解的定义:数组
数据结构是计算机中存储、组织数据的方式。一般状况下,精心选择的数据结构能够带来最优效率的算法。微信
若是你没接触过数据结构,你看了定义能看懂吗?若是你能看懂,我很佩服你,我反正是不行,不过如今由于接触的东西比较多,听得多了,看了也能理解。我以为对于新手,应该先让新手去理解,等有了本身的理解以后再看官方定义的话,效果会比较好,反正我是这么认为的。我用生活中的例子来解释什么是数据结构吧:
举例:如何在书架上摆放图书?
也就是说,如今有一些书架,还有一堆图书,你要怎样把它们放到书架上去呢?换言之说,有一堆数据,给了你一些存储空间,你要怎么把这些数据存起来呢?
其实这个问题问的不科学,由于你不知道所谓的书架是长什么样,多是下面图片中的任意一种。网络
因此你就知道了,当有人问你一个数据怎么组织的时候,实际上是跟这个数据的规模有关系的。不同规模的问题,它处理起来的难度就不同。难在什么地方呢?难不在说你要把它怎么放,而在于放这个书是为了作事情用的,因此说图书的摆放其实跟两个操做直接相关:数据结构
操做一:新书怎么插入
操做二:怎么找到某本指定的书spa
方法一:我不知道大家是怎样考虑的,我第一个感受就是随便放,随便放一个好处就是:新书怎么插入,这个操做是很是简单的,哪有空就放哪,最简单的方法就是把全部的书一本一本挨着放,因此呢,全部的新书哪里有空放哪里,So easy!放起来简单,但第二个操做怎么办,如何查找?那就会成为一件很恐怖的事……累死你!何时累死呢,其实若是只是一个很小的书架,倒也累不死,但若是是上面第三张那样的书城,而后你想象,里面全部的图书都是随便放的,而后有人问你,这个书城里有没有某一本书,其实那本书没有,可是你忘了有没有,那你怎么能肯定它到底有没有呢?你就只好从头至尾把每一本书都过一遍,而后才能叹一口气说……唉,很差意思,没有这本书。对象
方法二:那咱们有没有稍微聪明一点的解决方法呢?就是怎样让我找书找的方便呢?第二个方法,就是按照书名的拼音字母顺序排放,有了这个字母序之后,查找就方便多了。一个最聪明的方法是二分查找什么是二分查找:好比说如今有一长排的书放在你面前,而后咱们找一本叫《数据结构》的以S开头的书,那我先从这一排的中间找一本书出来看它的书名的首字母,假如说是《离散数学》,以L开头的书,那咱们知道,S在L的后面,因此《离散数学》前面的书我就不用管它了,个人查找范围缩小了一半,从L开始日后找,而后再找这一半的中间,好比找到的一本书是《网络爬虫》,以W开头的,那S在L和W中间,《网络爬虫》后面的书我就不用管了,因而个人查找范围又缩小了一半,以此类推,我能够每次都找,而后跟中间这个比,很快就会把范围缩小到一本书上,我就会知道这本书究竟是有仍是没有。这个方法比前面的方法聪明多了,它很好的解决了查找的问题。可是,问题又来了,新书来了怎么插入呢?它就会成为新的使人头疼的问题。好比说,我新买了一本书叫《阿Q正传》,是以A开头的,呃……惨了,那咱们得把几乎全部的书日后一本一本的错位,一直到前面留出一个空挡,把新书插进去,这个彷佛也很头疼。blog
方法三:那如何找一个一箭双鵰的方法呢?咱们来想一想,图书馆里是怎样来摆书的,咱们假如说去图书馆,找《数据结构》,要怎么找,你不多是从第一本开始找,也不多是随便中间摸一本找,你进到图书馆里,第一件事情要找的是计算机类的书在哪里对不对?图书馆里的书一般是按照书的类别来分的,好比说咱们有社会科学类、文学类、艺术类、理科、工科等,而后工科下面可能还会分的再细一点,好比说咱们计算机类可能就分在工科的下面,这种分法有什么好处呢?把书架划分红几块区域,每快区域指定摆放某种类别的图书,在每种类别内,按照书名的拼音字母顺序排放,这样无论我在每个类里作什么样的操做,总归来讲,图书的规模小了不少,跟整个图书馆的规模相比,我是某一类的,不管是查找仍是插入,都是很是方便的。查找呢,就是在二分查找以前,咱们先定一个类别,而后在一个类的一个小范围里面作二分查找,就能够更快的找到咱们要查找的书了。若是是插入,也是先定类别,用二分查找来肯定一下它应该被插在什么位置,而后移空位这件事可能仍是要作的,可是总归比咱们刚开始要移的书的数量少多了。图片
那如今问题又来了:内存
问题一:空间如何分配?
问题二:类别应该分多细?
咱们分的各类类别的书,它的藏书量是不同的,你是统一都给它分……仍是每一类都多少个书架,事先分好吗?这也是一个很头疼的问题,我太难了,你若是书架给多了,就会有一些空间始终空在那浪费着,你若是书架给小了,新书来的时候要不断地加新柜子,很讨厌。还有分类别要分多细的问题,你要是分的比较粗,那么同一类里面的书就会有不少,那你的工做量仍是会很大,要是想减小工做量,最好仍是类别分的细一点,可是类别一分细,就会有反作用,类别太多了,图书的量一多,也是麻烦。
说这些问题是想说明:
解决问题方法的效率,跟数据的组织方式是直接相关的
那我这介绍数据结构的组织方式的时候,其实有两个概念:
一、关于数据对象的逻辑结构
好比说,咱们一开始把书架想象成简单的一长条,这么一层的架子,而后全部的书是一个一个挨着放的,除了一头一尾的书之外,每一本书的前面和后面都只有一本书,若是每一本书都有一个编号的话,那么这一个编号对应的就是一本书,那么这种结构是一对一的结构,咱们管它叫线性结构。
另一种组织方式是上面说的第三种方法,就是先把图书分类,若是我给每个类一个编号的话,那么这一个类别的编号里面对应着不少本书,那么这是一个一对多的逻辑结构,这个结构有个名字叫作树。
再说图书馆,假设咱们还统计这样一些信息:这一本书都有那些人买过,买了这本书的人还买过其它的什么书,因而呢,实际上是一本书对应着不少人,而一我的又对应了不少本书,这是一个多对多的、很复杂的一个关系网,那么这个关系网对应的逻辑结构叫叫作图
二、关于对象的物理存储结构
除了逻辑结构以外,咱们还有数据对象再计算机里面的物理存储结构,也就是咱们说的这些逻辑结构在机器的内存里到底要怎么放,是连续放呢仍是东一个西一个隔开放呢?也就是说用一个数组来存它呢,仍是用一个链表来存它呢?这个就属于物理存储结构。
以上这些就是我对数据结构的理解,我想应该说全面了吧,要是没全面也没关系,后面学了再继续补充。
看完有收获?那么但愿老铁别吝啬你的三连击哦
一、点个推荐,让更多的人看到这篇文章
二、关注个人原创微信公众号【泰斗贤若如】,第一时间阅读个人文章
三、欢迎关注个人博客
【原创声明】:本人原创:https://www.cnblogs.com/zyx110/