本文转载自公众号“读芯术”(ID:AI_Discovery)
在向萌新介绍计算机科学时,教授基本算法可能是很具挑战性的部分之一。它介于假设性问题和抽象性思维之间,十分棘手。但或许可以不必这么困难。有一个小众的观点:只要能清晰地构造问题,任何一位善于思考的人都可以对一个基本算法问题提出优秀的解决方案。
不相信吗?可以找一个朋友试验一下。我敢打赌,即使他们没有任何技术背景,最后他们也能开发出一个二分法检索的算法,并且理解这个概念。
传统意义上的二分法检索问题
以下是Geeks for Geeks上给出的二分法检索的定义:“给定一个包含n个元素的排序数组arr[],编写一个函数来搜索arr[]中的给定元素x。”
即使我是软件工程专业,但读到这里时依然会头疼。如果用这么复杂的语言来讲述,听者保证会一只耳朵进,另一只耳朵出。不要这么做。
构造好问题是成功的一半。如果想用一种不那么专业的方法来提问二分法检索问题,以下是一种很好的方法:“你有一大盒一模一样的鸡蛋,想要测试这些鸡蛋的硬度。假设你在一栋100层的办公楼里工作,要找到把鸡蛋扔下去还完好无损的最高楼层。如何尽快做到这一点?”
虽然不必完全一致,但在构建问题时,应该记住下列提示。
技巧1:把问题当作与编程无关的问题来交流
对于非技术人员来说,计算机科学是很“可怕”的。相信我,因为我深有其感。曾经有一段时间,我对编程的了解仅限于电视节目中播放的有关黑客攻击的片段。我对它一无所知,只能一脸茫然地听别人解释什么是程序或算法。
如今,作为一名软件开发人员,我意识到编程实际上并没有第一眼看起来那么难。计算机语法非常有误导性。无论你是否有技术背景,只要你善于思考,都可以想出很棒的算法解决方案。
那么我的建议是什么呢?那就是不要讲代码。别把它当成是一个编程问题。这会把他们吓坏的。
技巧2:利用常识
“想象一个严格递增的整数值的列表…”等等。信息过载了。你也一样。我的建议是:不要解释,让常识帮你做这件事吧。
是的,二分法检索要求搜索列表需按照一定的顺序和方向排列,但不必用那么多的术语来表达。
我在构造问题时,通过使用一栋建筑来类比,将每个潜在值(楼层数)都控制在一个严格递减的区间。因为这是现实世界中人们心照不宣的常识。
每个人都知道,如果东西从高处掉落,重力只会把它拉向一个方向——下方。通过常识,人们知道,如果一样东西从某一楼层摔下还能完好无损,那么在比该楼层低的任何一个楼层也都不会摔碎。
常识能比我们更好地解释问题,好好利用它。毕竟,每个人都更愿意解决适用于现实世界的问题。
技巧3:避免使用过多的技术术语
你是一个软件工程师或数学专业的学生,你喜欢用你们复杂的术语交流。但和其他领域一样,你每天都在说的行话对小白来说几乎毫无意义。就像一个外科医生在向病人解释的时候,会尽可能简化说明,所以,应该尽量避免使用计算机科学领域特有的行话。
记住,你是在教别人一个概念,而不是炫耀专业知识或教他们技术术语。
避免使用“临界”等字眼。虽然“临界值”在算法世界中可能意义重大,但大多数非技术人员并不能意识到这一点。你会注意到我在上文中要求的是最高楼层,而不是“临界楼层”。
应该使用简单的用语,尽可能用能让非技术人员听明白的语言讲述。
是的,你可以定义“临界”这个词,但这又有什么意义呢。这个词对于问题本身是不必要的,它只是添加了一个会分散注意力的信息。对于那些有不必要定义的词,请跳过它们。
此外你会注意到,我构建问题时使用的是100层,而不是二分法检索问题中常用的n层。
计算机科学家可能习惯于把每个问题中的“n”看作是概括问题大小的一种方法,但大多数人认为“n”只是问卷中“no”的缩写。即使用任意值构造的问题可能适用于普遍情况,但任意值不会改变问题的本质。
如果想让别人理解一个问题,就给他们一个很好的整数作为起点,这样他们的大脑就会专注在这个问题上。而任意数字很难概念化。让他们专注于手头的问题,而非专注于可视化任意值“n”。
除非绝对必要,否则不要将问题普遍化。先解决问题,再根据需要进行概括。这是我解决任何算法问题的技巧,但对于同完全没有技术背景的人交谈时,这一点便尤其重要。
小贴士:设身处地为他们着想
耐心点。做一名你一直想在面试中渴望遇见的那种面试官,在需要时提出提示性问题。
没有人喜欢待在原地不动,不知道下一步该去哪里,这令人沮丧和尴尬。如果有人陷入困境,请帮助他们。问他们一个问题,让他们找到正确的方向。或者,如果他们的解决方案是错误的,给他们一个不是最优的解决方案,而不是直截了当地告诉他们答案。
设身处地为一个没有技术背景的人想想,请别人来解决鸡蛋掉落的问题会很有意思。你会感到惊讶,原来那么多对编程一无所知的人能解决算法问题。