㈠ 程序員怎樣學數學:編程是小菜一碟
課前預習閱讀。含歷搜預習課文時,要准備一張紙、一支筆,將課本中的關鍵詞語、產生的疑問和需要思考的問題隨手記下,對定義、公理爛殲、公式、法則等,可以在紙上進行簡單的復述,推理。重點知識可在課本上批、劃、圈、點。這樣做,不但有助於理解課談歷文,還能幫助我們在課堂上集中精力聽講元旦有三天的小長假放,這著實讓我開心了一把,要知道初三的學業繁重,為了在中考上取得好成績,一個星期只放一天假,每天晚上還有晚自習要上,一點課余時間還要拿來做作業、背書,整天都埋在書堆里,恨不得把自己拆成兩半來使。所以,好不容易可以休息一下,怎能不開心呢?只是,估計老天看不得我得意的樣子,今年元旦只放一天假,第二天接著上課。這也代表星期六也要接著上課。這個消息對我來說簡直是晴天霹靂,我真是欲哭無淚啊!我只能安慰自己:還好還好,元旦還是放假的,起碼有一天可以休息,總比沒有好…,有重點地聽講
㈡ 《程序員的數學》pdf下載在線閱讀,求百度網盤雲資源
《程序員的數學3線性代數》([日] 平岡和幸/[日] 堀玄)電子書網盤下載免費在線閱讀
鏈接: https://pan..com/s/17ZfVR3jU9sgDlpQqa-Q5Fg
書名:程序員的數學3線性代數
豆瓣評分:8.2
者:[日] 平岡和幸/[日] 堀玄
出版社:人民郵電出版社
出品方:圖靈教育
副標題:線性代數
譯者:盧曉南
出版年:2016-3
頁數:384
內容簡介:
本書沿襲「程序員的數學」系列平易賀歷近人的風格,用通俗的語言和具象的圖表深入講搏明解了編程中所需的線性代數知識。內容包括向量、矩陣、行列式、秩、逆矩陣、線性方程、LU分解、特徵值、對角化、Jordan標准型、特徵值演算法等。
作者簡介:
堀玄
專攻應用數學和物理,主要從事腦科學與信號處理領域的研究。喜歡Ruby、JavaScript、PostScript等語言。最近正在研究基於統計學理論的禪銀搜語言處理。工學博士。
平岡和幸
專攻應用數學和物理,對機器學習興趣濃厚。喜歡Ruby,熱愛Scheme。最近被Common Lisp吸引,正在潛心研究。工學博士。
㈢ 程序員怎樣學數學
First: programmers don't think they need to know math. I hear that so often; I hardly know anyone who disagrees. Even programmers who were math majors tell me they don'拿雀t really use math all that much! They say it's better to know about design patterns, object-oriented methodologies, software tools, interface design, stuff like that. 首先:程序員不認為他們需要了解數學.我常常聽到這樣的話;我不知道還有沒有不同意的.甚至於以前是主修數學的程序員也告訴我他們真的不是常常使用到數學!他們說更重要的是要去了解設計模式,面向對象原理,軟體工具,界面設計,以及一些其他類似的東西. And you know what? They're absolutely right. You can be a good, solid, professional programmer without knowing much math. 你了解嗎?他們完全正確.你不需要了解很多數學你就能做個很棒,很專業的程序員. But hey, you don't really need to know how to program, either. Let's face it: there are a lot of professional programmers out there who realize they're not very good at it, and they still find ways to contribute. 但是呢,同時你也不是真的需要知道如何來編程.我們要面對的是:有很多專業的程序員,他們認識到他們不是非常擅長數學,但他們還是尋找方法去提升. If you're suddenly feeling out of your depth, and everyone appears to be running circles around you, what are your options? Well, you might discover you're good at project management, or people management, or UI design, or technical writing, or system administration, any number of other important things that "programmers" aren't necessarily any good at. You'll start filling those niches (because there's always more work to do), and as soon as you find something you're good at, you'll probably migrate towards doing it full-time. 如果你突然覺得自己好爛,周圍的人都遠遠的超過你消襪早,你會怎麼想呢?好,你可能會發現自己善於項目管理,或人事管理,或界面設計,或技術寫作,或系統管理,還有許多其他程序員不必去精通的.你會開始堆積那些想法(因為工作永遠干不完),當你發現一些你能掌握的東西時,你很可能會轉移去全職的做這個好模工作. In fact, I don't think you need to know anything, as long as you can stay alive somehow. 實際上,我認為有些東西你不需要了解,當前你還能夠賴以生存的話. So they're right: you don't need to know math, and you can get by for your entire life just fine withoutit. 所以他們是對的:你不需要了解數學,並且沒有數學你也能過的很好. But a few things I've learned recently might surprise you: 但是最近我學到一些東西可能會讓你也感到驚喜: They teach math all wrong in school. Way, WAY wrong. If you teach yourself math the right way, you'll learn faster, remember it longer, and it'll be much more valuable to you as a programmer. 學校里教數學的方式都錯了.僅僅是教學的方法錯了,不是教數學本身錯.如果你以正確的方式學習數學的話,你會學的更快,記住這點,對你,作為一個程序員來說很有價值. Knowing even a little of the right kinds of math can enable you do write some pretty interesting programs that would otherwise be too hard. In other words, math is something you can pick up a little at a time, whenever you have free time. 哪怕了解一點點相關的數學知識,就能讓你寫出可愛有趣的程序,否則會有些小難度.換句話講,數學是可以慢慢學的,只要你有時間. Nobody knows all of math, not even the best mathematicians. The field is constantly expanding, as people invent new formalisms to solve their own problems. And with any given math problem, just like in programming, there's more than one way to do it. You can pick the one you like best. 沒人能了解所有的數學,就是最棒的數學家也不是.當人們發明新的形式去解決自己的問題時,數學領域就不斷的擴展.一些給出的數學問題,也正如編程,不止一種方法可以去解決他.你可以挑個你最喜歡的方式. Math is... ummm, please don't tell anyone I said this; I'll never get invited to another party as long as I live. But math, well... I'd better whisper this, so listen up: (it's actually kinda fun.) 數學是......嗯,請別告訴別人我說過這個哈;當然我也不指望誰能邀請我參加這樣的派對,在我還活著的時候.但是,數學其實就是......我還是小聲的說吧,聽好了:(她其實就是一種樂趣啦!) The Math You Learned (And Forgot) 你學到的數學(和你忘了的數學) Here's the math I learned in school, as far as I can remember: 這兒是我能記得的在學校學到的數學: Grade School: Numbers, Counting, Arithmetic, Pre-Algebra ("story problems") 初中:數,數數,算術知識,初級代數("帶問題的小故事") High School: Algebra, Geometry, Advanced Algebra, Trigonometry, Pre-Calculus (conics and limits) 高中:代數,幾何,高等代數,三角學,微積分先修課 (二次曲線論和極限) College: Differential and Integral Calculus, Differential Equations, Linear Algebra, Probability and Statistics, Discrete Math 大學:微積分,微分公式,線性代數,概率和統計,離散數學 How'd they come up with that particular list for high school, anyway? It's more or less the same courses in most U.S. high schools. I think it's very similar in other countries, too, except that their students have finished the list by the time they're nine years old. (Americans really kick butt at monster-truck competitions, though, so it's not a total loss.) 上面那個關於高中數學課程單子上所列的,怎麼來著?美國高中幾乎都是這樣的課程設置.我認為其他國家也會很相似的,除了那些在9歲之前就掌握了這些課程的學生.(美國小孩同時卻在熱衷於玩魔鬼卡車競賽,雖然如此,整個來說也算不上什麼大損失.) Algebra? Sure. No question. You need that. And a basic understanding of Cartesian geometry, too. Those are useful, and you can learn everything you need to know in a few months, give or take. But the rest of them? I think an introction to the basics might be useful, but spending a whole semester or year on them seems ridiculous. 代數?是的.沒問題.你需要代數.和一些理解解析幾何的知識.那些很有用,並且在以後幾個月里,你能學到一切你想要的,十拿九穩的.剩下的呢?我認為一個基本的介紹可能會有用,但是在這上面花整個學期或一年就顯得很荒謬了. I'm guessing the list was designed to prepare students for science and engineering professions. The math courses they teach in and high school don't help ready you for a career in programming, and the simple fact is that the number of programming jobs is rapidly outpacing the demand for all other engineering roles. 我現在意識到那個書單列表原是設計來准備給那些以後要當科學家和工程師的學生的.他們在高中里所教的數學課程並不是為你的編程生涯做准備的,簡單的事實是,多數的編程工作所需要的數學知識相比其他作為工程師角色的人所需要的數學增長的更快. And even if you're planning on being a scientist or an engineer, I've found it's much easier to learn and appreciate geometry and trig after you understand what exactly math is — where it came from, where it's going, what it's for. No need to dive right into memorizing geometric proofs and trigonometric identities. But that's exactly what high schools have you do. 即使你打算當一名科學家或者一名工程師,在你理解了什麼是數學之後-- 數學它如何而來,如何而去,為何而生,我發現這更加容易去學習和欣賞幾何學和三角學.不必去專研記住幾何上的證明和三角恆等式,雖然那確實是高中學校要求你必須去做的. So the list's no good anymore. Schools are teaching us the wrong math, and they're teaching it the wrong way. It's no wonder programmers think they don't need any math: most of the math we learned isn't helping us. 所以這樣的書單列表不再有什麼用了.學校教給我們的不是最合適的數學,並且方式也不對.不奇怪程序員認為他們不再需要數學:我們學的大部分數學知識對我們的工作沒什麼大的幫助. The Math They Didn't Teach You 他們沒有教給你的那部分數學 The math computer scientists use regularly, in real life, has very little overlap with the list above. For onething, most of the math you learn in grade school and high school is continuous: that is, math on the real numbers. For computer scientists, 95% or more of the interesting math is discrete: i.e., math on the integers. 在現實中,計算機科學家經常使用的數學,跟上面所列的數學僅有很小的重疊. 舉個例子,你在中學里學的大部分數學是連續性的:也就是說,那是作為實數的數學.而對於計算機科學家來說,他們所感興趣的95%也許更多的是離散性的:比如,關於整數的數學. I'm going to talk in a future blog about some key differences between computer science, software engineering, programming, hacking, and other oft-confused disciplines. I got the basic framework for these (upcoming) insights in no small part from Richard Gabriel's Patterns Of Software, so if you absolutely can't wait, go read that. It's a good book. 我打算在以後的博客中再談一些有關計算機科學,軟體工程,編程,搞些有趣的東東,和其他常常令人犯暈的訓練.我已經從Richard Gabriel的軟體的模式這本書中洞察到一個無關巨細的基本框架.如果你明顯的等不下去的話,去讀吧.是本不錯的書. For now, though, don't let the term "computer scientist" worry you. It sounds intimidating, but math isn't the exclusive purview of computer scientists; you can learn it all by yourself as a closet hacker, and be just as good (or better) at it than they are. Your background as a programmer will help keep you focused on the practical side of things. 到現在為止,不要讓"計算機科學家"這個詞困擾到你.它聽上去很可怕,其實數學不是計算機科學家所獨有的領域,你也能作為一個黑客自學它,並且能做的和他們一樣棒.你作為一個程序員的背景將會幫助你保持只關注那些有實踐性的部分. The math we use for modeling computational problems is, by and large, math on discrete integers. Thisis a generalization. If you're with me on today's blog, you'll be studying a little more math from now on than you were planning to before today, and you'll discover places where the generalization isn't true. But by then, a short time from now, you'll be confident enough to ignore all this and teach yourself math the way you want to learn it. 我們用來建立計算模型的,大體上是離散數學.這是普遍的做法.如果正好今天你在看這篇博客,從現在起你正了解到更多的數學,並且你會認識到那樣的普遍做法是不對的.從現在開始,你將有信心認為可以忽略這些,並以你想要的方式自學. For programmers, the most useful branch of discrete math is probability theory. It's the first thing they should teach you after arithmetic, in grade school. What's probability theory, you ask? Why, it's counting. How many ways are there to make a Full House in poker? Or a Royal Flush? Whenever you think ofa question that starts with "how many ways..." or "what are the odds...", it's a probability question. And as it happens (what are the odds?), it all just turns out to be "simple" counting. It starts with flipping acoin and goes from there. It's definitely the first thing they should teach you in grade school after you learn Basic Calculator Usage. 對程序員來說,最有效的離散數學的分支是概率理論.這是你在學校學完基本算術後的緊接著的課.你會問,什麼是概率理論呢?你就數啊,看有多少次出現滿堂彩?或者有多次是同花順. 不管你思考什麼問題如果是以"多少種途徑..."或"有多大幾率的...",那就是離散問題.當他發生時,都轉化成"簡單"的計數.拋個硬幣看看...? 毫無疑問在他們教你基本的計算用法後他們會教你概率理論. I still have my discrete math textbook from college. It's a bit heavyweight for a third-grader (maybe), but it does cover a lot of the math we use in "everyday" computer science and computer engineering. 我還保存著大學里的離散數學課本.可能他只佔了三分之一的課程,但是它卻涵蓋了我們幾乎每天計算機編程工作大部分所用到的數學. Oddly enough, my professor didn't tell me what it was for. Or I didn't hear. Or something. So I didn't pay very close attention: just enough to pass the course and forget this hateful topic forever, because I didn't think it had anything to do with programming. That happened in quite a few of my comp sci courses in college, maybe as many as 25% of them. Poor me! I had to figure out what was important on my own, later, the hard way. 也真是夠奇怪的,我的教授從沒告訴我數學是用來干嗎的.或者我也從來沒有聽說過.種種原因吧.所以我也從沒有給以足夠的注意:只是考試及格然後把他們都忘光,因為我不認為她還和編程有啥關系.事情變化是我在大學學完一些計算機科學的課程之後,也許是25%的課程.可憐啊!我必須弄明白什麼對於自己來說是最重要的,然後再是向深度發展. I think it would be nice if every math course spent a full week just introcing you to the subject, in themost fun way possible, so you know why the heck you're learning it. Heck, that's probably true for every course. 我想,如果每門數學課都花上整整一周的時間,而只是介紹讓你如何入門的話,那將非常不錯,這是最有意思的一種假設,那麼你知道了你正學習的對象是哪種怪物了.怪物,大概對每一門課都合適. Aside from probability and discrete math, there are a few other branches of mathematics that are potentially quite useful to programmers, and they usually don't teach them in school, unless you're a math minor. This list includes: 除了概率和離散數學外,還有不少其他的數學分支,可能對程序員相當的有用,學校通常不會教你的,除非你的輔修科目是數學.這些數目列表包括: Statistics, some of which is covered in my discrete math book, but it's really a discipline of its own. A pretty important one, too, but hopefully it needs no introction. 統計學,其中一些包括在我的離散數學課里,她的某些訓練只限於她自身.自然也是相當重要的,但想學的話不需要什麼特別的入門. Algebra and Linear Algebra (i.e., matrices). They should teach Linear Algebra immediately after algebra. It's pretty easy, and it's amazingly useful in all sorts of domains, including machine learning. 代數和線性代數(比如,矩陣).他們會在教完代數後立即教線性代數.這也簡單,這但相當多的領域非常有用,包括機器學習. Mathematical Logic. I have a really cool totally unreadable book on the subject by Stephen Kleene, the inventor of the Kleene closure and, as far as I know, Kleenex. Don't read that one. I swear I've tried 20 times, and never made it past chapter 2. If anyone has a recommendation for a better introction to this field, please post a comment. It's obviously important stuff, though. 數理邏輯.我有相當完整的關於這門學科的書沒有讀,是Stephen Kleene寫的,克林閉包的發明者,我所知道的還有就是Kleenex.這個就不要讀了.我發誓我已經嘗試了不下20次,卻從沒有讀完第二章.如果哪位牛掰有什麼更好的入門建議的話可以給我推薦.雖然,這明顯是非常重要的一部分. Information Theory and Kolmogorov Complexity. Weird, eh? I bet none of your high schools taught either of those. They're both pretty new. Information theory is (veeery roughly) about data compression, and Kolmogorov Complexity is (also roughly) about algorithmic complexity. I.e., how small you can you make it, how long will it take, how elegant can the program or data structure be, things like that. They're both fun, interesting and useful. 信息理論和柯爾莫戈洛夫復雜性理論.真不可思議,不是么?我敢打賭沒哪個高中會教你其中任何一門課程.她們都是新興的學科.信息理論是(相當相當相當相當難懂)關於數據壓縮,柯爾莫戈洛夫復雜性理論是(同樣非常難懂)關於演算法復雜度的.也就是說,你要把它壓縮的盡量小,你所要花費的時間也就變的越長,同樣的,程序或數據結構要變得多優雅也有同樣的代價.他們都很有趣,也很有用. There are others, of course, and some of the fields overlap. But it just goes to show: the math that you'll find useful is pretty different from the math your school thought would be useful. 當然,也有其他的一些因素,某些領域是重復的.也拿來說說吧:你所發現有用的那部分數學,不同於那些你在學校里認為有用的數學. What about calculus? Everyone teaches it, so it must be important, right? 那微積分呢?每個人都學它,所以它也一定是重要的,不對嗎?
㈣ 程序員需要怎樣的數學基礎
離散數學對程序員來說非常重要,還有組合數學、線性代數、概率論、數論等等,即使你將來不做研究,這些基礎知識也能極大地提高你的水平。計算機科學對離散數學的要求很高,建議你先學習前面提到的這些課程,然後學習計算機演算法和數據結構,再配合到網上的在線題庫做題,過程很艱辛,但是對你的幫助會很大。
推薦書目:
《具體數學》(先學完前面的數學課程,罩衫在水平有一定進步以後再看)
《演算法導論》(應該人手一本的好書)
簡單來說,學數學的目的,一方面是活躍你的思維;另一方面是為了深入學習演算法打基礎,設畢老想物數腔一下,同樣的問題,普通人的程序要幾十分鍾甚至幾小時幾天才能解決出來,甚至根本無法解決,而你精心設計的程序卻能在1秒內解決出來,這就是數學的魅力、演算法的魅力。
其實,一切取決於你是否想做一個高級程序員。如果你做體力活(其實一般編程別人都認為是體力活),那你可以不學,因為你用不到,但是,你要是做技術上的創新,做個很強的程序員,沒有數學的支持,很難。
你既然學習了C,c++,你也知道演算法的重要性,同樣一個問題,我用13行程序解決了,我的同學居然用了33行,因為他不懂的用數學。你要達到什麼高等,取決於你的數學修養。當然,要做一個普通的程序員就不用學習了。要挑戰自己,做個好的,優秀的,學習數學吧!
㈤ 有人說程序員在數學方面只會加減剩除就可以了是嗎
應該不是吧,程序員分很多種的,需要根據代碼,演算法解決不同問題。而且程序員的數學要求應該是比較高的。敗蠢學電子工程困滑類的大物都汪枯臘得很好。
㈥ 程序員必須掌握哪些演算法
集束搜索(又名定向搜索,BeamSearch)——最佳優先搜索演算法的優化。
A*搜尋演算法——圖形搜索演算法,是最佳優先搜索的範例,從給定起點到給定終點計算出路徑。
數據壓縮——採取特定編碼方案,使用更少的位元組數(或是其他信息承載單元)對信息編碼的過程,又叫來源編碼。
離散微分演算法(Discretedifferentiation)
哈希演算法(Hashing)
堆排序(Heaps)
合並排序(MergeSort)
梯度下降(Gradientdescent)——一種數學上的最優化演算法。
牛頓法(Newton'smethod)——求非線性方程(組)零點的一種重要的迭代法。
歐幾里得演算法(Euclideanalgorithm)——計算兩個整數的最大公約數。最古老的演算法之一,出現在公元前300前歐幾里得的《幾何原本》。
Buchberger演算法——一種數學演算法,可將其視為針對單變數最大公約數求解的歐碰慧幾里得演算法和線性系虧拆統中高斯消元法的泛化。
動態規劃演算法(DynamicProgramming)——展示互相覆蓋的子問題和最優子架構演算法。
Diffie-Hellman密鑰交換演算法——一種加密協議,允許雙方在事先不了解對方的情況下,在不安全的通信信道中,共同建立共享密鑰。該密鑰以後可與一個對稱密碼一起,加密後續通訊。
Dijkstra演算法——針對沒有負值權重邊的有向圖,計算其中的單一起點最短演算法。
二分查找(BinarySearch)——在線性數組中找特定值的演算法,每個步驟去掉一半不符合要求的數據。
合並查找演算法(Union-find)——給定一組元素,該演算法常常用來把這些元素分為多個分離的、彼此不重合的組。
期望-最大演算法(Expectation-maximizationalgorithm,又名EM-Training)——在統計計算中,期望-最大演算法在概率模型中尋找可能性最大的參數估算值,其中模型依賴於未發現的潛在變數。
快速傅里葉變換(FastFouriertransform,FFT)——計算離散的傅里葉變換(DFT)及其反轉。
最大流量演算法(Maximumflow)——該演算法試圖從一個流量網路中找到最大的流。
LLL演算法(Lenstra-Lenstra-Lovaszlatticerection)——以格規約(lattice)基數為輸入,輸出短正交向量基笑空答數。
兩次篩法(QuadraticSieve)——現代整數因子分解演算法,在實踐中,是目前已知第二快的此類演算法(僅次於數域篩法NumberFieldSieve)。
RANSAC——是「RANdomSAmpleConsensus」的縮寫。該演算法根據一系列觀察得到的數據,數據中包含異常值,估算一個數學模型的參數值。
求解線性方程組()——線性方程組是數學中最古老的問題,它們有很多應用,比如在數字信號處理、線性規劃中的估算和預測、數值分析中的非線性問題逼近等等。求解線性方程組,可以使用高斯—約當消去法(Gauss-Jordanelimination),或是柯列斯基分解(Choleskydecomposition)。
Q-learning學習演算法——這是一種通過學習動作值函數(action-valuefunction)完成的強化學習演算法,函數採取在給定狀態的給定動作,並計算出期望的效用價值,在此後遵循固定的策略。
Schönhage-Strassen演算法——在數學中,Schönhage-Strassen演算法是用來完成大整數的乘法的快速漸近演算法。其演算法復雜度為:O(Nlog(N)log(log(N))),該演算法使用了傅里葉變換。
RSA——公鑰加密演算法。首個適用於以簽名作為加密的演算法。RSA在電商行業中仍大規模使用,大家也相信它有足夠安全長度的公鑰。
Strukturtensor演算法——應用於模式識別領域,為所有像素找出一種計算方法,看看該像素是否處於同質區域(homogenousregion),看看它是否屬於邊緣,還是是一個頂點。
單純型演算法(SimplexAlgorithm)——在數學的優化理論中,單純型演算法是常用的技術,用來找到線性規劃問題的數值解。
奇異值分解(Singularvaluedecomposition,簡稱SVD)——在線性代數中,SVD是重要的實數或復數矩陣的分解方法,在信號處理和統計中有多種應用,比如計算矩陣的偽逆矩陣(以求解最小二乘法問題)、解決超定線性系統(overdeterminedlinearsystems)、矩陣逼近、數值天氣預報等等。
維特比演算法(Viterbialgorithm)——尋找隱藏狀態最有可能序列的動態規劃演算法,這種序列被稱為維特比路徑,其結果是一系列可以觀察到的事件,特別是在隱藏的Markov模型中。
㈦ 程序員需要怎樣的數學基礎
LZ不要杞人憂天了,那些說數學重要的,首先數學你會嗎?數學包含的范疇太多了,常見的有高等幾何 微積分 線性代數 概率論 離散數學 數論 圖論等等你指的是具體哪一樣呢?就算是前人科學巨匠泰鬥牛頓,毆幾里德,愛因斯坦,他也只是擅長自己從事的那領域,要說所有數學領域都精通我想他們也不敢吹這樣的牛逼。
所以對大多數人來說,在數學方面都不太可能取得什麼很深的造詣。等到你所謂的把數學學好,那鬍子都快白完了,數學是又深奧又費解學習成本巨大需要耗費大量時間學完不用立馬就忘的學科。所以說數學重要,先問問你自己能不能學會。
其次,計算機學科跟數學根本就不是一門學科, 包含內容極其有限。計算機編程有自己的理論知識體系,很多跟數學關系不大。學好編程尤其對新手來說最重要的是對你學的編程語言的熟練運用和工具SDK的爛熟於心。每個語言都有自己獨特的設計理念,不存在什麼好學的編程語言。
所以說,題主, 你想得太遠了。軟體開發需要用到的知識比數學重要的太多了。拋開計算機不說,英語比起數學的重要性就大的多的多。英語不好你看不懂函數API說明你一切就是白瞎。而數學對於大多數人來說是最難學也是最不重要的知識,基本上是學了就忘忘了就扔扔了也沒感覺的那種,很多搞編程的可能一輩子也用不到數學知識。拍兄為什麼?理解C++的指針和多態需要數學嗎?一個復雜的系統架構也不需要半點數學知識,而你就是看不懂。
還有就是程序調試技術,很多IDE給出的出錯語句非常費解,什麼指針為輪銀空,數組越界,內存溢出,SDK找不到, 你沒經驗時打死你也看不懂你的編程工具提示的是什麼。這時你那高大上的數學真是P用沒有,它能幫你排查錯誤找出程序崩掉的原因嗎?我看不行吧,你還是得到論壇網路去問人家這些基本的問題。
在你擔心數學好不好之前,你更應該關心編程環境怎麼搭建,連IDE都搞不定不知道程序怎麼跑起來你還搞什麼呀,下一步就是程序基本的語法和SDK庫函數的掌握,基本SDK都不知道什麼意思怎麼去用,如字元串函數,文件讀寫和資料庫常用操作,這些你都不會你還有學下去的必要嗎?還有更重要的更基本的程序調試技術,程序老出錯老崩潰怎麼辦呀,哪裡變數為空了內存寫錯了?為什麼程序老編不過去呀,誰能幫幫我呀!!!這個時候你發現那牛逼的數學知識真是屁用沒有,你還是感嘆自己基本功底不行經驗太少,這個時候打死你也臘賀宴不會再關心數學好不好的問題了。
如果說用到數學的大概只有3D游戲引擎,很智能的人工智慧,如格鬥游戲的電腦應對玩家的復雜AI,生化危機中僵屍怪物的配合商量運用策略包抄玩家和記憶功能,還有航空航天領域這樣高精尖技術學科才會用到復雜一點的數學知識。而這些都是計算機專家才要掌握的內容。所以題主你是想多了,還是先關心下自己程序為什麼編不過老是報錯的問題吧
㈧ 程序員的數學-讀書筆記
計數法分為 按位計數法 和 羅馬計數法
按位計數法常用的有2進制、8進制、10進制、16進制等幾種。
理論上多少進制在數學上都可以存在,瑪雅人用20進制,巴比倫人用10進制和60進制的混合計數法。瑪雅人20進制可能冊敏是和手腳趾加起來的數量有關。巴比倫人採用60進制也可能是因為記錄數字的黏土版比較難記錄文字記號,為了在大數的書寫上少佔位便採用了60進制。
從這一點來看,環境對文明和文化的形成真的是有決定性的影響。假如巴比倫人掌握了造紙術或者在竹子上書寫文字的話,60進制這種違反人類天性的計數方法一定不會出現。話說,漢莫拉比法典就是寫在黑色的玄武岩上的。能夠記錄的文字也就屈指可數吧。
作者提到了其實人也是可以採用2進制計數法的,可是同樣大小的數字用2進制書寫起來位數太多,一來書寫不方便,二來計算時易發生馬虎出現錯誤。而10進制的數天生就是順老搜應人類人性的,即使是幼侍姿歷兒也可以通過數手指頭的方式來計數。
相反對於計算機的物理構造來講,0代表開關斷開,1代表開關連接,這種二極體的物理限制正好決定了計算機較為適用2進制。不過如果你想做出一個10進制的計算機也不是沒有可能的。
這一章比較有趣的是羅馬計數法,我以前也沒有接觸過超過20的羅馬數字,也不知道羅馬數字各個數位上的數字相加之和為數字本身所代表的量。例如:
反觀阿拉伯數字
由此引發作者在兩個程序領域上的思考:
關鍵詞:真值表、文氏圖、邏輯表達式、卡諾圖、三值邏輯、完整性、排他性
- 能夠判斷對錯的陳述句叫做命題(proposition)
邏輯非 --不是A
逆命題
逆否命題
德摩根定律
卡諾圖 (二燈游戲、三燈游戲引出)
未定義邏輯(undefined)
三值邏輯的德摩根定律
本章探討的是通過余數來解決存在規律、周期性的問題。通過規律和周期性的重復,將大問題簡化成容易解決的小問題。
首先作者通過解決星期幾問題,引入了余數的思考概念。
上面的問題在 大問題通過余數規律簡化為小問題 這個方法上表現的還不明顯,於是引入了第三個問題:1234567^7654321的個位數是多少。
以上三個問題是小學奧賽便涉及到的問題,然而其思想在解決真實面對的復雜問題或具象的實際問題時卻很好用。
將一個數字除以2,他的余數應該為0或者1二者之一。我們也可以叫 奇偶問題 。
書中有幾個案例:
這樣分析過來就很好解決七橋問題,確定每個點所連接的橋的點數,與上述結論做對比。
A點為3,B點為,C點為3,D點為3.
由此可以得出七橋問題不可能實現。這個問題的解決也是通過奇偶性來解決的。
作者舉了高斯求和的故事來講如何用數學歸納法來解決無窮數列的求和問題。
兩個小例子便是從0開始到N的和,以及1開始的奇數和。
數學歸納法 是證明[ 有關整數的斷言對於0以上的所有整數(0,1,2...)是否成立 ]所用的方法。
證明方法歸結為兩歩:
根據上述方法,假若某個假設成立,那麼P(0)成立,因為P(0)成立,所以P(0+1)即P(1)也成立。反復如此,對於無窮數列遵守這個規律的證明,就像多米諾骨牌,推到第一個,後面的都會按照第一個的規則倒下去。
然而要避免整個證明出錯,就要重視第二個步驟,也就是歸納。歸納在證明時一定要考慮 是否在所有定義條件下均成立 ,尤其要注意的是在P(0)的條件下是否實現。
課後對話很有意思:
計數是人類每天生活都要運用的方法。
計數的關鍵就在於 注意「遺漏」和「重復」
例如:
綜上,在計數時要發現事物的規則。
要 認清計數對象的本質
要 認清計數對象的本質
要 認清計數對象的本質
重要的事情說三遍。
將計數對象進行 歸納總結 ,使其作為普通規則來掌握。這樣一般不容易出錯。
接下來,作者在 加法法則 里寫到:
乘法法則 的概念比較有意思。
接下來,本章提到了置換、排列、組合3個概念。以下是幾個小例子。
最後提到的 重復組合 里的思考問題比較有趣。
解答的思想是:
這是一種典型的將復雜問題簡單化,並規律化的解答方法。
最後還是要強調下:
要 認清計數對象的本質
遞歸與歸納的區別
歸納(inctive) 是從個別性前提推出一般性結論。
本質上都是 將復雜問題簡化 ,但方向不同。
個人理解是
遞歸是發現第n項和前一兩項之間的關系,實證確定後,往回不斷遞推的一種個別性結論。
即這個結論不是在n為任何自然數時都成立的。需要注意n為0和1的兩項。
通過遞歸解決問題的線路是: 找到遞歸結構——建立遞推公式——找到解析式(只帶n的式子) ,如果不能以解析式的方式描述遞歸結構,也可以用遞推公式的方法描述。如下圖所示的漢諾塔的遞推公式:(它也可以描述成解析式的方式)
歸納所謂的個別性前提是指
斐波那契數列就是運用了遞歸的思想。通過研究和思考復雜問題,抓住事務本質,得到f(n)=f(n-1)+f(n-2)
所以當我們想要用遞歸的方法解決問題時,注意思考第n元素與前後元素的關系。由一個點推開,成一條貫穿始終的線。
利用帕斯卡三角形來研究Cnk=Cn-1(k-1) + Cn-1k的思考方式另闢蹊徑。將兩個加數假設成組合問題里含一個元素和不含那個元素的兩個情況。從而證明了式子。利用的便是組合的數學分析法。(這句話組合的意思不是數學意義上的)。
所以以上將復雜問題簡化的方法是遞歸解法之一,是為了在復雜問題中找到隱含的遞歸結構。其思路是:
通過思考一張1mm的紙,折多少次能夠有地月距離那麼厚,作者引出指數的概念。
這一章的內容比較簡單,對於 指數爆炸 大家應該都不陌生。而 對數 估計也很熟悉。之前接觸到的漢諾塔問題的解析式和斐波那契數列都屬於指數的范疇。
然而在解決 測試所有設定選項的程序時,檢查次數也是一個指數問題 。所以我們應該如何輕松的解決這類問題呢?
利用二分法查找
利用二分法,先詢問最中間的人,如果在左邊,就繼續在左邊的范圍內重復此項方法,直到找到罪犯。這便被稱為 2分法 。他和漢諾塔的解析式如出一轍,可以利用指數原理經過很少的步驟便可找到目標。
二分法本身也是 遞歸結構 ,經過n次詢問,可以在2^n-1人中確定目標。每判斷一次就可以查找近一半的對象。
二分法需要注意的是,所有元素一定要 按順序排列 ,這點至關重要。
指數思想也被用於加密的實現中。因為每多加密一位,暴力破解就需要指數次的運算能力的提升。原則上有限時間里根本不可能破解。指數以其數字的巨大增長能力在加密領域有基本性的作用。
對於指數問題的解決方法,主要有4種,但均不太容易應付規模大的數字。
作為指數函數的逆函數,文章涉及了對數。同時也簡單介紹了古代科學家用過的計算尺。
無窮可以分為 可數無窮 和 不可數無窮 。
所謂 可數無窮 是指 可以按照一定的規律或者表達方式來表達 。
即集合中所有元素都與正整數一一對應。如果每一個元素都可以與1.2.3....等數字對應,也就是說可以按規律表達出來就是可數無窮。
例如:
所以有不可數的集合嗎?
此時運用到了 對角論證法 和 反證法(也叫歸謬法)
假設我們要證明 所有整數數列的集合是不可數的 ,那麼反證就是 假設所有整數數列的集合是可數的 ,此處是運用的反證法。
現在我們按下圖的方式來列出所有整數數列,編號為k的整數列在表的k行。
如果按照圖中第k行的第k個元素ak單獨組出一組數列{a1,a2,a3......}的話,他也是應該包含在所有整數數列里的,然而並沒有,他是游離在所有整數數列之外的。此處得出矛盾,說明命題錯誤,命題 所有整數數列的集合是不可數的 為真。此方法被稱為 對角論證法
除此之外
-所有實數的集合是不可數的
-所有函數的集合也是不可數的
隨後書中討論到了不可解的問題
對於不可解的問題的定義是
事實上,不能寫成程序的函數是存在的。
有些函數不能用文字表達,而且要寫成程序的函數必須 嚴謹定義確切和文字表達 兩個概念。
停機問題
不可解問題的一例。定義是
有限時間並不指時間長短,而是指無論耗時多長,只要能有終止的一刻就好。
事實上,程序本身並不能判斷某一程序是否可以在有限時間內結束運行
所以停機問題也是 不可解問題 之一。
這一章是對之前8章的回顧和總結。
前幾章作者分別對 0的意義、邏輯、余數、數學歸納、排列組合、遞歸、指數爆炸、不可解問題 進行了簡單的介紹和探討。其實所有的章節最後都是在引領讀者產生如何解決問題的思考。
1.認清模式,進行抽象化
2.由不擅長催生出的智慧
3.幻想法則
本書比較適合作為第一本接觸演算法的書籍。目前開始在上 Khan的Algorithms ,9月份跟上 coursera的Algorithms Part I 的開課。
前方的路註定不好走,但是要慢慢嘗試和堅持。
㈨ 程序員必須掌握哪些演算法
一.基本演算法:
枚舉. (poj1753,poj2965)
貪心(poj1328,poj2109,poj2586)
遞歸和分治法.
遞推.
構造法.(poj3295)
模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
圖的深度優先遍歷和廣度優先遍歷.
最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓撲排序 (poj1094)
二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.數據結構.
串 (poj1035,poj3080,poj1936)
排序(快排、歸並排(與逆序數有關)、堆排) (poj2388,poj2299)
簡單並查集的應用洞盯.
哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼樹(poj3253)
堆
trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜索
深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
背包問題. (poj1837,poj1276)
型如下表的簡單DP(可參考lrj的書 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關系.
(POJ3252,poj1850,poj1019,poj1942)
數論.
1.素數與整除問題
2.進制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
計算方法.
1.二分法求解單調函數相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
幾何公式.
叉積和點積的運用(如線段相交的判哪顫頌定,點到線段的距離等). (poj2031,poj1039)
多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)
中級(校賽壓軸及省賽中等難度):
一.基本演算法:
C++的標准模版庫的應用. (poj3096,poj3007)
較為復雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
差分約束系統的建立和求解. (poj1201,poj2983)
最小費用最大流(poj2516,poj2516,poj2195)
雙連通分量(poj2942)
強連通李鄭分支及其縮點.(poj2186)
圖的割邊和割點(poj3352)
最小割模型、網路流規約(poj3308)
三.數據結構.
線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
靜態二叉檢索樹. (poj2482,poj2352)
樹狀樹組(poj1195,poj3321)
RMQ. (poj3264,poj3368)
並查集的高級應用. (poj1703,2492)
KMP演算法. (poj1961,poj2406)
四.搜索
最優化剪枝和可行性剪枝
搜索的技巧和優化 (poj3411,poj1724)
記憶化搜索(poj3373,poj1691)
五.動態規劃
較為復雜的動態規劃(如動態規劃解特別的旅行商TSP問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關系和母函數.
數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴展的歐幾里德(中國剩餘定理) (poj3101)
計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
隨機化演算法(poj3318,poj2454)
雜題(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
坐標離散化.
掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用)
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
多邊形的內核(半平面交)(poj3130,poj3335)
幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高級(regional中等難度):
一.基本演算法要求:
代碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
保證正確性和高效性. poj3434
二.圖演算法:
度限制最小生成樹和第K最短路. (poj1639)
最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
最優比率生成樹. (poj2728)
最小樹形圖(poj3164)
次小生成樹.
無向圖、有向圖的最小環
三.數據結構.
trie圖的建立和應用. (poj2778)
LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 在線演算法(RMQ+dfs)).(poj1330)
雙端隊列和它的應用(維護一個單調的隊列,常常在動態規劃中起到優化狀態轉移的目的). (poj2823)
左偏樹(可合並堆).
後綴樹(非常有用的數據結構,也是賽區考題的熱點).(poj3415,poj3294)
四.搜索
較麻煩的搜索題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
廣搜的狀態優化:利用M進制數存儲狀態、轉化為串用hash表判重、按位壓縮存儲狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
深搜的優化:盡量用位運算、一定要加剪枝、函數參數盡可能少、層數不易過大、可以考慮雙向搜索或者是輪換搜索、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
需要用數據結構優化的動態規劃.(poj2754,poj3378,poj3017)
四邊形不等式理論.
較難的狀態DP(poj3133)
六.數學
組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關系理論.
博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
半平面求交(poj3384,poj2540)
可視圖的建立(poj2966)
點集最小圓覆蓋.
對踵點(poj2079)
㈩ 做一個程序員數學不好怎麼辦
一般做演算法方面的事情,對程序員數學方面的要求就會高一些;但如果是做一名的普通程序員其實對數學的要求沒那麼高,很多初、高中生的學歷,0基礎也可以學開發,將來一樣能做程序員。而且,像變數這種知識點比較簡單也比較大睜基礎,都涉及不到太深的數學方面的東西。所以,我覺得也許是你對變數這個知識點飢仿弊可能掌握得不是那麼好。學習開發,學習方法也很重要,這塊兒咱們可以私信交流。另外,學習上總會遇到各種各樣的問題,不管你學開發還是學其它的什麼,要放平心態,心態不能崩;放棄是件很容易的事情,但只有堅持爛族下來,你才有可能成為一名優秀的程序員。加油!