計算機編程算法和數學有什麼關係?

恆少Jacky


數學對於計算機算法編程來說非常重要。我主要從下面兩個方面來說明它為何這麼重要

一. 培養邏輯思維能力

數學和算法編程都需要較強的邏輯思維能力,程序代碼的邏輯結構、前後聯繫及處理方式都需要較強的邏輯思維能力,而數學學得好,邏輯思維能力強,通常算法編程領悟也會更深。

二. 數學應用於算法編程

這一點應該是數學與算法編程比較相關的重要原因,無論是計算機的底層還是非底層,數學知識到處都有體現。例如計算機底層的二進制、機器學習和深度學習的梯度推導、SVD分解、張量分解、PCA求特徵值、優化問題、密碼學的大數分解、概率圖模型等等都是與數學特別相關。下面我隨便舉兩個例子,可以自己體會

例1: 給定一個數x,開平方並取倒數。

代碼實現如下

這是當年的經典遊戲雷神之錘3裡面的代碼,經測試這段代碼比(float)(1.0/sqrt(x))快4倍,計算性能有質的飛躍。為此還專門有一篇論文《Fast Inverse Square Root》講解這個代碼的數學原理,感興趣的同學可以找一下這篇文章研究一下。

例2:給定一個數n,n可能非常大,比如10的18次方這麼大,求x^2+y^2=n的解。

如果不用數學知識,直接暴力搜索,時間複雜度為O(n),效率低下,而且按目前的計算機水平也很難算出來。如果瞭解Brahmagupta–Fibonacci identity、Pollard-rho分解法、二次同餘方程的解、歐幾里德輾轉相除等數學知識,那麼求解這個問題的時間複雜度大大降低,保證0.2秒內出結果。

如果工作是算法崗位,數學更加特別重要,因為機器學習、數據挖掘、NLP等方向的底層原理基本都與數學脫離不開關係。


薛定諤的小貓貓


從事編程工作多年,喜歡在工作之餘,夜深人靜的時候寫點編程感悟,喜歡分享自己的一點編程總結,算是給還在編程路上小夥伴一點啟示,學習編程如同一層窗戶紙,在某有捅破之前永遠覺得距離很遙遠,一旦有了感覺進入狀態了,其實發現沒有想象的那麼艱難,能體會到當年自己拿著一本書在苦苦尋找突破的感覺,特別希望能有一個指路人哪怕就是鼓勵的一句話可能感覺都不太一樣,現在學習編程的環境相比十幾年前已經好太多了,大把的書本以及視頻資料都可以拿來作為參考。

現在資料多了也不一定是啥好事情,可能還會導致選擇糾結症,很多人初學者只是在選擇編程什麼編程語言上就能糾結好長時間,選擇了語言然後再去選擇資料,總之的一堆選擇糾結症。很多人即使已經找到了編程的工作,也沒有直接的感覺到數學和計算機算法有多少直接關聯性。甚至多了很多年的程序員也覺得自己算法不怎麼樣不也是照樣寫代碼,遇到不懂的直接在網上找下相似的代碼,看懂了修改下照樣能推動項目的進行,只能講編程的火候還沒到家。經歷過一次次的項目的洗禮之後,做技術很多東西只要有耐性和毅力基本上都能做到,既然什麼都能做到,編程到底難在哪裡。

仔細靜下心來想編程的核心是什麼,總結起來就是編程思想和邏輯算法,編程思想需要不斷的總結歸納,框架思想也是編程思想的一種,需要從千千萬萬的代碼邏輯種抽象出解決問題的方案或者框架,說的通俗一點就是解決問題的能力,問題也是分為很多種,有直接簡單的問題,有長期複雜的問題,也有未來還沒有發生的問題,解決方案有直接的辦法,也有通過設計框架來解,所以格局低一點的人可能就是著重眼前實際問題的解決,格局高的人就會想著設計一個框架也就是業內常說的輪子來規避類似問題的發生,這就是普通程序員和頂級高手的差距,出發點和格局都不在一個步調上。

至於具體解決問題的模式設計,就會涉及到邏輯算法,簡單的可能非常容易理解,複雜一點或者多種組合了基本上就需要用到數學知識了,所以只有認識到這一層面才會覺得數學這東西對於編程顯得特別重要,特別針對一些複雜問題或者解決根本問題上,由於自身條件或者所處的工作崗位決定,有些程序員甚至一輩子都不會接觸到,但並不意味著不存在,數學對於編程邏輯的重要性不言而喻。

總結的東西可能和主體不太搭配,既然是分析解決問題,還是喜歡從更大的格局來解決問題,不要小瞧數學對編程的影響,雖然不是每個編程角落都能和數學扯上關係,但對於重要場景一定不會缺席,但也沒有必要為了學習編程專門去學一遍數學,如果是在校學生看到可能意義會更加重大一些,所以講數學邏輯好的人,學習編程是有一定優勢的,喜歡邏輯推理的人從骨子看是非常適合做一名優秀的程序員,當然真的優秀,還需要發自內心的熱愛。

希望能幫到你。


大學生編程指南


科學計算,數值計算,幾何運算,線性代數,離散數學,概率論,統計論,高等數學,工程數學,向量和矩陣運算,時域變換,頻域變換……這些算法中涉及的知識,都是數學。數學是一切學科的基礎及演變,計算機編程算法也是基於數學之上。邏輯不是算法僅有的特徵,數學更需要邏輯。



如果是從事基礎算法工作,必需要有深厚的數學理論功底。數學+業務知識,是算法工作的標配。如果是從事算法的應用,那麼則不需要太深入瞭解數學,但也要做到知而會用。

實際工作中,大部分算法崗位都算應用級別。利用現有開源庫,修修改改,拆分重組。借鑑多於研創,說得好聽點就是,合理充分利用資源,站在巨人的肩膀上,差異化創新。



如果你想在算法領域上走得遠站得高,請好好學習數學。



謝謝大家。


嵌入式軟件少帥


謝謝,這是一個比較普遍的問題,而且被問了很多次,在大學裡面孩子們在選擇方向的時候,如果是知道編程這個方向,基本上都會問出這個問題。我自己本身,教過中學,目前在大學裡工作,雖然不是做編程的,但是主要做計算機設計與媒體方向,是和計算機相關。



回到這個問題,我覺得應該從以下幾個方面去了解

第一,我覺得編程的人一般都是具有良好的邏輯思維的人,因為,如何用程序語言的方式,把一件事情,說清楚,這本身就是一個邏輯問題。因為依靠程序去實現一個目的,所使用的方式不止一種。而數學,被認為與邏輯,非常相關的一個學科。

第二,大學裡軟件類的編程相關專業中要學數學,比如高等數學,線性代數,離散數學,數據庫等,而且都是專業課和考試課。



第三,編程和數學有關,但並不是說,不學數學,編程就沒法學,其實是越往高層,對數學的要求,就會越低,比如,以前網絡編程系統編程,大都是封裝好的,但對於一個系統來說,整體的規劃和設計更關鍵,這就是說前期的需求分析,邏輯結構設計,和物理結構設計比編碼更重要。


最後一點,我想補充的,很多人認為學設計,就和編程沒有關係,其實這也是不對的。特別是圖形學理論的學習,沒有線性代數基礎,是根本看不懂的,還有在三維視圖方面,又涉及到高等數學當中的座標知識。很多算法,對於平面幾何分析水平的要求也是很高的,比如說,如果你想搞遊戲設計,動畫電影,很多時候也是要編寫腳本的,否則畫面,是沒有那麼好的。

總的來說,他們之間還是有一定關係的。謝謝


精彩輯選


站在程序員角度,常用算法與數學沒有一毛錢的關係,僅是評估算法是定量分析下。但對多數程序員而言,這些常用算法還需要再自己評估嗎?平時只是調用庫函數而已。

站在科研人負角度,解決某一具體問題,通常要採用數學模型進行建模分析,但這個模型與實用算法之間通常有非常大的差距。

結論:是程序員的話,深刻理解常見算法,並應用其解決自己工作中的常見問題,不要老想到數學家的事!是科研人員的話,多多發論文,多申請基金,反正現在國家在基金支助上不差錢,就不要想著什麼實用了,這麼多年都證明:真正實用的是少數!


他家金爺


嚴格的來說,計算機編程算法,是數學的一個具體分枝,在高中數學中,大家都要學習程序框圖,而程序框圖,是編程的關鍵。在計算機早期的發展過程中,計算機程序設計是歸入數學系,要學習布爾代數,邏輯等很多課程,隨著社會的發展,計算機的應用越來越廣泛,計算機和其他的知識結合越來越多,計算機發展成為一個專門的學科,但,它的基礎是數學,是邏輯思維。


華仔哥ddd


一般來說兩者是沒有聯繫的,只是兩者都需要很強的邏輯能力。對於日常使用計算機編程算法不需要數學,只是在具體使用中由於用途中會使用數學公式或者數學方法,這時編程語言需要執行數學公式,兩者就結合在一起了,比如在用程序語言進行圖像處理就常常會用到傅立葉變換,或者拉普拉斯算子之類的數學方法。

另外理工科領域在大學之後的計算常常要藉助計算機進行循環計算或者大批量數據處理,有時為了特定的目標需要自己編寫程序,比如使用神經算法實現優化計算。常常需要編程進行統計學的計算。


樓雁南


計算機編程和數學有很大關係

計算機編程和數學都是具有很強邏輯性。

編程和數學都可以鍛鍊邏輯思維能力。而且是以可以相互促進的兩門學科。這就是為什麼,很多學數學的人最後轉行做編程的原因,因為他們是想通的。

學計算機編程需要有底層數學知識。

不會高等數學的話,編程只能是做一些基礎性的,日常性的事情。但如果數學足夠好,就可以做更精密的一些,誤差更小,精確度更高,也更有可能做創造性的內容。


阿慧麼麼


編程算法強調的是邏輯,簡單說就是第一步怎麼做,第二步怎麼做,直到結束。數學算法是利用數與數之間的關係進行比較快的運算。如果數學算法有很好的基礎,對於編程是有很大的幫助的。例如判斷一個數n是否為質數,一般方法判斷[2,n-1]區間內的整數是否存在能整除n,不存在就是質數。如果有數學算法的底子就知道,只需要判斷2到根號n之間的整數是否存在能整除n,不存在就是質數。這樣做的好處就是,搜索的範圍小了,求解速度快。


一笑不樂


有那麼一點點關係,邏輯性要好。


分享到:


相關文章: