数据结构这个小伙伴

[align=left][size=x-large]学习编程也有一段时间了。不能说和这东西如何如何的熟悉了,但还是有些认识吧。当然,我还期待和这东西有更进一步的关系。嘿嘿,毕竟以后打算靠这些小伙伴谋生了。以后的岁月,花前李下,对酒高歌希望彼此作伴,做彼此的双引号。哈哈,那今日提笔下论,想来谈谈编程中遇到的数据结构的问题。

看到数据结构这几个字,我第一想到的就是在学校里学到的这门课程,然后就想到当初被这门课折磨的半生不死,又艰难的和它死撑的无奈时光。当时就觉得这东西很难懂或者懂了原理却很难把这东西用计算机语言表达出来。现在我对这些东西有了更加深一点的认识。就来谈谈自己的心认识吧!

数据结构,由这个名字可以知道。要讲的内容便是数据的结构,也就是在计算机中以什么样的形式(结构)组织我们的数据进行存储、计算等功能。那数据是什么呢?如果小伙伴们单纯的以为数据就是什么int、String、char等类型的数据,那我们就很片面的看待这个小伙伴了。所谓程序来源于现实生活,那数据也可以是生活中的任何形式啦,即可以是Object类型的,任何一个类的对象也都可以作为一个数据,所以数据是多种多样的,那它的组织形式(结构)是不是也应该有多种多样的呢?是,但也不是。说是,因为它确实有许多种,例如栈,树,图,当然还有我们接下来要介绍的队列等多种组织形式。但归根结底都可归纳为两种最基本的形式,所谓万变不离其宗嘛。这两种便是:数组,链表。
现在来说说这两个难分难舍的好基友的特点。链表扮演的就是“小受”的角色(哈哈哈哈,看不懂的单纯童鞋自觉屏蔽吧)。为什么说链表是小受呢?因为链表在插入数据的时候非常的方便,也就是乐于接受嘛。因为链表在计算机中存储时存储的位置是离散的,计算机为链表的单个结点开辟内存空间。链表中的结点是靠结点中的指针引用寻找到下一个结点的,所以在插入时只需要改变指针引用就可以了。消耗的时间和空间复杂度都为常数1。所以链表因为善于“接受”就被看做是小受啦。
那接下来说说数组为什么是强势攻的问题。数组在被创建的时候,长度就是固定的,而且在堆中开辟的内存还必须都是连续的。没错,就是这么霸道任性吊炸天的狂拽,要求就是多。这么酷炫霸道当然是做强势攻的节奏啦。而且,最重要的一点是,当需要对数组进行“插入”操作时(汗!我又低俗了),是很麻烦的,需要开辟一个比原先数组大一的数组,再将相应的下标没变的数据复制到新数组中去。要插入的数据插入到相应位置,再将该位置的数据下标加1复制到新数组中去。消耗的时间和空间复杂度都是原先数组的长度值。因为是强势攻嘛,自然是不愿意做被插入操作啦。
(以上理解是博主自己的理解,不喜勿喷)
卖萌卖腐的时间过了,现在让我们来严肃的研究学问。哲学上说,任何事物都具有双向性。对于这两个数据结构的优缺点问题。链表虽然善于接受,但是它不善于查找(一般的小受都是呆萌的,傻傻的,有略微的依赖性人格。都不善于找自己的东西,可以理解?)。链表之所以不善于查找的原因在于结点间使用指针指引来查找下一节点。所以当需要查找链表中的某一个点的时候,链表都需要从第一个结点开始查找。这样就会花费很多的时间。而数组这个强势攻(攻相对都比较独立型人格,很善于管理自己的东西,对自己的东西了如指掌)查找就非常的迅速了。因为数组中内存是连续的,又有下标的方便性,所以只要给出下标,数组攻君可以马上找到自己相应的数据,所需要的时间复杂度为常数1。
数据结构应该有的五种基本功能:增、删、查,改,插。我已经讨论了查,和插了。其实其它的功能和讲过的两个差不多一样。下面博主具体化实例化成数组队列和链表队列来讨论剩下的三个功能。先来说说队列这小斯的特点:教科书给的定义就是FIFO也就是first in first out的意思。所以队列就是一个最突出特点为先进先出的数据结构,它一样具备数据结构的五种基本功能。
增:就是添加。书上常常说的是压入。就是把新元素添加到队列的尾部。对于数组而言,类似于插入操作,只是这个插入的位置在原数组的长度的位置。因为强势攻的特点,添加时会很不情愿,需要开辟一个新的长度增一的内存,把原数组的所有元素按照下标相同的顺序复制到新数组中,在新数组的最后一个位置添加新元素,最后将新数组的地址赋给原数组,数组队列的增添才完成。(没办法,强势攻做类似于“被插入”操作都是很困难的)。而对于链表这个善于接受的小受受来说,这都不是事儿。只需要把链表的尾结点的指针指引指向新增结点的数据,再将尾指针指引指向新增结点的数据就OK了。很简单吧!

删:即删除操作。根据队列先进先出的特点,删除的应该是最先进来的元素。即下标为0的数组元素和第0个链表结点。对于数组而言该操作还和插入操作相似。需要新建一个新数组长度为原先的数组长度小一。再将元素组的元素从下标为1开始复制到新数组中(对应新数组的下标比原数组的下标小一,懂?)对于链表而言,只需要将头指针指引指向第一个结点的数据,再将第0个结点的指针指引置null就可以了。当然最后,无论是数组还是链表,都应该返回被删除元素的数据,别忘了哦~
说了几个都是小受受链表擅长的,下面说一个数组哥哥厉害的改操作了。
改:修改相应的元素的数据值。其实修改操作与查找操作类似。这个很容易联想吧。我们需要修改某个元素的数据,首先得找到这个元素不是?查找?这当然是强势攻数组哥哥擅长的啦。数组快速找到这个元素,并将需要数据赋给相应位置的元素就可以了。链表的查找比较慢,但是在查找到相应元素之后将数据赋给相应元素的数据值也就可以了。
总结得失,数据结构最基本的形式只有两种:数组和链表这对好基友。其他形式的数据结构都是由这两种基本形式变换得来的。数组的优点在于便于查找。缺点在于其在创建的时候长度是固定的,内存是需要连续的。为什么是缺点呢?长度固定并且连续内存使得对其进行增、插、添、删时都需要重新开辟不同长度新数组,并且容易发生越界问题。而链表的优点在于其存储特点为离散的(有利于充分利用内存空间哦~),有指针指引,插、添、增、删时都不需要从新开辟内存,因为其为结点开辟内存,节点间的内存位置又不一定是连续的。其查找方式也比较笨。所以两者各有长短,也不能说那种更好,优、缺点都不是绝对的,还得根据具体情况经行分析使用。[/size][/size][/align]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值