python求冪運(yùn)算符 程序員需要學(xué)好數(shù)學(xué)嗎?為什么?
程序員需要學(xué)好數(shù)學(xué)嗎?為什么?什么是數(shù)學(xué)簡(jiǎn)單,我覺(jué)著有必要說(shuō)明再看看什么是數(shù)學(xué)!數(shù)學(xué)就是乘法么?當(dāng)然不是。但是要要只能說(shuō)明,數(shù)學(xué)在任何行業(yè)都是有用處的,在程序員這個(gè)行業(yè)越發(fā)尤其明顯。有的人會(huì)說(shuō),我生活
程序員需要學(xué)好數(shù)學(xué)嗎?為什么?
什么是數(shù)學(xué)
簡(jiǎn)單,我覺(jué)著有必要說(shuō)明再看看什么是數(shù)學(xué)!數(shù)學(xué)就是乘法么?當(dāng)然不是。但是要要只能說(shuō)明,數(shù)學(xué)在任何行業(yè)都是有用處的,在程序員這個(gè)行業(yè)越發(fā)尤其明顯。有的人會(huì)說(shuō),我生活中也用不了而且深的數(shù)學(xué)知識(shí),我都會(huì)個(gè)加減乘除,有一點(diǎn)也不耽誤了生活??!比較復(fù)雜到復(fù)雜計(jì)算出不另外計(jì)算器呢么?那我們?yōu)槊匆獙W(xué)數(shù)學(xué)?
數(shù)學(xué)還能夠培養(yǎng)人的邏輯思考能力數(shù)學(xué)還能夠重視培養(yǎng)收集信息、歸納類(lèi)比、直覺(jué)地判斷、確立模型和計(jì)算精確計(jì)算能力
程序員是否需要一定要想學(xué)好數(shù)學(xué)才能干活的人?以我十多年行業(yè)經(jīng)驗(yàn),我覺(jué)著不一定,這個(gè)問(wèn)題因崗位而異,因工作內(nèi)容而異,程序員也分好多種。程序員也統(tǒng)稱基礎(chǔ)web程序員、架構(gòu)師、數(shù)據(jù)科學(xué)家或則在大廠擰螺絲的程序員等等。
什么樣的程序員需要挺好的數(shù)學(xué)能力?
不過(guò)想想,有很好的數(shù)學(xué)基礎(chǔ)的程序員是吃香的。緊隨其后,算法工程師、大數(shù)據(jù)工程師、人工智能、云計(jì)算類(lèi)的工程師。這一類(lèi)的工程師招聘需求,無(wú)一不對(duì)數(shù)學(xué)有很高的要求。所以我這一類(lèi)的人才,年紀(jì)輕輕再次進(jìn)入大廠就30萬(wàn)淺色,緊接著經(jīng)驗(yàn)的增長(zhǎng),能力能提高,有可能工作好5、6年就年薪直逼百萬(wàn)。不過(guò),這一類(lèi)程序員的學(xué)習(xí)成本也極高的!可參考下圖:
還有沒(méi)有不必須很強(qiáng)數(shù)學(xué)能力的程序員類(lèi)別?
先排除上面的一類(lèi)軟件工程師,也先排除一些高度精密計(jì)算行業(yè)的軟件工程師,下面的這些軟件開(kāi)發(fā)者,通常來(lái)說(shuō)不不需要挺好的數(shù)學(xué)能力就可以工作。委婉的說(shuō)就是這一類(lèi)程序員,數(shù)學(xué)能力強(qiáng)是最好是的,數(shù)學(xué)能力不強(qiáng)也能干!干得好不好啊因人而異吧,有可能你應(yīng)該是行業(yè)知識(shí)業(yè)務(wù)水平高的程序員,在你的行業(yè)你確實(shí)是很啊的存在!
web開(kāi)發(fā)前端程序員:這一類(lèi)的程序員大多來(lái)說(shuō),需要的數(shù)學(xué)知識(shí)較低。不不需要有很強(qiáng)的歸納數(shù)據(jù),最精確算出的能力。這一類(lèi)別的程序員,反而要比較好的創(chuàng)意能力、創(chuàng)新思維和實(shí)踐動(dòng)手能力。對(duì)數(shù)學(xué)的要求卻不是高。非一定高度精密計(jì)算行業(yè)的軟件開(kāi)發(fā)程序員:這是一種很小的類(lèi)別,大概30%程序員正處于這個(gè)類(lèi)別。正常情況來(lái)說(shuō),給各個(gè)企業(yè)變更土地性質(zhì)OA系統(tǒng),辦公系統(tǒng),倉(cāng)儲(chǔ)系統(tǒng)的這一類(lèi)民間開(kāi)發(fā)的面向企業(yè)用戶、用戶的程序員。這一類(lèi)的程序員要注意以業(yè)務(wù)偏于,技術(shù)主輔結(jié)合,大多數(shù)來(lái)說(shuō)也不不需要很強(qiáng)的數(shù)學(xué)能力。反而對(duì)溝通能力、需求收拾好能力、需求理解能力有很高的要求。就算在架構(gòu)急切度極高的互聯(lián)網(wǎng)企業(yè),也又不是所有的程序員都要有很不錯(cuò)的數(shù)學(xué)能力才能工作。大部分的互聯(lián)網(wǎng)公司全是面試造火箭,入職時(shí)擰螺絲。如果沒(méi)有你學(xué)歷及畢業(yè)院校比較好好,面試過(guò)程又剛巧談得來(lái),榮幸能夠混在里面的話,數(shù)學(xué)能力不行的話也這個(gè)可以混的!筆者就有很多這樣的朋友!
確實(shí)說(shuō)這一類(lèi)的程序員大多不要很好地?cái)?shù)學(xué)能力就可以不工作,但是我說(shuō)了:“數(shù)學(xué)是一種鍛練邏輯思維能力的學(xué)科,而強(qiáng)大這種能力的人會(huì)永遠(yuǎn)都不吃香”,如果不是你想在程序員這個(gè)行業(yè)不斷地的向上升攀升,數(shù)學(xué)能力那就是需要品!
大數(shù)相乘,快速算法?
換算乘法運(yùn)算是有飛快算法的,并不是三個(gè)一個(gè)蠻力乘上去的。諸如想算2^10000,計(jì)算機(jī)先算2^5000,再算兩次平方,即兩個(gè)數(shù)的乘法。而目的是可以計(jì)算2^5000,計(jì)算機(jī)會(huì)先算2^2500再算兩次平方。這個(gè)算法叫迅速冪算法,對(duì)于2^N的計(jì)算,如果其實(shí)有時(shí)候乘法的時(shí)間復(fù)雜度是O(1)的話,那整體的時(shí)間復(fù)雜度只有O(logN)級(jí)別。
一般來(lái)說(shuō),目的是實(shí)現(xiàn)程序快速冪算法,簡(jiǎn)單把指數(shù)做二進(jìn)制意思是,例如你要算A的23次方,這個(gè)可以把23分解為16421。然后把換算BA^2,CB^2A^4,D(C^2)^2A^16。結(jié)果結(jié)果為ABCD乘積。
但這里乘法的急切度并不是O(1),而且它是無(wú)窮精度的,也就是所謂的大數(shù)乘法。大數(shù)乘法也有很多算法,最簡(jiǎn)樸的,帶有手算的方法,急切度是O(N^2),其他一些方法有治于法,復(fù)雜度O(N^1.58),F(xiàn)FT方法,緊張度O(NlogNloglogN)等。飛速冪的O(logN)次大數(shù)乘法中,最奇怪的唯有第三次,也就是2^5000的那次,前面的奇怪度幾何級(jí)數(shù)衰減作用,所以整體奇怪度也就是最后一次機(jī)會(huì)計(jì)算出的復(fù)雜度。如果你用FFT方法的話,奇怪度也就是比線性多了一點(diǎn)點(diǎn),好象計(jì)算機(jī)上只要算算看就不出來(lái)了。
CPU沒(méi)有疾速運(yùn)行是因?yàn)檫@個(gè)程序只用了1個(gè)核心在做算出,而你沒(méi)顯示的是總的使用率,因?yàn)椴畈欢鄷?huì)一直保持在四分之一的水平。
如何確定應(yīng)用了偏移操作比較復(fù)雜Python大數(shù)運(yùn)算的具體設(shè)計(jì),我也不是很懂就差不多講了。但原理上講又是很可能的,要是用比特串儲(chǔ)存大數(shù)的話,那你換算2^N只不需要在數(shù)組的第N位設(shè)置兩個(gè)1,其余設(shè)置為0即可解決,那你裝換到十進(jìn)制是這段代碼中最耗掉可以計(jì)算量的部分。