《数据结构与算法》学习思考(1)

缘起:记得刚接触数据结构与算法,还是大二。我没记错的话,考试成绩还不错,得了89分,好像。当时是系里的院长给我们上课。我那时很积极,每次算法课坐第一排,而其它课,比如web,却躲在最后。
不过说实话,那时对数据结构和算法的认识,只是停留在考试上,因为没做过什么项目,对基本的一些数据结构,比如栈,队列都没有感性的认识。2020年4月开始,我想重新学习数据结构与算法,就报了一门《数据结构与算法之美》的课程。当时学了有70%。时隔两年,我准备再复习一遍,顺便把之前的一些笔记整理清楚。

先说为什么要学习数据结构。

很多人有一个误区,认为开发业务中基本碰不到算法,所以没必要学。其实不然,学算法至少有下列原因:

  • 1比较功利的原因就是,很多面试会考
  • 2数据结构与算法是基本功,很多框架,基础软件的底层都用到了数据结构和算法。比如redis的源码,你如果想深入,数据结构和算法是必须要懂的。比如TCP协议,你想深入学习,看它的源码,里面有滑动窗口。
  • 3存储某个业务数据的时候,你如何知道应该用 ArrayList,还是 Linked List 呢?调用了某个函数之后,你又该如何评估代码的性能和资源的消耗呢?

有了方向,学习才有动力,今天先说到这。

那如何学

课程中老师有一句话,印象很深:

学习任何一个数据结构,要明白几点:
它的来历,它是为了解决什么问题而出现的,它的特点,以及它适合解决的问题,以及实际的应用场景。

我举个例子:
如果我们针对的是一组静态的数据,没有频繁地插入、删除,我们可以进行一次排序,多次二分查找。这样排序的成本可被均摊,二分查找的边际成本就会比较低。 但是,如果我们的数据集合有频繁的插入和删除操作,要想用二分查找,要么每次插入、删除操作之后保证数据仍然有序,要么在每次二分查找之前都先进行排序。针对这种动态数据集合,无论哪种方法,维护有序的成本都是很高的。 所以,二分查找只能用在插入、删除操作不频繁,一次排序多次查找的场景中。针对动态变化的数据集合,二分查找将不再适用。那针对动态数据集合,如何在其中快速查找某个数据呢?二叉树,跳表就比较合适。 再次,数据量太小不适合二分查找。 如果要处理的数据量很小,完全没有必要用二分查找,顺序遍历就足够了。比如我们在一个大小为 10 的数组中查找一个元素,不管用二分查找还是顺序遍历,查找速度都差不多。只有数据量比较大的时候,二分查找的优势才会比较明显。 不过,这里有一个例外。如果数据之间的比较操作非常耗时,不管数据量大小,我都推荐使用二分查找。比如,数组中存储的都是长度超过 300 的字符串,如此长的两个字符串之间比对大小,就会非常耗时。我们需要尽可能地减少比较次数,而比较次数的减少会大大提高性能,这个时候二分查找就比顺序遍历更有优势。

你可能感兴趣的:(数据结构与算法,数据结构)