有些家伙注定让人又爱又恨!
数据结构也许在大多数计算机专业的人眼中并不陌生,不知道其他人在最初接触它时是什么感觉,我确实是被它给难倒了,从此数据结构成为了我计算机学习之路上的一个阴影。记得大二一开始,对C语言还是一知半解的我,忽然开的这门课更是让自己抓狂——那是完全听不懂啊(感觉就是在听天书),当时的老师也没有和我们说这个数据结构到底可以干什么,有什么用,于是乎就晕头转向的上完了这门课,应付完考试后也已经没有什么印象了。当时以为考完试就算彻底摆脱了数据结构的折磨,但是渐渐地才发现计算机的这条路上注定要有数据结构作伴。
大牛们都说的一句话——不学数据结构可以当程序员,但是要想称为一个有前途的程序员就必须要学习数据结构。可以理解为你对数据结构理解的深度决定我们技术道路的长度和宽度。那么究竟是什么让它的地位和影响力如此高呢,我谈谈自己的体验和看法。
在上研究生之前并没有太多的体会,因为平时就是学习各种专业基础课程,课程之间有些完全独立,有些虽有相关性,但由于较少的应用也使得感触颇浅。即使最后的毕业设计也只是综合所有学到的知识制作一个简单的管理系统。这四年的学习经历,由于自己悟性较低,加上没有老师的点拨和引导,所以所学知识只处在扫盲和简单应用的层面上。但之后,由于课题的需要,要接触一些算法,这些算法中处理数据都用到了数据结构,比如图像处理中二维图像的算法中可能会用到树对图像进行区域划分,到了三维图像处理阶段又会用到更高级的八叉树。此时如果对数据结构不熟悉,那真是另一种无助的痛苦。再一个就是最近在复习Java,当看到集合这一块时,我是真的被数据结构折服了,Java中的容器在实际开发中是多么实用,它给开发带来的好处无法形容,但是它们的底层实现就是用的数据结构。
这些经历忽然让自己很想去主动的亲近这个折磨人的家伙,也许这就是它的魅力。说到这里我有个小建议,如果你在上大学且正要学习这门课,那可千万不要像我一样,你应该好好学习,哪怕强迫自己。而如果你如同我一样忽然被它的魅力所吸引而决定去探索他,那我希望你可以多写一些学习体会与大家分享,以让我们共同学习。
------------------------------------------------------------------------
下边简单总结一下什么是数据结构?
按某种逻辑关系将一批数据进行组织,然后应用计算机语言按一定存储方式把它们存储在计算机的存储器中,并在这些数据上定义了一个运算的集合(查找、删除、插入、修改)。所以数据结构实际包含逻辑结构+存储结构。
1.数据的逻辑结构通常被分为四种
- 集合:集合中的元素只是同在一个集合中,别无其他任何关系。
- 线性结构:描述数据元素一对一的关系。
- 树形结构:描述数据元素一对多的关系。
- 图状结构:描述数据元素多对多的关系。
2.数据结构中的四种存储方法
- 顺序存储(用于线性的数据结构):将逻辑上相邻的结点存储在物理位置相邻的存储单元,结点间的逻辑关系由存储单元的邻接关系体现。这种方式存储数据形成了顺序存储结构——用高级语言的数组描述。
- 链接存储:不要求逻辑上相邻的结点在物理位置上也相邻,结点间的逻辑关系是由附加的指针来表示的。由此得到的就是链式存储结构(可以有效利用内存)。链式存储结构——用高级语言的指针描述。
- 索引存储:在存储结点的同时,建立附加的索引表。索引表中每一项称为索引项(关键字id,地址)。若每个结点在索引表中都有索引项,则该索引被称为稠密索引;若一组结点的索引表中只对应一个索引项,则称为稀疏索引(索引地址指向此组结点的起始存储位置)。利于快速查询。
- 散列存储:根据结点的关键字直接计算出该结点的存储地址。
3.数据结构包含的内容
数据结构 | 优点 | 缺点 |
数组 | 插入快,如果知道下标,可以非常快速的存取 | 查找慢,删除慢,大小固定 |
有序数组 | 比无序数组查找快 | 删除和插入慢,大小固定 |
栈 | 提供后进先出方式的存取 | 存取其他项很慢 |
队列 | 提供先进先出方式的存取 | 存取其他项很慢 |
链表 | 插入快,删除快 | 查找慢 |
二叉树 | 查找、插入、删除都快(如果树保持平衡) | 删除算法复杂 |
红-黑树 | 查找、插入、删除都快。树总是平衡的 | 算法复杂 |
2-3-4树 | 查找、插入、删除都快。树总是平衡的。类似的树对磁盘存储有用 | 算法复杂 |
哈希表 | 如果关键字已知则存取极快。插入快 | 删除慢,如果不知道关键字则存取很慢,对存储空 间使用不充分 |
堆 图 | 插入、删除快,对最大数据项的存取很快 对现实世界建模 | 对其他数据项存取慢 有些算法慢且复杂 |
那么下面就让我们一起来学习数据结构吧,希望读者能够积极分享自己的心得和学习方法,如本人今后总结的有什么不对的地方,还希望大家可以指出来。