以圖明志

計算機數學與基礎

把數學踢出高考,那么誰家的孩子該學數學?

追求純粹知識和理性
上一個月,網絡上先是在討論“把英語踢出高考”,但有人說,英語比數學重要,學好英語才好出國,好移民,語云,“英語記不牢,終身在天朝”。后來話題就轉換成“把數學踢出高考”了。后者獲得的響應比前者高。還有網站搞了個投票,投票的結果是七成在“踢數學”。“除了數錢,一輩子沒有再用到數學”,這個說法很有感染力,“踢數學”本身會帶來快樂,可以發泄另外的情緒。

編程思想

再談PHP、Python與Ruby

語言選擇問題
編程語言非常重要,不要認為他們都圖靈等價,用起來都一樣。實際上,好的語言,帶給你的東西是超乎想像的。優雅的抽象勝于簡單的堆砌: 這意味著你的代碼是最簡潔而又充滿設計感的,面向對象,容易的閉包,一切都是表達式等等,而最好的抽象是語言本身能夠分層,既能夠書寫語言的語言,比如 DSL 能力強弱是個指標。

編程思想

開始學習函數式編程后對編程的一些新感受

工具與方法
最近開始學習函數式編程,打算深入進去,掌握函數式編程的思路。具體學習足跡可以看看 現代魔法學院的《編程范式篇》。以后關于技術類的東西,大部分都會整理成專題,章節,發布在學院中,而博客則回歸更為輕松隨意的狀態。我們絕大多數程序員都是用命令式編程,因為學校教的編程就是命令式的,什么C、Java等等(當然他們也可以用函數式編程)。

編程思想

編程范式,程序員的編程世界觀

編程范式的重要性
編程范式(Programming Paradigm)是某種編程語言典型的編程風格或者說是編程方式。隨著編程方法學和軟件工程研究的深入,特別是OO思想的普及,范式(Paradigm)以及編程范式等術語漸漸出現在人們面前。面向對象編程(OOP)常常被譽為是一種革命性的思想,正因為它不同于其他的各種編程范式。編程范式也許是學習任何一門編程語言時要理解的最重要的術語。

編程思想

常見編程語言對REPL支持情況小結

REPL(Read-eval-print-loop)
最近跟一個朋友聊起編程語言的一些特性,他有個言論讓我略有所思:“不能REPL的都是渣”。當然這個觀點有點偏激,但我們可以探究一下,我們常用的編程語言里面,哪些支持REPL,哪些不支持,還有REPL的一些概況。在一般的腳本語言中,有REPL是常態,因為REPL非常的方便。

面向對象技術

為什么會有面向對象編程的產生?

從結構化編程說起
很久以前,軟件開發的世界還是一片渾渾噩噩,不管開發什么軟件都面臨著復雜性這個問題,代碼里面到處是goto語句,程序的流程隨意跳轉。眾生寫代碼時,越寫到后面越不知道自己寫的是什么。這時候出現一位巨人,它就是結構化編程。

計算機數學與基礎

計算機是怎么啟動起來的?

一個非常復雜的過程
從打開電源到開始操作,計算機的啟動是一個非常復雜的過程。我一直搞不清楚,這個過程到底是怎么回事,只看見屏幕快速滾動各種提示...... 最早的時候,工程師們用它來比喻,計算機啟動是一個很矛盾的過程:必須先運行程序,然后計算機才能啟動,但是計算機不啟動就無法運行程序!

計算機算法

快速排序里的學問:隨機化快排

選擇隨機數作為樞紐元
一般來說隨機選取樞紐元這種策略非常安全,除非隨機數生成器有問題(這不像你所想象的那么罕見),因為隨機的樞紐元不可能總在接連不斷地產生劣質的分割。另一方面,隨機數的生成一般是昂貴的,根本減少不了算法其余部分的平均運行時間。算法與前面《算法導論》里的例子差不多,只是在調用分割Partition時加入一個隨機數,具體可以參看程序。

計算機算法

快速排序里的學問:樞紐元選擇與算法效率

樞紐元選擇也有學問
通常的、沒有經過充分考慮的選擇是將第一個或最后一個元素用作樞紐元。如果輸入是隨機的,那么這是可以接受的,但是如果輸入是預排序的或者是反序的,那么這樣的樞紐元就產生一個劣質的分割,因為所有的元素不是被劃入S1就是被劃入S2。更有甚者,這種情況發生在所有的遞歸調用中。

計算機算法

快速排序里的學問:霍爾快排的實現

霍爾快排的C語言實現
專題的前一篇講了快速排序的始祖——霍爾快排,那么這里就簡單地實現以下霍爾快排。補充說明下,快排的一個核心步驟是選取樞紐元,通常的做法是將第一個元素用作樞紐元,《算法導論》里的快排例子和Hoare快排都是這種樞紐元選擇。排序的思路是,選定一個樞紐元,比樞紐元大的全部丟到右邊,比樞紐元小的全部丟到左邊。

計算機算法

快速排序里的學問:霍爾與快速排序

再次深入理解快速排序
霍爾 (Sir Charles Antony Richard Hoare) 是一位英國計算機科學家,他是著名的快速排序 (QuickSort) 的發明者。在平均狀況下,排序 n 個項目要Ο(n log n) 次比較,而且通常明顯比其他Ο(n log n) 演算法更快。所以它是一個被廣泛使用的算法。在一次采訪中,霍爾談到了發明這個算法的背景。

計算機算法

快速排序里的學問:快速排序的過程

理解快速排序的工作機制
通過前面問題以及引入了“信息熵”的概念,我們可以重新來理解排序的本質:一組未排序的N個數字,它們一共有N!種重排,其中只有一種排列是滿足題意的(譬如從大到小排列)。換句話說,排序問題的可能性一共有N!種。任何基于比較的排序的基本操作單元都是“比較a和b”,這就相當于猜數字游戲里面的一個問句。

計算機算法

編程之美2.3筆記:尋找發帖“水王”

降低問題規模的思想
抽象就是從問題中提取有用的,本質的特征,然后將問題用一個簡潔但包含同樣信息的模型表示出來。復雜的問題經抽象后,可能會變成一個簡單的問題,也可能會變成一個曾經遇到的問題,當然也可能仍然是復雜的問題。不管抽象后得到的結果是哪一種,看著抽象后的問題,想出解的可能性必然比直接看原題想的可能性大。

計算機算法

快速排序里的學問:信息熵

從信息熵角度去理解問題
信息是個很抽象的概念。人們常常說信息很多,或者信息較少,但卻很難說清楚信息到底有多少。比如一本五十萬字的中文書到底有多少信息量。直到1948年,香農提出了“信息熵”的概念,才解決了對信息的量化度量問題。一條信息的信息量大小和它的不確定性有直接的關系。比如說,我們要搞清楚一件非常非常不確定的事,或是我們一無所知的事情,就需要了解大量的信息。

計算機算法

快速排序里的學問:再看看稱球問題

根據問題選擇N分法
12個小球,其中有一個是壞球。有一架天平。需要你用最少的稱次數來確定哪個小球是壞的并且它到底是輕還是重。這個問題是一道流傳已久的智力題。網絡上也有很多講解,還有泛化到N個球的情況下的嚴格證明。也有零星的一些地方提到從信息論的角度來看待最優解法。本來我一直認為這道題目除了試錯之外沒有其它高妙的思路了,只能一個個方法試,然后看看哪種方案最少。

計算機算法

快速排序里的學問:從猜數字開始

猜數字里的算法思想
我們先來玩一個猜數字游戲:我心里默念一個1~64之間的數,你來猜(你只能問答案是“是”或“否”的問題)。為了保證不論在什么情況下都能以盡量少的次數猜中,你應該采取什么策略呢?很顯然,二分。先是猜是不是位于1~32之間,排除掉一半可能性,然后對區間繼續二分。
1 / 22 首頁 < Prev 1 2 3 4 5 Next > 尾頁 頁碼:
英超直播吻球网