聊十分钟的算法与数据结构

224 阅读3分钟

说起“算法与数据结构”,相信所有的研发同学都知道,也大概能拖拖拉拉的描述几百字来说一下自己的理解,但是你要追问一句话能不能说明白,按我以往经验来看,大部分同学是说不清楚的。这样简单的问题有时候理解不够,其实非常难以回答,让我想起我的老师曾经问过的一个问题:“什么是数学?”。

所谓“算法与数据结构”,其实是两个分离的概念,并不是一个概念或一个名词,“算法”是算法,“数据结构”是数据结构。

算法是基于的数据结构的操作,数据结构是支撑算法的载体。 操作是为了达成目标,载体是为了使操作高效。

感觉有点绕不要紧,我也算是一位很有辅导经验的老程序员了,举个例子就很容易说明白。

比如最简单耳熟能详的一个数据结构“数组”。

这是数据结构吗? 其实不一定是,因为完全不能确定这个“数组”的数据结构是什么,他是一个序列的概念。这个概念主体产生后,衍生出了主体动作,比如插入、删除、替换、甚至更复杂的链接、交集、并集等等操作。

那“数组”是算法吗?其实也不一定是,因为你不知道该怎么样实现,因为你只知道这样一个目标,我要做一个序列,称之为“数组” 。还不知道该如何实现插入、删除这些操作的“算法”。

所以当我们碰到一个场景99%的随机写操作和1%的随机读操作时,我们会设计一套“算法”和“数据结构”来满足我们的场景需求。根据这个场景需求,我们会设计 “write”算法和“find”算法,并且还有一个潜在的需求是要效率高。 然后就是具体的“算法”设计和“数据结构”设计了。

场景换成99%的随机读操作和1%的随机写 或者 99%的尾端读等等,都会有不同的结果产出。

至此,相信对数据结构和算法这个概念就了解的比较清楚了。 依然是工程师思维,我们要评价我们的设计成果呀,最好是量化评价,所以有了时间复杂度和空间复杂度概念,怎么计算就不展开说了(请google),这里我想说的是绝大部分的同学并不会用“复杂度”这个工具。

这个工具的产生,一个目标是评价算法和数据结构的效率,另外一个非常重要的目标是帮助我们优化我们的设计。比如你设计了一个时间复杂度是O(N^2)的,那你的优化目标是O(n)、O(logn)甚至是O(1)啊,基于这样的目标前辈们也给我们总结了非常多的套路可以尝试呀,比如分治算法、动态规划等等。

另外再提一句,擅长做算法与数据结构设计的同学,根据场景就立刻能判断出效率的极限是什么,比如:你不可能设计一个算法是对N个元素排序,比O(n)还低。

另外一个tips,刷题的目标不是学习算法与数据结构,这俩玩意儿读书也能学会。核心目标一个是加深你对你的学习的理解深度和灵活运用,另外一个是帮助你提高解决问题的效率。如果你有心,你会发现这还是一个对大脑的训练,要限时限错限提交。把大脑训练成“计算机”,你会有不一样的编码体验。

#今日份十分钟#分享希望能帮助到大家。