当前位置: 首页 > 科技观察

秒懂算法——动态规划的核心思想

时间:2023-03-20 17:59:50 科技观察

很多人认为算法难,甚至认为算法考的是面试官的优势和智商。其实每个算法的核心思想都很简单,可以用一句话或者两三句话就清楚了,只要我们抓住了核心思想,那就没必要死记硬背了。0x1动态规划的核心思想我们这里不讨论动态规划的各种具体问题,比如斐波那契数列、背包问题、最小路径问题等。自己研究实践,用代码解决各种问题问题。这里只谈它的核心思想,就两点:1.进阶版递归任何看似复杂难解的问题,其实都可以归结为一系列的子问题。不管多复杂的问题,只要有解,就可以化简为n个子问题。这个思路有点类似于递归。从某种意义上说,我们可以把动态规划看作是递归的优化,是递归的高级版本。换句话说,分而治之——将一个大小为n的问题分解成K个更小的子问题,这些子问题相互独立且与原问题相同,递归求解这些问题,然后对每个子问题进行划分解组合得到原问题的解。那么动态规划和递归有什么区别呢?主要体现在下面的第二点——我们在解决n个子问题的时候,一定要注意整体上有没有无用功。2.备忘录通过备忘录保存中间状态,使得已经得到的中间解不被重复计算,也就是说不浪费算力,不做无用功。也就是说,贪心法——当前的选择可能依赖于已经做出的选择,而不依赖于要做出的选择和子问题,所以贪心法是自上而下的,一步步做贪心的选择。有了这两个核心思想,相信大家看动态规划的任何问题都会感到很轻松。那么这两个思路不需要死记硬背?事实上,完全没有必要。当程序员最酷的事情之一就是,当你不是经理或老板时,你的思维会变得很像老板,因为程序员需要复用,管理子模块,解决复杂的问题。系统问题。其实作为一个公司的老板,在面对很多复杂的问题的时候,用到的基本思想就是动态规划的思想。比如你要实现某个绩效目标,那么你会把它归结为若干个子任务,将这些期望完成的子任务有机地组合起来。比如市场部、产品部、运营部应该怎么做,最后你应该怎么把他们结合在一起,至于在部门内部怎么落实,完全是部门经理自己去做进一步递归,部门经理使用的方法也可以称为算法。跟老板说话思路是一模一样的。这是动态规划的第一个基本思想。那么老大还会用到动态规划的第二个基本思想。比如,老板需要观察自己的公司是否在重复劳动,是否在做无用功。假设公司有五个项目组,他们的技术人员每个人都做过同一套功能,或者类似的功能,其实就存在重新发明轮子的问题,造成“算力”的浪费。那么,如果你是老板,你如何优化呢?是不是可以提炼出一个部门叫技术中心,这个部门会为所有项目组需要用到的轮子提供一个标准的、模板化的解决方案。这就是动态规划的第二个基本思想。0x2写在最后简单总结一下:动态规划的本质是分而治之,解决冗余,所以动态规划是一种将一个问题实例分解成更小的、相似的子问题,并将子问题的解存储起来的方法-避免计算重复子问题的问题,以解决优化问题的算法策略。动态规划所针对的问题有一个显着的特点,即其对应的子问题树中的子问题存在大量的重复,而动态规划的关键在于对于重复的子问题,只有遇到第一次,并保存答案,方便以后遇到直接引用,不用再去解。我们学习算法不仅仅是为了学习算法本身,而是要善于总结算法的“道”——即背后的核心思想。这个想法通常很简单。一旦你理解了这个想法,并且可以举一反三,那么你就可以用这些想法来解决更复杂、更实际的问题,甚至可以经营一家公司。