通过问自己问题,帮自己把目标清晰化、帮自己寻找解决问题的步骤、帮自己设计解决问题的方案、帮自己证明解决方案的可行性/经济性、帮自己寻找简化方案/更优方案……你看,有无穷无尽的事情要做 。
计算机算法也是类似的东西 。它要求我们灵活运用我们掌握的知识,凑出我们需要的结果来 。
比如说,识别图像边缘,这得怎么做?
首先,问自己一个问题:什么是图像边缘(请尽量用数学语言回答,做不到就得多锻炼)
然后,继续问:我这个回答可靠吗?会不会像“柏拉图的人”一样,被人用“拔毛鸡”蒙混过关?如果遇到这种情况,怎么办?还是只能忍受?
最后,如何用计算机语言实现我的想法?
你看,学会问问题,学会把模糊的目标清晰化、数学化,算法的问题就解决了一半 。
另一半是,寻找一条路,解决这种在未经训练者看来压根就无法回答的问题——这一半的难度,往往比“提出问题”又大了无数倍 。
为了解决这类问题,你必须创造性的使用你掌握的知识 。
热电偶受热产生电压?那么搭配上电压表它就是温度计 。
石英受压产生电压?那么把它做成薄膜、当它随着声波颤动时,其上的电压必然反映了声波波形——不够完美?那是因为共振、分割震动等等问题造成的,我可以如此如此的建模从而使其可计算;然后如此如此的修改方案,以便影响其中的某个参数,从而得到完美的波形 。
信号电压太过微弱?有很多很多种物理过程,可以把微弱的输入按比例放大 。比如油门线上施加的微小的力和发动机输出的强劲功率之间的关系 。
我需要寻找数学/物理原理类似的过程 。这玩意儿往往并不是天然存在的,但我可以利用现象A和现象B,然后如此组合它——看,三极管出现了!
类似的,我们需要让杂乱无章的一堆数字有序,怎么办?
【都在提的人工智能,其中的算法是什么?其实高中的知识就有】很简单,我们都见过水和油的分层现象 。它们为何会分层?遵循怎样的物理规律?我如何提取其中的核心部分、尽量简化我的实现?
冒泡算法呼之欲出 。
先学会提问题,再学会创造性的解决问题;最后,把创造性的解决方案拆分、实现——这就是算法 。
很明显,提问题和解决问题并没有明显的界限 。你必须融会贯通它 。这需要持久、刻苦的训练——哪怕是香农,他也没可能一步到位的搞出哈夫曼编码算法 。
必须在这两个方面足够训练有素,你才可能理解香农的伟大 。
绝大部分比较难的算法已经被人解决了 。我们可以学习他们的解决思路,然后解决实践中遇到的那些更为简单但并不能直接套公式的问题 。
如果你曾经尝试过去想“为什么欧几里得会弄出几何学”“为什么某某定理可以这样证”“为什么他们就能想到这样去证”,那么提问题和解决问题的一般思路就学到手了——如果你这样学,那么初高中学到的每一个知识点,都在教你如何解决问题、如何设计算法(所有“按步骤处理即可解决问题”的步骤的设计,都是广义的算法) 。
文章插图
换句话说,你需要锻炼自己主动的提出问题、寻找解决问题的途径能力,而不是被动的记忆“套公式解决能套公式解决的问题的方法” 。
但是,国内的应试教育以做题为目的 。
学了轮轴?看,这道题要用到轮轴,我们要这样套公式;那道题是另一种题型,套公式得那样套——总结:关于轮轴的题型一共X种,它们的解法分别是#*&¥%#*……
久而久之,你们就只会背公式套公式了——你说手电筒?那玩意儿那么复杂书上没说我怎么可能知道!
绝大多数人,最终都学的不仅不会问问题,更不会解决问题 。他们只是会套公式而已 。
当手电筒都能难住你时,哈夫曼?差着十万八千里呢 。这不是拿世界级难题难小学生吗 。
手电筒真的不是个比喻 。
很多人的确没有能力理解这种最浅最直接的知识:代码是如何控制硬件的?
你看,“老鼠夹子抓老鼠不是老鼠夹子有智能,而是我们自己想办法组合了杠杆、弹簧等东西,使得它可以在小动物碰触时动作”这个幼儿园小朋友都能懂的原理他们懂吗?懂了还会契而不舍的不断追问“计算机究竟是怎么认识0和1”吗?
推荐阅读
- PHP链接Mysql数据库的3种常用方法及对比
- MySQL如何监控系统全部执行过的sql语句
- 线性查找算法 程序员必知的十大基础实用算法之-BFPRT
- 2019双十二的天猫规则 2019天猫双十一活动规则
- 九种跨域方式的实现原理,第一个就超惊艳!
- 福建茶文化
- 影响云南民族茶文化形成的六大因素
- go语言网络编程之socket sever的实现
- H5嵌入APP的联合登录
- 古风犹存的工夫茶道