开设这篇专题是由于本人目前也尚在学习算法和数据结构,对于这方面的理解也是知之甚少的,在接下来的文章中可能会出现错误或疏漏的地方,本人写这些也是为了总结概括每天的学习进程并将其放到网上,希望大家能指出文中的不足并予以纠正,达到共同学习,共同进步的目的。
在我们学习算法之前,首先要知道,我们需要对数据结构有个认识,人们常常会将数据结构和算法联系起来讲,但是数据结构和算法属于两种学科,那么为什么在讲算法时会我提到数据结构呢?图灵奖得主Nicklaus Wirth曾说:算法+数据结构=程序,而在实际运用中也能看出,算法总是和数据结构掺杂的,因此在学习算法的过程中,我们首先要对数据结构有个大概的认识,那么在这一篇中我将会带大家了解对数据结构的初步认识,去了解为什么这个数据结构会这么重要,我们先看看 百度百科 是如何定义数据结构的:
由此我们可见,数据结构就是来解决数据的存放问题,如何能让数据能够高效的存储并被索引,并能针对数据不同的逻辑结构和物理结构来选出最优的存储结构,就是数据结构需要做到的事情。
而我们在平常听的最多的同时也是面试官最喜欢问的二叉树也是数据结构的一种类型。
为了能更加生动形象的了解数据结构,我就以我的歌单来作为例子(请各位先暂时忽略云音乐的检索和排序功能),简单的讲一下:
例一:由上往下直接添加
九百多首歌曲,如果要找到中间的某一首,可以说这个工作量非常大的,需要从第一首一直往下找,所以这种存储方法的数据结构就是不合理的。
例二:按照歌曲名字来存放:
这个方法相信大家一下子就能想到了,我按歌曲拼音首字母来进行排序,这样如果想要找到想听的歌曲,只需找到字母的开头便能往下查找,从而避免了例一中由上往下的耗时查找。也是一个比较好的解决办法之一,但是,假如我们现在有一首 姆爷的 Die Alone 需要往歌单里面添加需要怎么操作呢,首先,这首歌需要是需要插入在D字母中的最后一位,但事实上,最后一位以及被占用了,因为下一位便是E开头的歌曲了,因此,我们需要将图中排在Dragonborn歌曲以下的所有歌曲往下挪一行,用来腾出一个空位来存储Die Alone这首歌。所以我们会发现和例一同样的问题,如果歌单中的歌少,那么挪一挪还是很快的,如果歌单里的歌很多,那么插入这个数据将是个非常漫长的工作。
例三:集众家之所长
如果说例一是储存数据(歌单)时非常方便,而读取数据(歌单)时却非常麻烦,而例二则是插入数据(歌单)比较麻烦,但读取数据(歌单)则非常方便的话,我们能不能集中这两个的优势所在又能避免两个劣势的情况呢?在高中时我一老师经常和我说“只要思想不滑坡,方法总比困难多“,我们可以这样:
将不同字母的歌曲按不同的歌单存放,这样在存储歌曲时只需要将其放到对应字母的歌单即可,从而不用像例二那样,还要将非本字母的歌曲往下挪来腾位置,同理,当需要查找或删除歌曲时,只需要进到歌曲对应的字母开头歌单即可。这样是不是能同时避免例一和例二会发生的问题,同时将其优势也尽可能的发挥出来呢?
以上三种只是个人对数据结构的一些理解,假如各位有更好的方法,也欢迎提出来。在此也是希望通过这三个例子来阐明,一个合理的数据结构对于数据检索与操作是有多么重要的观点,在合理的数据结构上,再去运用合理的算法那么所起到的效果就能达到1+1>2的作用了。