学习编程也有一段时间了。不能说和这东西如何如何的熟悉了,但还是有些认识吧。当然,我还期待和这东西有更进一步的关系。嘿嘿,毕竟以后打算靠这些小伙伴谋生了。以后的岁月,花前李下,对酒高歌希望彼此作伴,做彼此的双引号。哈哈,那今日提笔下论,想来谈谈编程中遇到的数据结构的问题。
看到数据结构这几个字,我第一想到的就是在学校里学到的这门课程,然后就想到当初被这门课折磨的半生不死,又艰难的和它死撑的无奈时光。当时就觉得这东西很难懂或者懂了原理却很难把这东西用计算机语言表达出来。现在我对这些东西有了更加深一点的认识。就来谈谈自己的心认识吧!
数据结构,由这个名字可以知道。要讲的内容便是数据的结构,也就是在计算机中以什么样的形式(结构)组织我们的数据进行存储、计算等功能。那数据是什么呢?如果小伙伴们单纯的以为数据就是什么int、String、char等类型的数据,那我们就很片面的看待这个小伙伴了。所谓程序来源于现实生活,那数据也可以是生活中的任何形式啦,即可以是Object类型的,任何一个类的对象也都可以作为一个数据,所以数据是多种多样的,那它的组织形式(结构)是不是也应该有多种多样的呢?是,但也不是。说是,因为它确实有许多种,例如栈,树,图,当然还有我们接下来要介绍的队列等多种组织形式。但归根结底都可归纳为两种最基本的形式,所谓万变不离其宗嘛。这两种便是:数组,链表。
现在来说说这两个难分难舍的好基友的特点。链表扮演的就是“小受”的角色(哈哈哈哈,看不懂的单纯童鞋自觉屏蔽吧)。为什么说链表是小受呢?因为链表在插入数据的时候非常的方便,也就是乐于接受嘛。因为链表在计算机中存储时存储的位置是离散的,计算机为链表的单个结点开辟内存空间。链表中的结点是靠结点中的指针引用寻找到下一个结点的,所以在插入时只需要改变指针引用就可以了。消耗的时间和空间复杂度都为常数1。所以链表因为善于“接受”就被看做是小受啦。
那接下来说说数组为什么是强势攻的问题。数组在被创建的时候,长度就是固定的,而且在堆中开辟的内存还必须都是连续的。没错,就是这么霸道任性吊炸天的狂拽,要求就是多。这么酷炫霸道当然是做强势攻的节奏啦。而且,最重要的一点是,当需要对数组进行“插入”操作时(汗!我又低俗了),是很麻烦的,需要开辟一个比原先数组大一的数组,再将相应的下标没变的数据复制到新数组中去。要插入的数据插入到相应位置,再将该位置的数据下标加1复制到新数组中去。消耗的时间和空间复杂度都是原先数组的长度值。因为是强势攻嘛,自然是不愿意做被插入操作啦。
(以上理解是博主自己的理解,不喜勿喷)
卖萌卖腐的时间过了,现在让我们来严肃的研究学问。哲学上说,任何事物都具有双向性。对于这两个数据结构的优缺点问题。链表虽然善于接受,但是它不善于查找(一般的小受都是呆萌的,傻傻的,有略微的依赖性人格。都不善于找自己的东西,可以理解?)。链表之所以不善于查找的原因在于结点间使用指针指引来查找下一节点。所以当需要查找链表中的某一个点的时候,链表都需要从第一个结点开始查找。这样就会花费很多的时间。而数组这个强势攻(攻相对都比较独立型人格,很善于管理自己的东西,对自己的东西了如指掌)查找就非常的迅速了。因为数组中内存是连续的,又有下标的方便性,所以只要给出下标,数组攻君可以马上找到自己相应的数据,所需要的时间复杂度为常数1。
数据结构应该有的五种基本功能:增、删、查,改,插。我已经讨论了查,和插了。其实其它的功能和讲过的两个差不多一样。下面博主具体化实例化成数组队列和链表队列来讨论剩下的三个功能。先来说说队列这小斯的特点:教科书给的定义就是FIFO也就是first in first out的意思。所以队列就是一个最突出特点为先进先出的数据结构,它一样具备数据结构的五种基本功能。
增:就是添加。书上常常说的是压入。就是把新元素添加到队列的尾部。对于数组而言,类似于插入操作,只是这个插入的位置在原数组的长度的位置。因为强势攻的特点,添加时会很不情愿,需要开辟一个新的长度增一的内存,把原数组的所有元素按照下标相同的顺序复制到新数组中,在新数组的最后一个位置添加新元素,最后将新数组的地址赋给原数组,数组队列的增添才完成。(没办法,强势攻做类似于“被插入”操作都是很困难的)。而对于链表这个善于接受的小受受来说,这都不是事儿。只需要把链表的尾结点的指针指引指向新增结点的数据,再将尾指针指引指向新增结点的数据就OK了。很简单吧!
删:即删除操作。根据队列先进先出的特点,删除的应该是最先进来的元素。即下标为0的数组元素和第0个链表结点。对于数组而言该操作还和插入操作相似。需要新建一个新数组长度为原先的数组长度小一。再将元素组的元素从下标为1开始复制到新数组中(对应新数组的下标比原数组的下标小一,懂?)对于链表而言,只需要将头指针指引指向第一个结点的数据,再将第0个结点的指针指引置null就可以了。当然最后,无论是数组还是链表,都应该返回被删除元素的数据,别忘了哦~
说了几个都是小受受链表擅长的,下面说一个数组哥哥厉害的改操作了。
改:修改相应的元素的数据值。其实修改操作与查找操作类似。这个很容易联想吧。我们需要修改某个元素的数据,首先得找到这个元素不是?查找?这当然是强势攻数组哥哥擅长的啦。数组快速找到这个元素,并将需要数据赋给相应位置的元素就可以了。链表的查找比较慢,但是在查找到相应元素之后将数据赋给相应元素的数据值也就可以了。
总结得失,数据结构最基本的形式只有两种:数组和链表这对好基友。其他形式的数据结构都是由这两种基本形式变换得来的。数组的优点在于便于查找。缺点在于其在创建的时候长度是固定的,内存是需要连续的。为什么是缺点呢?长度固定并且连续内存使得对其进行增、插、添、删时都需要重新开辟不同长度新数组,并且容易发生越界问题。而链表的优点在于其存储特点为离散的(有利于充分利用内存空间哦~),有指针指引,插、添、增、删时都不需要从新开辟内存,因为其为结点开辟内存,节点间的内存位置又不一定是连续的。其查找方式也比较笨。所以两者各有长短,也不能说那种更好,优、缺点都不是绝对的,还得根据具体情况经行分析使用。[/size]
分享到:
相关推荐
在这个"数据结构作业-伙伴存储管理系统"中,我们关注的是一个特定的数据结构实现:伙伴系统(Buddy Memory System),它是一种用于内存管理的技术,特别是在操作系统设计中常见。 伙伴系统是由Edmund Berkeley在...
总的来说,这个“数据结构课程设计 C++ 简单计算器”项目结合了C++编程、MFC GUI开发、数据结构(如栈)、算法(如中缀转后缀和计算)以及异常处理等多个核心计算机科学概念。通过这个项目,学生可以深入理解并实践...
在这个“数据结构作业栈的应用”中,我们主要探讨了栈在三个具体场景下的应用:字符串逆序输出、括号匹配以及数学表达式求值。 1. **字符串逆序输出**: 在这个部分,我们使用栈来实现一个字符串的逆序。栈的基本...
数据结构是计算机科学中的核心概念,它涉及到如何有效地组织和管理数据,以...这个"数据结构java版"教程,作为入门资料,将引导你踏入这个精彩的世界,希望你在阅读和实践中收获满满,为你的编程事业打下坚实的基础。
数据结构思维导图,从数据结构的基础知识到数组、链表、队列、栈、树、图、堆、散列表进行了详细的介绍,可以帮助小伙伴们构建更全面的数据结构知识。
耿国华数据结构ppt,内容详实,值得下载。适合需要学习数据结构的小伙伴
本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行...
非常适合学习数据结构的小伙伴。 多种语言包括java、python、c语言、go语言、php等来实现的数据结构的源码,包含数组、 链表、栈、队列、递归、排序、二分查找、散列表、二叉树、堆、图、回溯、分治、动态规划的...
《数据结构》(C语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参数教材。学了数据结构后,许多以前写起来很繁杂的代码现在写起来很清晰明了. 本书的前半部分从抽象数据类型的...
ICDAR2013数据集是国际文档分析与识别大会...对于想要在这个领域进行研究的"小伙伴"来说,这个数据集无疑是一个不可多得的宝库,可以用于训练、验证和比较不同的模型,以提高对文档中表格的理解和处理能力。
大学数据结构的总结,适合大学生小伙伴们数据结构期末考试,总结概念等
10.8 有关指针的数据类型和指针运算的小结 167 10.8.1 有关指针的数据类型的小结 167 10.8.2 指针运算的小结 167 10.8.3 void 指针类型 168 11 结构体与共用体 11.1 定义一个结构的一般形式 170 11.2 结构类型变量的...
《数据结构》(C语言版)是为“数据结构”课程编写的教材,也可作为学习数据结构及其算法的C程序设计的参考教材。本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的...
本课件是一个动态演示数据结构算法执行过程的辅助教学软件, 它可适应读者对算法的输入数据和过程执行的控制方式的不同需求, 在计算机的屏幕上显示算法执行过程中数据的逻辑结构或存储结构的变化状况或递归算法执行...
这个是严蔚敏老师所编写的数据结构的所有代码!小伙伴们可以尽情下载!
这本书是计算机科学与技术领域内的一本经典教材,尤其对于学习和理解数据结构及算法有着极其重要的意义。在C语言版的《数据结构》中,严蔚敏教授通过简洁而清晰的代码,深入浅出地讲解了各种常用数据结构(如线性表...
大学数据结构试题及答案,适合广大小伙伴们的数据结构期末考试,刷题。
这些资料涵盖了编程初学者在学习C、C++以及数据结构时所需要的重要知识。C和C++是两种基础且强大的编程语言,广泛应用于系统级编程、游戏开发和高性能计算等领域。以下将详细介绍这些文件中可能包含的关键知识点: ...