中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

如何學(xué)習(xí)編程

  (一)

  終于還是要寫(xiě)這種文章了。期末考試將至,寫(xiě)大程序沒(méi)時(shí)間,寫(xiě)小程序沒(méi)動(dòng)力,只要演變成寫(xiě)文章了。之前的兩篇字符串處理寫(xiě)完了仍然不過(guò)癮,打算繼續(xù)寫(xiě)關(guān)于遞歸下降法和LALR的事。后來(lái)想想還是暫時(shí)寫(xiě)寫(xiě)關(guān)于如何學(xué)習(xí)編程的好,畢竟這個(gè)問(wèn)題對(duì)大家來(lái)說(shuō)更加有益。

  本篇將是一個(gè)系列,重點(diǎn)講述在外力很少的情況下如何自學(xué)編程,以及需要注意的一些地方。

  一般來(lái)說(shuō),一些所謂的『高手』或者老師會(huì)告訴人們算法是非常非常重要,以至于會(huì)不會(huì)算法就是你會(huì)不會(huì)編程的唯一標(biāo)準(zhǔn)。不過(guò)事實(shí)上并非如此。掌握算法固然是好,只是大部分程序并不需要高深的算法,而且招人的時(shí)候僅僅要求會(huì)算法的公司也是很少的(而且很難進(jìn))。我并不是學(xué)院派的人,所以雖然我本人也推崇學(xué)習(xí)算法,但并不推崇一開(kāi)始就學(xué)習(xí)算法。

  剛開(kāi)始學(xué)編程的人總是不知道自己應(yīng)該從哪里入手。實(shí)際上這是一個(gè)相當(dāng)重要的問(wèn)題。在我看來(lái),學(xué)好編程有若干條件:

  • 興趣
  • 數(shù)學(xué)/英語(yǔ)
  • 財(cái)力

  首先談一談興趣。那些為了生計(jì)而尋找捷徑學(xué)習(xí)編程的人并不在本篇的考慮范圍之內(nèi),這些人我通常是不管的。興趣是非常重要的一個(gè)條件,但是興趣也是可以培養(yǎng)的。對(duì)編程的濃厚興趣可以讓自己自發(fā)地尋找各種各樣的書(shū)籍,發(fā)現(xiàn)自己知識(shí)結(jié)構(gòu)上的弱點(diǎn),跟同行有效地進(jìn)行交流等等。那些沒(méi)有興趣的人遇到了一個(gè)問(wèn)題只會(huì)上論壇或者QQ群上要代碼(而且多數(shù)脾氣暴躁)。

  數(shù)學(xué)和英語(yǔ)在一開(kāi)始并沒(méi)有什么影響,但是在你學(xué)有所成之后,開(kāi)始接觸復(fù)雜的內(nèi)容的時(shí)候,數(shù)學(xué)能力就開(kāi)始起作用了。很多計(jì)算機(jī)論文都是使用數(shù)學(xué)語(yǔ)言寫(xiě)的,對(duì)數(shù)學(xué)沒(méi)有熱情或者不夠敏感的人將會(huì)很難跨過(guò)這個(gè)門(mén)檻學(xué)習(xí)一些書(shū)本上沒(méi)有的東西。英語(yǔ)同樣也是重要的,因?yàn)椴⒉皇撬械奈恼禄驎?shū)籍都會(huì)翻譯成中文,或者及時(shí)翻譯成中文。

  財(cái)力并不是重點(diǎn),不過(guò)至少在養(yǎng)活自己的同時(shí)要有閑散資金來(lái)不停地支付網(wǎng)絡(luò)費(fèi)用、書(shū)籍、電腦、外圍設(shè)備等必須物品。

  至于知識(shí)結(jié)構(gòu)方面我個(gè)人的見(jiàn)解可能跟流行的觀點(diǎn)有所出入。目前人們總是把知識(shí)結(jié)構(gòu)比喻為一個(gè)金字塔,最下面是基礎(chǔ),上面一層一層更加深入而且更加專(zhuān)業(yè)的知識(shí),最上是領(lǐng)域知識(shí)。老師們會(huì)說(shuō)要學(xué)好基礎(chǔ),首先學(xué)好語(yǔ)言和算法,然后慢慢往上走。我自己并不這么認(rèn)為。個(gè)人認(rèn)為『從左到右』的學(xué)習(xí)方法是更加有效而且不會(huì)錯(cuò)過(guò)什么東西的,只是不能速成。

  從左到右是什么意思呢?想象一個(gè)金字塔,最左邊仍然是最底層的【基礎(chǔ)】,再往左就涉及到更多的【基礎(chǔ)】以及更多的上層內(nèi)容了。這樣一步一步下去就會(huì)有【基礎(chǔ)】--【上層】--【基礎(chǔ)】--【上層】這樣的不斷循環(huán)。這么做的好處是成果快,能夠培養(yǎng)起興趣和成就感,而且基礎(chǔ)隨著應(yīng)用的需要慢慢積累,等到學(xué)有所成的時(shí)候,基礎(chǔ)也覆蓋完了,上層的東西也看得差不多了,就可以超越金字塔自己翱翔了。

  好了,那么如何培養(yǎng)興趣呢?

  人總是對(duì)有趣的東西比較感興趣的,而且這種東西如果不難入門(mén)的話,那么接受起來(lái)更加容易,跟容易培養(yǎng)成就感,也就更有興趣了。根據(jù)實(shí)際情況,個(gè)人推薦剛開(kāi)始接觸的時(shí)候應(yīng)該學(xué)習(xí)C#,理由如下:

  • C#的書(shū)籍非常多,語(yǔ)言?xún)?nèi)核簡(jiǎn)單易懂,類(lèi)庫(kù)豐富。
  • C#制作界面簡(jiǎn)單
  • C#屏蔽了有關(guān)操作系統(tǒng)和底層的大部分事情,可以讓學(xué)習(xí)的人專(zhuān)注于自己感興趣的內(nèi)容。

  如果不是特別著急的話,一開(kāi)始就對(duì)著C/C++的數(shù)組啊指針啊什么亂七八糟的東西我覺(jué)得沒(méi)什么必要,反正將來(lái)自然就知道了。我在這里推薦C#的另一個(gè)重要原因是Microsoft Visual Studio .NET的C#編輯器有一個(gè)無(wú)敵美好的提示列表(按了一個(gè)“.”之后彈出來(lái)的),這對(duì)于初學(xué)者來(lái)說(shuō)是相當(dāng)好的一個(gè)工具。

  一開(kāi)始學(xué)習(xí)C#的時(shí)候應(yīng)該首先掌握基本的少量語(yǔ)法,也就是說(shuō)掌握條件語(yǔ)句、分支語(yǔ)句、函數(shù)聲明以及數(shù)組,外加少量庫(kù)的運(yùn)用以及計(jì)算上的知識(shí)。然后開(kāi)始學(xué)習(xí)制作界面,最后學(xué)GDI+。

  學(xué)習(xí)GDI+是有很多好處的。不過(guò)在學(xué)習(xí)之前應(yīng)該找本相關(guān)的書(shū)來(lái)看。GDI+有一些比較高級(jí)的功能如半透明效果和畫(huà)刷等等,容易組合出一些非常漂亮的圖形來(lái)。學(xué)會(huì)GDI+的基本操作之后,就可以慢慢接觸一些圖形濾鏡、分形、三維的內(nèi)容了。使用平面工具繪制簡(jiǎn)單的三維圖形是一件非常有意思的事情,而且非常鍛煉數(shù)學(xué)能力,所得到的效果也是『令人震撼』的。

  隨后應(yīng)該學(xué)習(xí)字符串處理。典型的字符串處理有分析INI文件、對(duì)一個(gè)四則運(yùn)算式子進(jìn)行操作等等的內(nèi)容。雖然C#處理器字符串出來(lái)比C++稍微蹩腳一點(diǎn),不過(guò)在這個(gè)時(shí)候忽略這個(gè)問(wèn)題是相當(dāng)有用的,至少不用陷入無(wú)窮的指針?shù)鰷u里面去。

  等圖形和字符串都少有涉獵之后,就可以開(kāi)始開(kāi)發(fā)有趣的程序了。譬如用C#些動(dòng)畫(huà)、開(kāi)發(fā)畫(huà)函數(shù)圖的工具、自己設(shè)計(jì)一種高度簡(jiǎn)化的HTML然后進(jìn)行渲染制作自己的幫助程序、或者開(kāi)發(fā)簡(jiǎn)單的圖像處理軟件之類(lèi)。稍微聰明一點(diǎn)的人,如果每天都有機(jī)會(huì)寫(xiě)很多代碼的話,大概半年到一年就可以走到這里了。

  為什么我會(huì)選擇圖形和字符串兩種東西呢?為了培養(yǎng)興趣,首先要有成就感。圖形跟字符串都是跟操作系統(tǒng)本身沒(méi)關(guān)系的東西,而且操作起來(lái)也沒(méi)什么注意事項(xiàng),因此入門(mén)比較簡(jiǎn)單。如果漸漸深入的話會(huì)激發(fā)起學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)、算法、甚至是數(shù)學(xué)英語(yǔ)的熱情。如果可以使用這條主線貫穿整個(gè)編程的初級(jí)階段的話,得到的將會(huì)是扎實(shí)的基礎(chǔ)以及靈活的頭腦。

  好了,今天就先說(shuō)到這里。下次再寫(xiě)續(xù)篇。在此解答一下大家有可能提出來(lái)的疑問(wèn)。

  · 數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)都很熱門(mén),要不要學(xué)呢?
  -- 這兩門(mén)技術(shù)掌握了也是很好的一件事情,而且作為入門(mén)的話也未嘗不可。只是如果一開(kāi)始就往數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)的路走的話,將來(lái)可能會(huì)錯(cuò)過(guò)一些學(xué)習(xí)操作系統(tǒng)底層以及復(fù)雜的算法的機(jī)會(huì),因?yàn)檫@兩種東西不會(huì)讓你有學(xué)習(xí)大部分有深度的知識(shí)的動(dòng)力。

  · 算法為什么不一開(kāi)始學(xué)習(xí)呢?
  -- 學(xué)會(huì)了算法,但是沒(méi)有有趣問(wèn)題給你解決的話,那學(xué)來(lái)干什么?而且學(xué)習(xí)算法的最終目的是讓自己擁有設(shè)計(jì)算法的能力,很多人都忽略了這一點(diǎn)。

  · 學(xué)會(huì)了GDI+和字符串之后能不能找工作呢?
  -- 不能。做人切勿急躁,學(xué)編程沒(méi)有個(gè)三五年還是不要把自己看得太厲害的好。

  · 接下來(lái)應(yīng)該學(xué)習(xí)什么樣的東西呢?

  -- 請(qǐng)看下一篇文章

  (二)

  接著上一篇文章繼續(xù)往下講。如果按照上一篇文章走下去的話,現(xiàn)在估計(jì)做了有些小軟件了吧。字符串和圖形都容易做大,而且對(duì)于潛意識(shí)上喜歡數(shù)學(xué)的最有希望的程序員們也是有吸引力的。但是這兩種東西卻不容易做好。等到程序到了一定規(guī)模的時(shí)候,維護(hù)和效率這兩大問(wèn)題就會(huì)凸顯出來(lái)。心急吃不了熱豆腐,為了解決維護(hù)和效率這兩個(gè)經(jīng)常會(huì)出現(xiàn)的問(wèn)題,我們需要學(xué)習(xí)算法和架構(gòu)。這兩種東西是可以同時(shí)學(xué)的,但是一篇文章說(shuō)不了多少東西,那么就從算法開(kāi)始吧。

  程序員是需要開(kāi)闊眼界的,光C#一門(mén)也是不行的,畢竟程序運(yùn)行在各種平臺(tái)上,有各種各樣的語(yǔ)言。譬如Win32上的native C/C++、Delphi等,.NET上的C#和VB.NET,還有自成體系的Java,然后就是運(yùn)行在mainframe上的COBOL,剩下的還有各種各樣的函數(shù)式語(yǔ)言、腳本語(yǔ)言等等。熟悉了C#的人從Delphi入手不會(huì)很困難,從C/C++入手也可以了。這兩門(mén)原本是本地語(yǔ)言的語(yǔ)言在編寫(xiě)程序的時(shí)候需要我們注意多一些的東西,典型的就是內(nèi)存管理。這還是需要多加練習(xí)的,在這里就不多說(shuō)了。

  說(shuō)到算法,在這里首先向大家推薦《算法導(dǎo)論》第二版。一年前我去買(mǎi)的時(shí)候,發(fā)現(xiàn)了中文版,但是中文版那個(gè)時(shí)候仍然有一些章節(jié)沒(méi)有翻譯。不知道現(xiàn)在怎么樣了。英語(yǔ)好的同志們可以去買(mǎi)英文版。

  算法與數(shù)據(jù)結(jié)構(gòu)是經(jīng)常出現(xiàn)在一起的。每一種算法總會(huì)有在各種不同數(shù)據(jù)結(jié)構(gòu)上的實(shí)現(xiàn),用于處理不同的問(wèn)題。在不同的語(yǔ)言上面,各種各樣針對(duì)實(shí)際問(wèn)題的數(shù)據(jù)結(jié)構(gòu)也有一些巧妙的做法和通用的做法。我們可以用STL,可以用System.Collections.Generic,也可以自己寫(xiě)。這根據(jù)實(shí)際情況而定。我們并不是不能做的比STL好,只是STL已經(jīng)相當(dāng)好了,滿足了大多數(shù)人的需要。在特定的情況下,面對(duì)非常特殊的問(wèn)題,有時(shí)候我們就要自己實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)。使用上一篇文章說(shuō)的辦法來(lái)聯(lián)系的話,到了這個(gè)時(shí)候已經(jīng)寫(xiě)了不少代碼了,用了不少并不復(fù)雜的數(shù)學(xué)知識(shí)了,鍛煉了理論與實(shí)際相聯(lián)系的基礎(chǔ)。有了這些基礎(chǔ),我們學(xué)習(xí)算法和數(shù)據(jù)結(jié)構(gòu)會(huì)比較簡(jiǎn)單。

  常用的數(shù)據(jù)結(jié)構(gòu)有鏈表、列表、堆棧、隊(duì)列、二叉樹(shù)、平衡樹(shù)、堆、哈希表和圖等,除此之外還有各種各樣的變形,但是萬(wàn)變不離其宗。圍繞著這些數(shù)據(jù)結(jié)構(gòu)還有各種各樣的算法。典型的有排序算法、搜索算法、尋路算法、網(wǎng)絡(luò)流等等。還有一些屬于策略的算法,譬如貪心算法、動(dòng)態(tài)規(guī)劃等等。屬于策略的算法經(jīng)常用于制造新的算法,要慢慢體會(huì),勤加思考才行。至于這些數(shù)據(jù)結(jié)構(gòu)和算法的實(shí)際內(nèi)容我并不打算在這篇文章講。《算法導(dǎo)論》用了半本書(shū)來(lái)說(shuō)這些問(wèn)題,還是看書(shū)的好,文章不夠詳細(xì)。

  至于我們?nèi)绾芜x擇算法呢?就如同我剛才強(qiáng)調(diào)的一樣,我們需要聯(lián)系理論與實(shí)際的經(jīng)驗(yàn),我們要用數(shù)學(xué)的眼光來(lái)看待我們需要解決的問(wèn)題。如果我們找到了一種簡(jiǎn)潔的表示來(lái)描述我們的問(wèn)題的話,我們同時(shí)也找到了解決問(wèn)題需要的數(shù)據(jù)結(jié)構(gòu)的雛形。當(dāng)然這個(gè)數(shù)學(xué)并不是指數(shù)學(xué)分析這些,我覺(jué)得更接近于抽象代數(shù)。扯遠(yuǎn)了啊,一般來(lái)說(shuō)我們并不需要鉆研這些學(xué)科,我們只需要有感覺(jué)就好了。培養(yǎng)感覺(jué)的一個(gè)捷徑就是學(xué)習(xí)數(shù)學(xué)。當(dāng)然不學(xué)習(xí)也可以,經(jīng)驗(yàn)也能知道我們做事情,只不過(guò)走的路要長(zhǎng)一些。至于讀者希不希望學(xué)習(xí)數(shù)學(xué)就自己決定吧,沒(méi)有普適的道路。找到了數(shù)據(jù)結(jié)構(gòu)的雛形之后,剩下的就是尋找算法了。有一些算法可以在書(shū)里面找到(譬如ACM很喜歡考的題目),有一些算法可以在論文中找到(譬如專(zhuān)門(mén)為了對(duì)付一些復(fù)雜問(wèn)題而制造出來(lái)的不具有通用性的算法),剩下的就要靠我們自己去推導(dǎo)了。

  那么,我們?nèi)绾螌W(xué)習(xí)算法呢?我們是為了解決實(shí)際問(wèn)題才學(xué)習(xí)算法的,是為了為將來(lái)自己遇到問(wèn)題的時(shí)候有個(gè)指導(dǎo)方向才學(xué)習(xí)算法的,我們并不是為了學(xué)習(xí)算法而學(xué)習(xí)算法。我見(jiàn)過(guò)兩種不同的學(xué)習(xí)算法的人。第一種是直覺(jué)閱讀算法并學(xué)習(xí),以后碰到問(wèn)題再尋找。另一種則是僅僅將算法稍微了解一下然后就放開(kāi),以后遇到問(wèn)題的時(shí)候再翻開(kāi)相應(yīng)的算法來(lái)學(xué)習(xí)。兩種方法適應(yīng)于兩種不同的人,并沒(méi)有什么大的優(yōu)劣之分。于是我們根據(jù)自己的興趣或者需要,終于必須掌握一種算法了。那么這個(gè)時(shí)候我們可以找資料來(lái)看,就跟閱讀文章一樣消化里面的知識(shí),然后就寫(xiě)一些小程序來(lái)試驗(yàn)試驗(yàn)(或者叫做原型,那些做軟件工程的人都喜歡這么說(shuō))。這種小程序?qū)儆趻仐壭驮停瑢?xiě)完即扔的,目的是為了讓自己在了解了算法的內(nèi)容之后,檢驗(yàn)一下自己是否已經(jīng)真的明白了執(zhí)行這個(gè)算法所需要的所有細(xì)節(jié)問(wèn)題。等到覺(jué)得自己已經(jīng)能控制這個(gè)算法的時(shí)候,我想也就差不多了吧。

  有些人可能會(huì)覺(jué)得算法很復(fù)雜,因?yàn)闀?shū)里面的算法都是非常復(fù)雜的。但是算法的目的是為了快,因此有一些好的算法跟數(shù)據(jù)結(jié)構(gòu)結(jié)合的時(shí)候可能會(huì)變得相當(dāng)簡(jiǎn)單,但是并不是很容易想到。在這里我舉幾個(gè)簡(jiǎn)單的例子。

  喜歡做圖形的朋友們,大概都喜歡做游戲吧,嘿嘿。我們小時(shí)候在做那種簡(jiǎn)單的2D游戲的時(shí)候,總是要計(jì)算一大堆人之間是否相互接觸,或者很多人放出的魔法是否跟敵人碰撞到。如果我們的地圖上有100個(gè)人,每個(gè)人放了兩招,兩兩檢驗(yàn)是否碰撞(以便判斷是否應(yīng)該實(shí)施攻擊)的話就需要檢查20000次。這顯然是不行的。那么我們可以使用分而治之的原理來(lái)做。我們可以把地圖切成很多個(gè)區(qū)域,區(qū)域包含著人和魔法。每當(dāng)人和魔法的移動(dòng)越過(guò)區(qū)域的邊界的時(shí)候,人和魔法就把自己從前一個(gè)區(qū)域斷開(kāi),鏈接到新的區(qū)域里面去。這個(gè)時(shí)候區(qū)域就保存了兩個(gè)鏈表,一個(gè)是人,另一個(gè)是魔法。好了,如何檢查魔法和人互相碰撞呢?只需要檢查同一個(gè)區(qū)域里面的就行了。如果這100人都在25個(gè)區(qū)域里面,平均每個(gè)區(qū)域有4個(gè)人8個(gè)魔法,那么兩兩檢驗(yàn)的話只需要檢查4×8×25=800次,相對(duì)于前面的暴力算法節(jié)省了96%的時(shí)間。當(dāng)然這只是理想狀態(tài)。

  在這里舉另一個(gè)例子。我們都覺(jué)得C#、VB和Java很神奇吧,東西new了都不用delete,多舒服。假設(shè)我們現(xiàn)在要實(shí)現(xiàn)這種功能的話,我們需要維護(hù)所有已經(jīng)new了的內(nèi)存空間,并執(zhí)行一種搜索算法來(lái)判斷哪一些內(nèi)存空間是再也不可能被訪問(wèn)的然后標(biāo)記,最后刪掉所有被標(biāo)記的空間。于是我們需要一個(gè)內(nèi)存管理器,用來(lái)申請(qǐng)、標(biāo)記和釋放。如何做比較合適呢?

  我們的內(nèi)存管理器需要根據(jù)設(shè)置的長(zhǎng)度返回一段句柄來(lái)代表內(nèi)存空間,然后需要可以通過(guò)句柄來(lái)訪問(wèn)內(nèi)存,最后標(biāo)記并一起刪除這些句柄。為什么要句柄呢?因?yàn)槿绻苯臃祷刂羔樀脑挘Z(yǔ)言執(zhí)行久了會(huì)產(chǎn)生很多內(nèi)存碎片,而且new和delete也不夠快。現(xiàn)在,我們需要以下幾個(gè)數(shù)據(jù)結(jié)構(gòu):

  • 一個(gè)記錄所有被new了而且delete過(guò)的句柄的列表,用于迅速獲得沒(méi)有正在被使用的句柄。
  • 一個(gè)記錄了所有正在使用的句柄的列表,記錄指針以及長(zhǎng)度。這張表是一個(gè)數(shù)組,句柄是索引。

  1. new的時(shí)候,我們查詢(xún)第一張表拿出一個(gè)空閑的句柄。如果列表為空的話那么將第二個(gè)表變大(這個(gè)時(shí)候所有句柄都被使用)并且將第一個(gè)空閑的(也就是原來(lái)的表接下去的第一個(gè)新空間)句柄所對(duì)應(yīng)的記錄標(biāo)記使用。然后我們分配的總是最末尾的地方。

  2. delete的時(shí)候,我們查詢(xún)所有標(biāo)記了使用句柄,看看是否有被mark,有的話就標(biāo)記為不使用并將句柄放置入第一張表。

  3. mark的時(shí)候,我們查詢(xún)這個(gè)句柄所對(duì)應(yīng)的記錄,然后mark。

  4. collect的時(shí)候,這是一個(gè)操作,將所有內(nèi)存碎片清除。我們只需要順序遍歷第二章表,將有用的內(nèi)容挪動(dòng)到前面一大塊無(wú)用的空間里面,復(fù)制一下數(shù)據(jù)然后修改一下起始指針即可。

  圖示一下:

空閑句柄:1 2
句柄記錄:<0,0..9><1,NULL><2,NULL><3,40..43>
內(nèi)存空間:[第0-9個(gè)字節(jié)占用][10-39不占用][40-43被占用][此處為末尾]

  好了,我們需要申請(qǐng)一個(gè)內(nèi)存空間,我們拿到了句柄4,需要10個(gè)字節(jié)。

空閑句柄:1 2
句柄記錄:<0,0..9><1,NULL><2,NULL><3,40..43><4,44..53>
內(nèi)存空間:[第0-9個(gè)字節(jié)占用][10-39不占用][40-43被占用][44-53被占用][此處為末尾]

  現(xiàn)在我們標(biāo)記3并刪除:

空閑句柄:1 2 3
句柄記錄:<0,0..9><1,NULL><2,NULL><3,NULL><4,10..19>
內(nèi)存空間:[第0-9個(gè)字節(jié)占用][10-19占用,從句柄4挪過(guò)來(lái)的][此處為末尾]

  分析一下時(shí)間復(fù)雜度吧,這里分析的是絕大部分情況,根據(jù)數(shù)據(jù)結(jié)構(gòu)的實(shí)際實(shí)現(xiàn)偶爾會(huì)有少許偏差。

  new為O(1),因?yàn)閺目臻e句柄獲得內(nèi)容為O(1),分配末尾內(nèi)存為O(1),找到記錄并標(biāo)記為O(1)
  mark為O(1),因?yàn)檎业接涗洸?biāo)記為O(1)
  delete為O(1),因?yàn)橹恍枰獦?biāo)記
  collect為O(n),因?yàn)楸闅v句柄記錄O(n),挪動(dòng)內(nèi)容,就算最多也就挪動(dòng)整段內(nèi)存空間,也是O(n)
  從句并獲得內(nèi)存地址也是O(1)

  我們僅僅需要在內(nèi)存不夠的情況下才動(dòng)用win32的api分配一塊新的大內(nèi)存,這樣來(lái)看的話在大部分情況下我們的內(nèi)存管理器的分配比操作系統(tǒng)做得還快,這也是為什么C#作為托管語(yǔ)言并沒(méi)有明顯慢下來(lái)的一個(gè)原因。當(dāng)然還有一些其他原因,譬如.NET虛擬機(jī)會(huì)把一些托管代碼臨時(shí)編譯成本地代碼等等。

  至于第三個(gè)例子,就看這里吧,為了做一個(gè)大作業(yè)而弄出來(lái)的利用動(dòng)態(tài)規(guī)劃是顯得簡(jiǎn)單尋路算法。

  說(shuō)到這里本篇也快結(jié)束了。舉著兩個(gè)例子只為了說(shuō)明以下問(wèn)題:

  • 算法往往跟執(zhí)行效率有很大關(guān)系
  • 好的數(shù)據(jù)結(jié)構(gòu)才能發(fā)揮算法應(yīng)有的威力
  • 要根據(jù)實(shí)際情況來(lái)選擇,甚至自己思考算法
  • 算法并不都是復(fù)雜的

  其實(shí),對(duì)于數(shù)據(jù)結(jié)構(gòu)和算法不熟悉或者根本沒(méi)聽(tīng)說(shuō)過(guò)的話,也并不是就不能寫(xiě)出一些稍微有點(diǎn)規(guī)模的程序,只是寫(xiě)出來(lái)的程序可能會(huì)很亂。算法在一個(gè)程序員的發(fā)展道路上看還是最好學(xué)一學(xué)。

it知識(shí)庫(kù)如何學(xué)習(xí)編程,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久久久久久久久久久久久久久久久久久 | 国产精品国产三级国产aⅴ无密码 | 欧美成人a∨高清免费观看 色999日韩 | 色综合视频在线 | 97久久精品午夜一区二区 | 中文字幕乱码一区二区三区 | 欧美13videosex性极品 | 日韩有码在线播放 | 成人精品一区二区三区中文字幕 | 日韩中文字幕在线免费 | 精品国产乱码久久久久久牛牛 | 欧美一级黄色片免费观看 | 亚洲视频免费播放 | 亚洲国产高清在线观看 | 欧美国产亚洲一区二区 | 亚洲成人精品久久 | 中文一区二区视频 | 久久精品美女 | 在线一级片 | 久久久蜜臀国产一区二区 | 久久精品99久久 | 91精品国产乱码久久久 | 波多野结衣精品 | 久久精品欧美视频 | 少妇无套高潮一二三区 | 天天舔天天 | 精品一区二区电影 | 日韩欧美国产精品一区 | 81精品国产乱码久久久久久 | 99在线播放| 国产一区二区三区在线免费 | 日韩精品一区二区不卡 | 成人婷婷 | 欧美一区二区三区国产 | 黄色毛片在线观看 | 精品麻豆剧传媒av国产九九九 | 欧美999 | 免费的黄色片子 | 国产精品久久 | av一区在线观看 | 国产高清在线 |