C、C++、MATLAB、Python、Go 哪個比較適合寫演算法?

編程背景:我不是計算機相關專業的 是以數學物理等基礎學科為專業的 C語言剛剛自學看完了C primer plus,對整個語言有個初步的了解,但沒有多少編程經驗。 C++ 只是略略看了些類與繼承的內容和OOP的思想,還沒有入門。matlab不久就要學,因為在數值計算和數據可視化方面需要用到。python和Go語言完全沒有接觸過。

目前學編程的主要目的不是為了做項目或者找工作或者寫paper,而是打算用《演算法導論》這書學演算法的時候寫程序實現一下,或者對一些感興趣的事情建模分析。對於演算法,我比較在意的不是具體實現的細節,而是背後的思想和數學原理。

我聽說C/C++在寫演算法的時候,會花大量時間來處理和實現相關的細節上,而Java和python寫演算法能比較集中到演算法本身的內涵上。請問的確有這種情況嗎?

如果python或者Go比較適合寫演算法,請問下像我這樣背景的人適合用什麼樣的書或者資料上手這些語言?

如果C/C++寫演算法比另外幾種語言要更合適,那C和C++在這方面具體的區別是什麼?我有需要再額外學習C++,還是繼續深入鍛煉C語言的能力?

第一次在知乎上提問,感謝!


目前學編程的主要目的不是為了做項目或者找工作或者寫paper,而是打算用《演算法導論》這書學演算法的時候寫程序實現一下,或者對一些感興趣的事情建模分析。對於演算法,我比較在意的不是具體實現的細節,而是背後的思想和數學原理。

你的要求本身是矛盾的

學《演算法導論》的核心目標之一是建立起對演算法複雜度的全面理解和感受,這當然要在一個容易對性能建模/預測的系統上實驗比較好,比如C/C++這些runtime基本不做什麼額外操作的「純被動」的高度可預測的系統。你選擇一個有managed Memory/IO的系統,結果字面上的O(1)操作其實背後有時不是O(1)的,那你不等於自尋困擾么

你想對感興趣的事情建模分析,這是數學或是其他學科的範疇。這時當然用高級的工具比較好。別的不說,單單做個整數數值計算還要考慮數值太大了會不會溢出這些機器層次上的問題不是浪費時間么


我聽說C/C++在寫演算法的時候,會花大量時間來處理和實現相關的細節上,而Java和python寫演算法能比較集中到演算法本身的內涵上。請問的確有這種情況嗎?

我不知道這句話是哪來的,如果你是從網上看到的,麻煩你貼下網址,如果聽別人說的,你叫他來知乎私信我!這不是誤人子弟么!


【我聽說C/C++在寫演算法的時候,會花大量時間來處理和實現相關的細節上,而Java和python寫演算法能比較集中到演算法本身的內涵上。請問的確有這種情況嗎?】

不對。你用C++也可以不處理實現相關的細節,沒人逼你這麼做。

數據結構和演算法從本質上來講就是泛型的。你要麼使用C++的模板,要麼用python的動態類型。C和go都會讓你覺得搞起來很苦逼。不過目前調試C++的IDE都比python要強太多,如果你本來就會C++,那就用C++。


僅僅就學習演算法,還是C++/Java/C#最適合。

首先,沒泛型的語言未必工作不好用,我司現在服務端代碼幾乎都是go,但是沒有泛型,寫通用的代碼就是不好用。我用Go把半本《演算法》實現了一遍,移植了Haskell 的 Parsec 庫。這些代碼大部分都在我團隊的項目里實際使用。你要說 Go 有多熟練未必,但是要說它在語言功能上有多少坑我倒是挺熟悉。沒泛型的話演算法實現起來太坑人了,別的不說 float32/float64/int8/int16/int32/int64/int 這些數值類型你能都覆蓋么?如果只是基於某一組有限的數據類型和問題領域實現一遍,用 go 倒是不錯,它環境配置容易,不太依賴ide,但是對ide還是比較友好的,天然集成test,編譯快速,模型簡單,學習容易,可以說是我用過的靜態編譯型語言里最像動態腳本語言,最適合快速開發微型工具的。

其次,Python/Ruby 這類語言其實不太適合練習演算法實現,它們太「高級」了。例如用Python的時候,你很難規避它的內置容器List和Dict,這些東西封裝了太多東西,在學習的過程中容易被干擾。另外沒有靜態的類型控制,在學習過程中也會失去一些知識。倒不是就會導致你後半生這部分都不能自理,但是需要另外學習。

在我的經驗,要學習演算法,C++/C#/Java 仍然是比較好的選擇,它們的泛型已經比較成熟,能夠在學習中建立比較完備的知識概念。可以找到一些比較好的IDE用,我個人其實在工作中不怎麼用IDE,但是演算法學習的時候,有個不錯的IDE可以幫你跟蹤代碼的運行過程,還能比較容易的做性能分析,這樣就可以用動態、直觀、形象的視角去理解和觀察演算法。這對學習非常有幫助。

如果只是在一個特定的領域做知識學習的工具,其實C++反而不算很難,C++的難度主要在於覆蓋的領域太廣泛,當你要做一個專業的C++程序員,要掌握的東西就太多了。

個人不太建議用C去學習這些東西,需要處理太多跟問題本身無關的事情了。


科研類 matlab


學演算法用Python,做演算法用C++,反正我是這樣。。。等到C++做出來演算法了,然後嵌入到Python腳本中,既能快速輕鬆的做出來程序,也能顧全性能。。。


單純學演算法,Matlab最好。結合Matlab的可視化工具,演算法過程可以更容易理解。而且基礎學科專業,在Matlab上反正是要投資的,不如現在就開始。

不同意使用C/C++學習演算法,尤其是樓主並不是計算機專業的情況下。用C寫演算法涉及到太多編程技巧和與演算法無關的事項,光是內存管理這一塊就很麻煩,更別提無法繞開的各種指針操作。如果在C++上實現演算法,比起C來優勢也就是多個泛型。沒有泛型,演算法不能通用,但是樓主的目的是學習演算法,不是去實現工業級質量的通用演算法(stl早就實現了)。那麼泛型就是個徒增學習曲線的概念,沒必要去動它,就只拿float32做演算法實現了又怎麼樣?


C語言確實不適合寫演算法,因為C語言最容易把代碼寫亂。

python沒用過,但是據同事們說很貼近自然語言,寫起來很爽。


按我的概念,C、C++是用來寫演算法的,matlab、python這些是用來用演算法的。


必須是matlab。

其實是python和Fortran。

c/c++這個坑 如不是必須,盡量別入坑

============

反對說傳統語言對於非計算機或者非信息類專業的學生 適用C/C++/Java實現演算法的說法。

我自己把演算法分為兩種,狹義演算法廣義演算法

狹義演算法 指 演算法導論 數據結構 離散數學 操作系統 等課程中 涉及的演算法,這類演算法不用高等數學、微積分、微分方程、數理統計等知識。

此類演算法一般是計算機系大學生所說的演算法。

廣義演算法 就比較寬泛了,任何數學公式,都可以成為演算法,此類演算法在數學系、信息系同學的專業課中非常常見,比如DSP演算法,這種涉及到離散傅里葉變換演算法,你能說這些跟數據結構裡面的類似快速排序的演算法 你覺得是一回事情么?

對於物理系、信息系的同學來說,他們只是需要一個超級計算器,他們不是研究編程,是一個研究背景下,我要優化 改進一個演算法 我要快速研究一個演算法是否可行。他們始終是在研究數學,而非研究如何更好的編程當一個優秀而傑出的碼農。

而matlab正式這樣一種學習成本低,對於實現廣義演算法非常友好的超級計算器,生產效率是非常高的,另外也帶有IDE和調試工具,Debug也不差的,另外還有simulink等非常厲害的工具。

所以首推matlab。

另外對於學有餘力的同學,掌握C++ / Java 或者結合相關背景選擇 一門普通編程語言(如機器學習的同學,去學習Python)都是非常好的。

當然如果你已經是資深C++/Java語言的user,那麼你自然不必回頭再去學matlab


這幾個語言的演算法我都略有涉及, 勉強有資格回答這個問題.

演算法本身是很理想的產物, 但是不得不持續的跟語言去平衡.

類似物理是數學和現實的折衷.

演算法也是數學和語言的折衷.

其實演算法對於一般工程師的要求其實很低, 本質上就是一個表:

| 演算法名 | 演算法複雜度 | 演算法可能的使用場景 |

所以對於工程師而言, 能夠認識到演算法的細節已經算超標要求了.

意識到這些語言的細節將會是工程師基本素養的一部分. 以至於常年固定在一門語言的工程師會分辨不出來這些到底是語言的細節, 還是演算法的細節.

## 對於工程師而言:

一般認為使用C++/Java算是基本平衡演算法和語言細節的.

(但是請問你寫那麼多public和private能體會多少演算法背後的力量呢?)

比如你用了一個需要用到指針做索引, 但這種類型的`編程語言`卻無法使用指針, 那麼你就不得不多設計一個數據結構來巧妙的規避這些.

我曾經仔細的思考過不同類型語言對**演算法**和對**實現演算法**的影響.

在實現演算法的時候有很多演算法相關的細節並不可規避, (而且也不應該去規避) 但是如果語言的細節干擾程度過多, 就會迷失在語言的黑洞里. 本來就分不清到底是應該是哪個是哪個.

如果對著&<&<演算法&>&>這本書去寫, 那麼推薦你就用java寫. 因為可以直接繞過語言的坑.

如果是&<&<演算法導論&>&>, 那麼其實語言本身不是問題, 本書其實基本是pseudo-code, 而且針對不同語言的講解了很多語言的細節.

我曾經用C++實現過本書絕大多數的演算法, 也用python實現過本書裡面的部分演算法. 相比之下, C++會比較正統. python則語言細節略多.

但是由於一直以來java程序員的數量, 往往會造成一種Java-like的語言才更適合寫演算法. 其實這點本應該引起工程師們的警惕.

## 對於體會演算法背後的細節(數學, 思想)而言:

我認為儘可能的少觸碰語言細節去體會演算法細節是最重要的.

上面有推薦Matlab的, 事實上Matlab會使得你離開計算機系去數學系.

所以一般認為Matlab 更適合其他行業的人員參與.

1. Matlab涉及語言細節比較少, (大部分Matlab的使用者很少關心語言細節.)

2. Matlab觀察原理很方便,

3. 方便進一步的圖形化,

4. Matlab本身在學習演算法之後也可以作為補充工具.

matlab 真是一個古老而博大精深的語言, 其實現在而言[Julia](The Julia Language)類似Matlab, 在我看來, 其實會避免更多語言的細節.

對於樓主而言也算很不錯的一個選擇.

我認為樓主可以考慮一下Matlab, (當然還有Julia)

&> 紙上得來終覺淺,絕知此事要躬行

最後:

我幾乎沒寫過C#的演算法, 在此不表. 不過無論選那種語言, 要完整的自己寫出來才能真正領悟.


python。python是最接近偽代碼的高級語言。

你覺得c++寫演算法也很快,說明你寫的都是些本科教材都能找到的初級演算法,基本上閉著眼睛都能背出來那種,所以你覺得你不會在細節上花很多功夫,因為都背熟了。

稍微複雜一點的演算法設計,你用c++,基本上要多浪費2倍的時間。不信你用c++來從頭寫個協同過濾推薦演算法,或者HMM拼寫糾錯演算法試試。我用python,讓你先寫2個小時,咱們比比誰先做完。

用python來做演算法學習是再合適不過了,但是生產中,經常會把性能關鍵的部分使用c/c++實現。


python,不是有個笑話么:

def Pow(a, b):
return a ** b


我覺得演算法和語言沒什麼關係,一般不存在哪種合適哪種不合適的問題。

以樓主的情況看,

只是稍微知道一點C語言,

C++基本還沒入門,

其他的還根本沒學,

目前想「打算用《演算法導論》這書學演算法的時候寫程序實現一下」,

我看也只好用C了。

C構造數據結構的能力很強,

而好的演算法從來與好的數據結構是密不可分的,

所以用C沒什麼不妥。


matlab,因為簡單,易學,易看。你不用花時間到語言的細節上,要看每一步數據也很容易。


python至少比C/C++更容易


matlab。語法簡單,上手容易,有比較多的toolbox可用,圖形界面交互好,調試程序方便,斷點調試還可以敲一大堆命令啊,而且幫助文檔很詳細。就是程序大點運行效率有點蛋疼,要跑好久!

python功能也很強大,也有很多庫,運行很快,剛學習還不是特別了解,現在體會是幫助文檔沒matlab好使。C/C++運行效率快,可以方便移植到軟硬體平台看效果,但debug沒matlab好用


Go沒有接觸過,用C++,Python和 Matlab寫過一些演算法,感覺就演算法本身來說,區別並不大,你希望關注演算法的思想和原理那就多注意演算法的整體性~~有數學和物理背景的話應該不是什麼難事,一直認為本科階段讀一個數學相關專業再來念研究生比較好(僅僅是個人看法,就計算機專業來講的)


我是物理研三的,其實所謂的數學演算法在找工作的時候,用的非常少。如果有志於進入企業界,還是需要數據結構的那種演算法。如果工作的時候也想研究純數學演算法的話,可能需要讀個博士,並不是能力不夠,而是崗位要求。

類似的,語言也一樣。


c


推薦閱讀:

linux下子進程退出狀態為什麼永遠是非正常?
LYP是一位怎樣優秀的巨巨?
為什麼C++書上的.h文件上不加預編譯語句?
C++ new分配的內存不delete會泄漏嗎?

TAG:Python | 編程 | MATLAB | C編程語言 | C |