演算法與項目
『壹』 有什麼項目可以很好的鍛煉數據結構與演算法能力嗎
把教材上所有的演算法完整的實現就可以很好的鍛煉咯
線性結構:線性表——順序表、鏈表、棧、隊列、串、數組
樹形結構:普通樹、二叉樹、遍歷、查找等,哈夫曼樹
圖:圖的各種存儲實現(鄰居矩陣、鄰接表等)、圖的遍歷、相應的演算法及應用全部實現(最小生成樹、關鍵路徑、最短路徑,)
查找與排序:各種方法的完整實現
每一個都可以使用順序存儲和鏈式結構兩種方法實現
如果把教材的所有演算法全部熟練實現,相信會有很大收獲與進步!
『貳』 怎麼打編程基礎,做項目還是刷演算法題
第一英語必須過五級第二學習編程是一件好事 不過之前你得先了解 你學習編程的目的是什麼 這個很重要 因為目的決定發展方向
目前對於編程有很多種編程語言以及相對應的開發軟體 下面說明一些常用的編程語言 根據你的情況選一種語言進行學習 不要盲亂學習
C語言 一種可移植性和多系統平台的編程語言 開發軟體TC
VB 一種可以說是既學既用的軟體開發語言 開發軟體如:VB6.0
DELPHI 一種和VB差不多的既學既用的軟體開發語言不過其功能遠比VB強大 代碼書寫上更加方便
開發軟體 DELPHI7.0
JAVA 一種功能強大可移植性強開發語言
程序語言,顧名思義就是語言,是用於交流的,程序就是計算機的語言和人的語言的翻譯者,做一個程序員就是要把人類世界的問題用計算機的方法去解決和展現,可是因為種種原因,大多數人在如何學好語言,如何學好開發平台上疲於奔命,到頭來你只會敲寫代碼。
程序基本上都是自學的,買書是一開始碰到的最頭痛的問題,計算機的書大多都很貴,現將我的一點經驗供大家參考:
如果想做一個合格的程序員,C++是一定要學的,
首先你要花兩個月的時間學習C,C++,這樣的書很多,去選一些大學的教材足亦,切記,不要花過多的時間研究C++,兩個月夠了,只要學會其中語法就行了,不要為了深入用DOS編寫菜單什麼的,那是吃飽人參了。
如果你有過多的時間,接下來你可以學習數據結構,推崇《數據結構C++語言描述》,清華大學出版,58元,但如果無過多時間,還是不看為妙,至少我現在從未用過這本書的知識,許多東西MFC VCL等開發平台都為你已經做好。
接下來開始學習Windows下的SDK編程, 推崇《Windows程序設計》160元,建議去借,不要買,而且你只看上冊,你只要了解Windows的運作機制即可。兩個月
然後你將轉入VC的世界,既然要在Windows下編程,VC不可不學, 推崇《VC++技術內幕》第四版,96元,三個月,不要全部看,看前面的三部分,後面不要看。後面的只是對COM,資料庫,Internet形如雞肋的介紹。
接下來你應該考慮一下你將要發展的方向,如果是做資料庫,你可以用VB和Delphi或CB, 如果要做通信方面,或者硬體,你將要深入VC, 如果是WEB相關的,去學學ASP,JAVA,JSP,XML等,但有一樣你必須要學的,COM。COM與其說是一樣新的技術,還不如說是種機制,推崇潘愛民的《COM原理和應用》39元,你可以一邊看這本書,一邊學習些ActiveX組件,ATL控制項等等。如果你有的是時間,不急於找工作,你還可以看看《Windows高級編程》或《Windows核心編程》,但不管怎麼樣,你要切記,VC不是用來做界面和資料庫的,做網路的現在也有JAVA,都是用來做一些很底層的東西,VC是很高薪的,如果你對自己有充分的信心和有的是時間,你才可以深入VC。否則的話,還是看看人才市場,看看行情,再說。
還有一點切記,有些書,諸如《MFC深入淺出》這些書主要是關於那些技術原理的介紹,我個人認為程序只是工具,只是技術,只要學會用,能完成任務即可,如果有的是時間,才會去探索根源,也許有許多人會說,懂了原理對你編程會有很大幫助,我不否認,但是,要知道,就算你編程技術如何了得,你只是個技術人員,當你學了那麼多的技術和知識,第一,計算機的知識其實是各大公司制定出的標准,標准變了,你不是白學了嗎?第二,當你花了幾年的時間學習,到頭來你只不過程序水平提高一點。我認為應當將你的大部分智力和精力用在如何與人打交道,電腦讓你用的好有什麼用,人腦讓你擺弄的好才算真本事,就如《黑冰》裡面的計算機工程師,雖然對計算機十分精通,可有什麼用,還不是死在王志文的手裡?而且死的很慘,臉都毀了。
另外,不要去學你喜歡的,也不要去費勁腦子想該學什麼,看看人才市場,市場需要什麼,你學什麼
『叄』 什麼是演算法與數據結構
演算法(Algorithm)是一系列解決問題的清晰指令,也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
演算法可以理解為有基本運算及規定的運算順序所構成的完整的解題步驟。或者看成按照要求設計好的有限的確切的計算序列,並且這樣的步驟和序列可以解決一類問題。
一個演算法應該具有以下五個重要的特徵:
1、有窮性: 一個演算法必須保證執行有限步之後結束;
2、確切性: 演算法的每一步驟必須有確切的定義;
3、輸入:一個演算法有0個或多個輸入,以刻畫運算對象的初始情況,所謂0個輸入是指演算法本身定除了初始條件;
4、輸出:一個演算法有一個或多個輸出,以反映對輸入數據加工後的結果。沒有輸出的演算法是毫無意義的;
5、可行性: 演算法原則上能夠精確地運行,而且人們用筆和紙做有限次運算後即可完成。
計算機科學家尼克勞斯-沃思曾著過一本著名的書《數據結構十演算法= 程序》,可見演算法在計算機科學界與計算機應用界的地位。
數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索演算法和索引技術有關。
一般認為,一個數據結構是由數據元素依據某種邏輯聯系組織起來的。對數據元素間邏輯關系的描述稱為數據的邏輯結構;數據必須在計算機內存儲,數據的存儲結構是數據結構的實現形式,是其在計算機內的表示;此外討論一個數據結構必須同時討論在該類數據上執行的運算才有意義。
在許多類型的程序的設計中,數據結構的選擇是一個基本的設計考慮因素。許多大型系統的構造經驗表明,系統實現的困難程度和系統構造的質量都嚴重的依賴於是否選擇了最優的數據結構。許多時候,確定了數據結構後,演算法就容易得到了。有些時候事情也會反過來,我們根據特定演算法來選擇數據結構與之適應。不論哪種情況,選擇合適的數據結構都是非常重要的。
選擇了數據結構,演算法也隨之確定,是數據而不是演算法是系統構造的關鍵因素。這種洞見導致了許多種軟體設計方法和程序設計語言的出現,面向對象的程序設計語言就是其中之一。
在計算機科學中,數據結構是一門研究非數值計算的程序設計問題中計算機的操作對象(數據元素)以及它們之間的關系和運算等的學科,而且確保經過這些運算後所得到的新結構仍然是原來的結構類型。
「數據結構」作為一門獨立的課程在國外是從1968年才開始設立的。 1968年美國唐·歐·克努特教授開創了數據結構的最初體系,他所著的《計算機程序設計技巧》第一卷《基本演算法》是第一本較系統地闡述數據的邏輯結構和存儲結構及其操作的著作。「數據結構」在計算機科學中是一門綜合性的專業基礎課。數據結構是介於數學、計算機硬體和計算機軟體三者之間的一門核心課程。數據結構這一門課的內容不僅是一般程序設計(特別是非數值性程序設計)的基礎,而且是設計和實現編譯程序、操作系統、資料庫系統及其他系統程序的重要基礎。
計算機是一門研究用計算機進行信息表示和處理的科學。這裡面涉及到兩個問題:
信息的表示
信息的處理
而信息的表示和組又直接關繫到處理信息的程序的效率。隨著計算機的普及,信息量的增加,信息范圍的拓寬,使許多系統程序和應用程序的規模很大,結構又相當復雜。因此,為了編寫出一個「好」的程序,必須分析待處理的對象的特徵及各對象之間存在的關系,這就是數據結構這門課所要研究的問題。眾所周知,計算機的程序是對信息進行加工處理。在大多數情況下,這些信息並不是沒有組織,信息(數據)之間往往具有重要的結構關系,這就是數據結構的內容。數據的結構,直接影響演算法的選擇和效率。
計算機解決一個具體問題時,大致需要經過下列幾個步驟:首先要從具體問題中抽象出一個適當的數學模型,然後設計一個解此數學模型的演算法(Algorithm),最後編出程序、進行測試、調整直至得到最終解答。尋求數學模型的實質是分析問題,從中提取操作的對象,並找出這些操作對象之間含有的關系,然後用數學的語言加以描述。計算機演算法與數據的結構密切相關,演算法無不依附於具體的數據結構,數據結構直接關繫到演算法的選擇和效率。運算是由計算機來完成,這就要設計相應的插入、刪除和修改的演算法 。也就是說,數據結構還需要給出每種結構類型所定義的各種運算的演算法。
數據是對客觀事物的符號表示,在計算機科學中是指所有能輸入到計算機中並由計算機程序處理的符號的總稱。
數據元素是數據的基本單位,在計算機程序中通常作為一個整體考慮。一個數據元素由若干個數據項組成。數據項是數據的不可分割的最小單位。有兩類數據元素:一類是不可分割的原子型數據元素,如:整數"5",字元 "N" 等;另一類是由多個款項構成的數據元素,其中每個款項被稱為一個數據項。例如描述一個學生的信息的數據元素可由下列6個數據項組成。其中的出身日期又可以由三個數據項:"年"、"月"和"日"組成,則稱"出身日期"為組合項,而其它不可分割的數據項為原子項。
關鍵字指的是能識別一個或多個數據元素的數據項。若能起唯一識別作用,則稱之為 "主" 關鍵字,否則稱之為 "次" 關鍵字。
數據對象是性質相同的數據元素的集合,是數據的一個子集。數據對象可以是有限的,也可以是無限的。
數據處理是指對數據進行查找、插入、刪除、合並、排序、統計以及簡單計算等的操作過程。在早期,計算機主要用於科學和工程計算,進入八十年代以後,計算機主要用於數據處理。據有關統計資料表明,現在計算機用於數據處理的時間比例達到80%以上,隨著時間的推移和計算機應用的進一步普及,計算機用於數據處理的時間比例必將進一步增大。
數據結構是指同一數據元素類中各數據元素之間存在的關系。數據結構分別為邏輯結構、存儲結構(物理結構)和數據的運算。數據的邏輯結構是對數據之間關系的描述,有時就把邏輯結構簡稱為數據結構。邏輯結構形式地定義為(K,R)(或(D,S)),其中,K是數據元素的有限集,R是K上的關系的有限集。
數據元素相互之間的關系稱為結構。有四類基本結構:集合、線性結構、樹形結構、圖狀結構(網狀結構)。樹形結構和圖形結構全稱為非線性結構。集合結構中的數據元素除了同屬於一種類型外,別無其它關系。線性結構中元素之間存在一對一關系,樹形結構中元素之間存在一對多關系,圖形結構中元素之間存在多對多關系。在圖形結構中每個結點的前驅結點數和後續結點數可以任意多個。
數據結構在計算機中的表示(映像)稱為數據的物理(存儲)結構。它包括數據元素的表示和關系的表示。數據元素之間的關系有兩種不同的表示方法:順序映象和非順序映象,並由此得到兩種不同的存儲結構:順序存儲結構和鏈式存儲結構。順序存儲方法:它是把邏輯上相鄰的結點存儲在物理位置相鄰的存儲單元里,結點間的邏輯關系由存儲單元的鄰接關系來體現,由此得到的存儲表示稱為順序存儲結構。順序存儲結構是一種最基本的存儲表示方法,通常藉助於程序設計語言中的數組來實現。鏈接存儲方法:它不要求邏輯上相鄰的結點在物理位置上亦相鄰,結點間的邏輯關系是由附加的指針欄位表示的。由此得到的存儲表示稱為鏈式存儲結構,鏈式存儲結構通常藉助於程序設計語言中的指針類型來實現。索引存儲方法:除建立存儲結點信息外,還建立附加的索引表來標識結點的地址。散列存儲方法:就是根據結點的關鍵字直接計算出該結點的存儲地址。
數據結構中,邏輯上(邏輯結構:數據元素之間的邏輯關系)可以把數據結構分成線性結構和非線性結構。線性結構的順序存儲結構是一種隨機存取的存儲結構,線性表的鏈式存儲結構是一種順序存取的存儲結構。線性表若採用鏈式存儲表示時所有結點之間的存儲單元地址可連續可不連續。邏輯結構與數據元素本身的形式、內容、相對位置、所含結點個數都無關。
演算法的設計取決於數據(邏輯)結構,而演算法的實現依賴於採用的存儲結構。數據的運算是在數據的邏輯結構上定義的操作演算法,如檢索、插入、刪除、更新的排序等。
『肆』 2.演算法設計或項目開發中,你碰到哪些問題或困難,如何解決的
開發過程中遇到具體的技術問題,解決方案如下:自己查閱官網,看官方文檔,還有就是自己平時的積累(包括看書、資料、博客等等)。
遇到問題不要害怕,也不要煩躁,靜下心來,想想問題出現的原因以及該怎麼去解決,每解決一個問題都是對自己能力的提升。而且每解決一個難以搞定的問題,我相信大部分人都是很高興的。
平時多看技術資料、博客、書,看重對自己知識的積累,才能有實質性的能力提升。掌握解決問題的方式,謙虛的向別人請教,日復一日,相信你一定可以解決掉所有的困難。
『伍』 想學軟體開發有什麼建議嗎
給出三點建議,希望對你有所幫助:
1、基礎
這是每個開發者的起點。開發者剛剛學會了某種語言, 比如C語言,學習了基本的數據結構和演算法,並通過一些練習對知識點進行鞏固。這些練習主要以課後練習為主,是一些簡單的基礎概念的練習,比如列印輸出、接收用戶的輸入、數組的遍歷、排序,或者鏈表等。
接下來是做一些簡單的項目,這些項目沒有復雜的演算法和高深的領域知識,比如數據的統計分析、產品的售後管理系統等。這些項目雖然簡單,卻是一個真實完整的項目。不僅練習了開發者對語言的應用能力,也體會了軟體開發的全生命周期,即軟體工程,從項目的需求分析,到設計開發,到軟體發布和項目驗收,最後到軟體的維護。
通過簡單的項目,掌握了對語言的駕馭能力,並熟悉了軟體工程。隨著能力的提升,慢慢地就會接觸更復雜的項目,使自己能力得到進一步的鞏固和提升。
2、能力的提升方面
包括:對語言的應用得心應手,對軟體的設計駕輕就熟。接觸並熟悉更多的語言,如動態語言Pyhton、腳本語言Bash、新興語言Golang、Swift等。通過語言間的對比,對語言的優勢和缺點又比較清晰的了解,從而在項目中合理選擇語言。
3、架構設計和系統分析
隨著項目越做越多,會發現多數是在重復,到了一個瓶頸。這是可能要閱讀大量的書籍,向軟體架構和系統分析轉型。在設計軟體時,要多留意架構設計。軟體架構可以通過演化得到。但是若能看得更遠,提前做些設計,會事半功倍。
這個階段,可能要花大量的時間在業務領域。因為軟體技術已經暫時不需投入太多精力了,也有時間關注業務領域了。熟悉業務領域,能分析用戶的需求和約束條件,寫出信息系統需求規格說明書,制訂項目開發計劃等,能根據實際工作環境,評估和選用適宜的開發方法和工具;能按照標准規范編寫系統分析、設計文檔等。在實際項目中鍛煉系統架構和系統分析能力。
4、基礎演算法和項目管理
發展到這個水平後,對軟體技術和業務領域都比較熟悉。所謂窮則獨善其身,達則兼濟天下。很可能會帶帶新員工。這是練習領導力的一個機會,可以體會一下如何帶人。為下一步帶團隊打下基礎。可以把手上的一些事情安排給他們做。自己抽身出來研究更重要的事。比如研究基礎演算法、拓展新的領域等。
其實到這個階段有兩個選擇,可以向項目管理進一步,做項目經理。也可以鑽研基礎領域,做領域專家。
『陸』 c++數據結構與演算法可做的項目有啥
可以做的項目還是挺多的,但是當下的情況是,C++更多做的是底層的工作,而Java、C#等等語言更多的運用在app、網站的項目中。
『柒』 演算法與程序有何關系,對於一個任務書寫演算法對程序設計有哪些好處 大家幫忙答一下,謝了。。。
演算法與程序的關系如同思想與行動,想在行之前,則少走彎路,效率高,成功率也高,反之事倍功半,甚至從頭再來。因此,對於大的工程和項目,編制任務書是相當重要的。
『捌』 演算法工程師的項目落地能力指什麼
1、深刻理解業務,能根據業務需求調整實現方案的能力
就拿茶具的例子說,客戶更關注不良品不能漏,寧可殺錯,不可放過,所以這時候我們就得把業務朝著不良品檢出率方向去優化;
2、結合業務需求的熟練工程實現能力
我們拿到一個項目需求以後,大腦中得立馬有一個框架,這個項目輸入輸出是什麼?得用到哪幾個模型?適合什麼樣的業務框架?開發需要多久?調優需要多久?能達到什麼樣的指標?然後按照自己的規劃進行開發調優。
3、對數據敏感,有較強的數據處理與數據維護管理能力
演算法工程師一定要對數據敏感,看一眼數據就能知道這些數據能支持什麼樣的任務?有沒有坑?數據該怎麼標注與維護高效省成本?
4、對新技術的求知慾與探索學習能力
目前人工智慧技術剛興起,技術和演算法迭代很快,所以對演算法工程師追新技術,新解決方案的能力也有要求,不能落後太久。比如現在有個推理性能的瓶頸,攻關了很久沒有突破,但是可能就已經有開源的方案了,而這就需要我們經常查資料,看論文了。
5、各部門的溝通合作能力
這是個通用能力,演算法工程師當然也需要,就像這個茶具項目中的一樣,演算法工程師接到不合理的需求一定要及時溝通,並用自己的專業知識,給出更合理的解決方案,各部門一起為項目落地努力。
『玖』 項目和演算法那個有前途
怎麼說呢,都有前途,演算法牛的人【比如ACM能到亞洲賽甚至全球總決賽等】都會有公司搶著要,比如微軟、網路可能請你去喝茶。最後你要做到一方面的專家,演算法也主要吃年輕飯,年齡大點腦子就轉不過來啦,但是我感覺在我們國家來說,這樣的人不吃香。而項目的話,你主要學的是項目管理的經驗,學習項目架構,能夠保證項目組裡面的人好好溝通,高效率完成項目。實際就是做項目管理,中國賺錢多的都是做管理的【個人感覺要比做演算法的來的容易,但是做演算法的賺錢也不弱,要就就是高了點】,想做演算法,也可以考慮學到博士什麼的留校當老師,搞科研做演算法比較實際。個人拙見,還需要你自己好好考慮