数据结构与算法

什么是数据结构?什么是算法?

  • 从广义上讲:
    数据结构就是指一组数据的存储结构。
    算法就是操作数据的一组方法。
  • 从狭义上讲:
    数据结构就是常用的存储数据的格式,如:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
    算法就是常用的处理数据的经典方法,如:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

数据结构和算法的关系

数据结构和算法是相辅相成的。**数据结构是为算法服务的,算法要作用在特定的数据结构之上**。 因此,我们无法孤立数据结构来讲算法,也无法孤立算法来讲数据结构。

比如,因为数组具有随机访问的特点,常用的二分查找算法需要用数组来存储数据。但如果我们选择链表这种数据结构,二分查找算法就无法工作了,因为链表并不支持随机访问。

数据结构是静态的,它只是组织数据的一种方式。如果不在它的基础上操作、构建算法,孤立存在的数据结构就是没用的。

我们经常刷题书遇到的汉诺塔,青蛙跳台阶这些经典的案例就是数据结构和算法相结合,解决我们生活中的问题。

为什么学习数据结构和算法

你是不是觉得数据结构和算法,跟操作系统、计算机网络一样,是脱离实际工作的知识?可能除了面试,这辈子也用不着?

有很多人说,自己实际工作中根本用不到数据结构和算法。所以,就算不懂这块知识,只要 Java API、开发框架用得熟练,照样可以把代码写得“飞”起来。

对于大部分业务开发来说,我们平时可能更多的是利用已经封装好的现成的接口、类库来堆砌、翻译业务逻辑,很少需要自己实现数据结构和算法。但是,不需要自己实现,并不代表什么都不需要了解。

作为业务开发,我们会用到各种框架、中间件和底层系统,比如 Spring、RPC 框架、消息中间件、Redis 等等。在这些基础框架中,一般都揉和了很多基础数据结构和算法的设计思想。

比如,我们常用的 Key-Value 数据库 Redis 中,里面的有序集合是用什么数据结构来实现的呢?为什么要用跳表来实现呢?为什么不用二叉树呢?如果你能弄明白这些底层原理,你就能更好地使用它们。即便出现问题,也很容易就能定位。

因此,掌握数据结构和算法,不管对于阅读框架源码,还是理解其背后的设计思想,都是非常有用的。

不想被社会淘汰就一定要学习好数据结构和算法,现在经常说的程序员35岁危机,公司难道是依据年龄么?公司不想要的是35岁了还在做25岁就能完成的业务的程序员,有人十年如一日的重复做同样的事情,虽然有十年工龄,但是真正的技术只有两三年。

所以,不管你是业务开发工程师,还是基础架构工程师;不管你是初入职场的初级工程师,还是工作多年的资深架构师,又或者是想转人工智能、区块链这些热门领域的程序员,数据结构与算法作为计算机的基础知识、核心知识,都是必须要掌握的。掌握了数据结构与算法,你看待问题的深度,解决问题的角度就会完全不一样。