对码农来说,学编程要掌握两个最重要的思想。第一是递归,它是一种逆向思维,自顶向下,先全局后局部。第二是分治,它是将复杂的问题分解为简单的子问题,求解后合并,得到最终的结果。
刷过不少题的码农,对于分治算法想来是不陌生的。但许多人也仅止于将分治思想停留在刷题上,在工作中面对难题一筹莫展,这对个人发展来说就很不利了。想要突破职场天花板,修炼好内功还是很重要的。
我们先从分治思想的根本大法说起。
第一步,分割(divide):将一个复杂的问题,分成若干个简单的子问题。
第二步,解决(conquer):判断子问题是否易解,如是直接计算返回;否则再将子问题分解至易解。
第三步,合并(combine):将每一层的微小局部结果逐级合并,直至最上层得到完整问题的解。
估计你会说,这跟把大象关进冰箱有什么区别?看起来好像是,但举个栗子,你也许会改变想法,这个栗子也跟大象有关。
曹冲称象的故事,大概是最典型的分治思想应用了。曹操的部下按照常规思维出主意,要么造个超大的秤(超额消耗资源);要么把大象宰了剁成片来称(不能解决问题,就解决造成问题的对象)。
聪明的曹冲想到了这个问题的等价情况,这就为分割建立了基础。所以第一步分割,就是将石头一块一块地搬上船;第二步是解决,判断所有石块重量与大象等重了,就逐块地称重;第三步就是合并,将所有石块的重量相加。
你小时候上学看这个故事,应该也是哈哈一乐,觉得这个方法我也能想到嘛。但没有这个先例之前,你很可能想不到。
这就是修炼思维的重要所在,别人可能只会大力出奇迹,而你却能四两拨千金。
#以书之名# 《计算之魂》 吴军
【吴军系列图书】计算之魂