我們高中數學為什麼不重視算法?高中學的數列,三角函數,求導,圓錐曲線相關問題的解法和算法有什麼關係?
invalid s
開宗明義:算法不是什麼高級知識,它是初中甚至小學就可以掌握的東西。只不過,應試教育通過持續十年的努力,把你理解算法的能力剝奪了而已。
說白了,算法就是“利用自然/數學規律達到我們預定目的”的思路。
要學會這個思路,其實不難。
比如,我們知道,電流通過電阻會發熱;那麼,當我們需要煮飯時,是不是可以通過選取一個合適的電阻,利用它的熱量呢?
然後,細化問題:當我們要利用220v電壓,得到2000瓦的煮飯功率時,該如何選擇電阻呢?電阻本身會不會被燒壞?我們怎麼避免它被燒壞?
繼續細化:2000瓦的發熱功率,要避免溫度無限堆積,我們需要選擇一個合適的散熱效率;牛頓散熱公式很好找,然後我們知道溫度差越大散熱越快,因此溫度不可能無限提升。
繼續:假設燒飯用的電熱絲最佳溫度是500~800度,我們怎麼湊得這個值呢?
還能再進一步:我們是不是可以放個溫度計在鍋的支撐點/接觸面上,當鍋被燒乾時自動斷電呢?
繼續拆分這個目標:雙金屬片、熱電偶、磁體的居里點等等,都可以代替溫度計,從而使得溫度探測裝置結構更簡單、實現更便宜同時又更耐用。
你看,電爐、電飯煲等等“算法”,已經呼之欲出了。
再如,我們知道氣體受熱膨脹;燃料燃燒產生大量熱;我們知道槓桿、輪軸原理……
那麼,能不能組合這些東西,得到……內燃機呢?
細化:我們需要一個氣缸,讓燃料在裡面燃燒;然後需要一個大小合適的活塞,利用燃燒後的高溫高壓氣體推它;我們需要曲柄、連桿,把活塞的往復運動變成旋轉……
困難:等等,這樣只能推一下!
解決:加一個飛輪,利用它的慣性儲能;然後藉助飛輪儲存的動能,控制氣缸上面氣閥的開閉;再借助齒數比以及凸輪,使得氣缸上面的氣閥在合適的地方動作——從而形成“進氣、壓縮、做功、排氣”四個衝程。
困難:怎麼在合適的時機添加合適的燃料?怎麼使其燃燒?
解決:噴油嘴、霧化器、火花塞(柴油機還可壓燃)……同樣使用凸輪控制,使其恰到好處的動作……
你看,四衝程內燃機“算法”就設計出來了。
繼續,收音機,電視機……繼電器,邏輯門,加法器……只要你稍有了解便會發現,它們統統是這個思路。
什麼思路呢?
1、提出一個大而籠統的問題
2、把大而籠統的問題清晰化,然後拆分成一堆較小、較清晰、較容易解決的問題
3、解決每一個小問題
4、組合一大堆小問題的解決方案,組合得到大問題的解決方案
換句話說,解決實際問題並不是一問一答,套個合適公式就能完事的——凡這樣想的,才是不折不扣的反智。
恰恰相反,實際問題總是含糊的,有時候連個大方向都不會有。
領導/老闆絕不會對你說,為了解決人民群眾的做飯需要,請你算一算220v電作用於100歐的電阻,產生的熱功率是多少。
對不起,他們往往是外行,壓根不可能把問題問到這個程度;而且問到這個程度哪夠!你找個收音機用的糯米粒一樣的100歐電阻試試,看看它能不能扛一秒。那麼,適合做飯需要的電阻應該長什麼樣子,你能把這個需求清晰的提出來嗎?
哪怕他們是內行,讓你發明掃地機,也絕不會讓你算電阻發熱量——有提這種問題的功夫,他們自己就算出來了。
他們需要的,是你綜合利用自己掌握的知識,替他們考慮好需要注意需要解決的一切一切,並且解決它。
因此,你得綜合自己的知識,自己學著提出問題。
任務:做個利用電做飯的鍋,儘可能自動、智能
你暈不暈?但這才是實踐問題。這才是實際生活中、工廠裡,老闆/領導真正會提的問題。
要解決這類問題,你得反過來,自己給自己提問題。
第一個問題,用電做飯是什麼原理;第二個問題,我得考慮哪些方面,才能讓用戶可以安全使用;第三個問題,我得如何設計操作界面,才能讓用戶覺得它易用甚至智能;第四個問題,我怎麼實現它們;第五個問題,如何證明我的方案可行、還有沒有更好的方案;第六個問題,如何壓縮成本……
通過問自己問題,幫自己把目標清晰化、幫自己尋找解決問題的步驟、幫自己設計解決問題的方案、幫自己證明解決方案的可行性/經濟性、幫自己尋找簡化方案/更優方案……你看,有無窮無盡的事情要做。
計算機算法也是類似的東西。它要求我們靈活運用我們掌握的知識,湊出我們需要的結果來。
比如說,識別圖像邊緣,這得怎麼做?
首先,問自己一個問題:什麼是圖像邊緣(請儘量用數學語言回答,做不到就得多鍛鍊)
然後,繼續問:我這個回答可靠嗎?會不會像“柏拉圖的人”一樣,被人用“拔毛雞”矇混過關?如果遇到這種情況,怎麼辦?還是隻能忍受?
最後,如何用計算機語言實現我的想法?
你看,學會問問題,學會把模糊的目標清晰化、數學化,算法的問題就解決了一半。
另一半是,尋找一條路,解決這種在未經訓練者看來壓根就無法回答的問題——這一半的難度,往往比“提出問題”又大了無數倍。
為了解決這類問題,你必須創造性的使用你掌握的知識。
熱電偶受熱產生電壓?那麼搭配上電壓表它就是溫度計。
石英受壓產生電壓?那麼把它做成薄膜、當它隨著聲波顫動時,其上的電壓必然反映了聲波波形——不夠完美?那是因為共振、分割震動等等問題造成的,我可以如此如此的建模從而使其可計算;然後如此如此的修改方案,以便影響其中的某個參數,從而得到完美的波形。
信號電壓太過微弱?有很多很多種物理過程,可以把微弱的輸入按比例放大。比如油門線上施加的微小的力和發動機輸出的強勁功率之間的關係。
我需要尋找數學/物理原理類似的過程。這玩意兒往往並不是天然存在的,但我可以利用現象A和現象B,然後如此組合它——看,三極管出現了!
類似的,我們需要讓雜亂無章的一堆數字有序,怎麼辦?
很簡單,我們都見過水和油的分層現象。它們為何會分層?遵循怎樣的物理規律?我如何提取其中的核心部分、儘量簡化我的實現?
冒泡算法呼之欲出。
先學會提問題,再學會創造性的解決問題;最後,把創造性的解決方案拆分、實現——這就是算法。
很明顯,提問題和解決問題並沒有明顯的界限。你必須融會貫通它。這需要持久、刻苦的訓練——哪怕是香農,他也沒可能一步到位的搞出哈夫曼編碼算法。
必須在這兩個方面足夠訓練有素,你才可能理解香農的偉大。
絕大部分比較難的算法已經被人解決了。我們可以學習他們的解決思路,然後解決實踐中遇到的那些更為簡單但並不能直接套公式的問題。
如果你曾經嘗試過去想“為什麼歐幾里得會弄出幾何學”“為什麼某某定理可以這樣證”“為什麼他們就能想到這樣去證”,那麼提問題和解決問題的一般思路就學到手了——如果你這樣學,那麼初高中學到的每一個知識點,都在教你如何解決問題、如何設計算法(所有“按步驟處理即可解決問題”的步驟的設計,都是廣義的算法)。
換句話說,你需要鍛鍊自己主動的提出問題、尋找解決問題的途徑能力,而不是被動的記憶“套公式解決能套公式解決的問題的方法”。
但是,國內的應試教育以做題為目的。
學了輪軸?看,這道題要用到輪軸,我們要這樣套公式;那道題是另一種題型,套公式得那樣套——總結:關於輪軸的題型一共X種,它們的解法分別是#*&¥%#*……
久而久之,你們就只會背公式套公式了——你說手電筒?那玩意兒那麼複雜書上沒說我怎麼可能知道!
絕大多數人,最終都學的不僅不會問問題,更不會解決問題。他們只是會套公式而已。
當手電筒都能難住你時,哈夫曼?差著十萬八千里呢。這不是拿世界級難題難小學生嗎。
手電筒真的不是個比喻。
很多人的確沒有能力理解這種最淺最直接的知識:代碼是如何控制硬件的?
你看,“老鼠夾子抓老鼠不是老鼠夾子有智能,而是我們自己想辦法組合了槓桿、彈簧等東西,使得它可以在小動物碰觸時動作”這個幼兒園小朋友都能懂的原理他們懂嗎?懂了還會契而不捨的不斷追問“計算機究竟是怎麼認識0和1”嗎?
這種程度的換位思考/反向思考都辦不到,還能指望他們“自發尋找日常問題的解決方案”嗎?還可能指望他們解決別的“日常動腦”的人也需要思考片刻的“難”題嗎?
但是,哪怕只是當一個稍微不那麼尸位素餐的、中小企業的底層領工者/技術員,完全不會動腦子,可能嗎?
總結起來就一句話:算法很簡單,中小學甚至大字不識的人都能學會;它只是要求你自己動腦子、創造性的使用你學到的知識而已。
創造性幾乎是人類這個物種與生俱來的,沒人知道該如何教會別人;但壓抑它、剝奪它,卻並不難。