數據結構和算法

前言

2016年又是一個全新的開始,每到一年的這個時候,老是很有感慨。想對過去的一年作一些總結,但又以爲經歷和精力老是不夠。程序員

俗話說,一年之計在於春,固然,新的一年,也老是計劃着N多事情,想作什麼事情?作到什麼程度?哪些必定要作好?哪些必定要完成?每年都會列出來,到最後卻發現,在這走過的一年裏,有時候徹底沒有按照原定的路線執行。因此,針對於此,我便再也不對本身進行規劃,固然並不表明沒有目標。我把時間分的更加粗顆粒化,再也不細化到沒有餘地,由於生活原本就充滿了變化。人不能作到按照原定的計劃一步一步的執行,我必須認可這一點。不是有句話嗎,計劃趕不上變化。算法

在這裏,我要說的是,在這一年裏,我會嘗試着回顧一些基礎的知識,好比數據結構,好比算法設計與分析。由於,自從大學畢業到如今也有2年了,數據結構和算法裏面的N多概念已經忘記的快沒有印象了。但我又不得不說的是,這些最基礎的,對於一個程序員的提高也是最必要的。這大概就是程序員和工程師的區別吧。編程

我要聲明的是,我在從此的日子裏,會連續不斷的更新一些關於數據結構和算法的知識。但時間會存在不肯定性,可能會每隔兩天就出一篇文章,多是一個星期,固然也多是一個月,這些東西是我不能控制的。因此,還請廣大博友理解!數組

廢話少說,時間不等人,直入主題!數據結構

數據結構這門課程不太好學,在大學的時候老師講的都聽明白了,可是如今依舊忘記了不少。若是你想讓本身的編程能力有質的飛躍,再也不停留於調用現成的東西而是追求更完美的實現,那麼這是你大學畢業後的必修課!數據結構和算法

什麼是數據結構

概念

官方定義:測試

數據結構是一門研究非數值計算的程序設計問題中的操做對象,以及它們之間的關係和操做等相關問題的學科。spa

個人理解:翻譯

程序設計 = 數據結構 + 算法設計

數據結構,顧名思義,就是數據之間的結構關係,或者理解成數據元素相互之間存在的一種或多種特定關係的集合。固然這些概念都是大學喜歡考的,咱們不必糾結於這個概念,有本身恰當的、而且能夠爲他人所接受的解釋就能夠。

數據結構中結構的概念

數據結構中的結構,也就是咱們研究的主體對象。數據結構中咱們不多研究數據,由於數據在內存中的表現形式對於咱們都是同樣的,也就是二進制。傳統上,咱們把數據結構分爲邏輯結構物理結構

邏輯結構

指反映數據元素之間的邏輯關係的數據結構,其中的邏輯關係是指數據元素之間的先後關係,而與他們在計算機中的存儲位置無關。邏輯結構分爲如下四類:

1.集合結構

集合結構中的數據元素同屬於一個集合,他們之間是並列的關係,除此以外沒有其餘關係。以下圖,能夠很好的表示集合結構中的元素之間的關係:

http://blog.fishc.com/wp-content/uploads/2012/08/%E9%9B%86%E5%90%88%E7%BB%93%E6%9E%84.jpg

2.線性結構

線性結構中的元素存在一對一的相互關係。以下圖,能夠很好的表示線性結構中的元素之間的關係:

http://blog.fishc.com/wp-content/uploads/2012/08/%E7%BA%BF%E6%80%A7%E7%BB%93%E6%9E%84.jpg

3.樹形結構

樹形結構中的元素存在一對多的相互關係。以下圖,能夠很好的表示樹形結構中的元素之間的關係:

http://blog.fishc.com/wp-content/uploads/2012/08/%E6%A0%91%E5%BD%A2%E7%BB%93%E6%9E%84.jpg

4.圖形結構

圖形結構中的元素存在多對多的相互關係。以下圖,能夠很好的表示圖形結構中的元素之間的關係:

http://blog.fishc.com/wp-content/uploads/2012/08/%E5%9B%BE%E5%BD%A2%E7%BB%93%E6%9E%84.jpg

物理結構

物理結構又叫存儲結構,指數據的邏輯結構在計算機存儲空間的存放形式。通俗的講,物理結構研究的是數據在存儲器中存放的形式。 存儲器主要針對於內存而言,像硬盤、軟盤、光盤等外部存儲器的數據組織一般用文件結構來描述。

數據在內存中的存儲結構,也就是物理結構,分爲兩種:順序存儲結構鏈式存儲結構

順序存儲結構

順序存儲結構:是把數據元素存放在地址連續的存儲單元裏,其數據間的邏輯關係和物理關係是一致的。數組就是順序存儲結構的典型表明。其在內存中的存儲形式相似於下圖:

鏈式存儲結構

鏈式存儲結構:是把數據元素存放在內存中的任意存儲單元裏,也就是能夠把數據存放在內存的各個位置。這些數據在內存中的地址能夠是連續的,也能夠是不連續的。

和順序存儲結構不一樣的是,鏈式存儲結構的數據元素之間是經過指針來鏈接的,咱們能夠通使用指針來找到某個數據元素的位置,而後對這個數據元素進行一些操做。以下圖,能夠幫助咱們理解鏈式存儲結構:

順序存儲結構和鏈式存儲結構的區別

打個比方說一下順序存儲結構和鏈式存儲結構的區別:
好比去銀行取錢,順序存儲結構就至關於,全部的客戶按照先來後到的順序有序的的坐在大廳的椅子上(注意:是有順序的坐着哦)。
而鏈式存儲結構至關於,全部的客戶只要一到銀行,大堂經理就給他們每人一個號碼,而後他們能夠隨便坐在哪一個椅子上(隨便坐,不須要按照什麼順序坐),只須要等待工做人員廣播叫號便可。
而每一個客戶手裏的號碼就至關於指針,當前的指針指向下一個存儲空間,這樣,全部不連續的空間就能夠被有順序的按照線性鏈接在一塊兒了。

算法

說到數據結構,必需要一併帶上算法,在筆者看來,不談算法的數據結構只是你理解了概念,只可以出去裝X而已。即談數據結構又談算法纔可以真正裝爺。只惋惜,以我如今腦海裏殘留的一點概念,我出去只可以裝X。廢話少說,直接行乾貨!

算法的概念

是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法表明着用系統的方法描述解決問題的策略機制。

以上是我在百度百科找到的解釋,在我看來,算法就是求解一個問題所須要的步驟所造成的解決方法,每一步包括一個或者多個操做。不管是現實生活中仍是計算機中,解決同一個問題的方法可能有不少種,在這N多種算法中,確定存在一個執行效率最快的方法,那麼這個方法就是最優算法

算法的特性

算法具備五個基本特徵:輸入、輸出、有窮性、肯定性和可行性

輸入

一個算法具備零個或者多個輸出。以刻畫運算對象的初始狀況,所謂0個輸入是指算法自己定出了初始條件。後面一句話翻譯過來就是,若是一個算法自己給出了初始條件,那麼能夠沒有輸出。好比,打印一句話:NSLog(@"你最牛逼!");

輸出

算法至少有一個輸出。也就是說,算法必定要有輸出。輸出的形式能夠是打印,也可使返回一個值或者多個值等。也能夠是顯示某些提示。

 

有窮性

算法的執行步驟是有限的,算法的執行時間也是有限的。

 

肯定性

算法的每一個步驟都有肯定的含義,不會出現二義性。

可行性

算法是可用的,也就是可以解決當前問題。
固然,回過頭來一看,這五個特性都是廢話,而且依稀記得大學老師都教過。因此,咱們不用浪費腦力在這些沒必要要的概念上,由於大學早已離我遠去,考試什麼的跟我也沒有一毛錢關係,只要知道這麼回事就好。

算法的設計要求

要設計一個好的算法,須要考慮如下4個特性(其實多半是廢話)。

正確性

廢話,誰會設計一個不可以解決問題的方法。

可讀性

指算法不管是從設計思路上,仍是從註釋方面,都要可以保證算法是可讀的,也就是能夠被其餘人員可以讀懂的。其實也是廢話,這是一個優秀的程序員必備的。

健壯性

通俗的講,一個好的算法應該具備捕獲異常/處理異常的能力。另外,對於測試人員的壓力測試、邊界值測試等刁難的測試手段,算法應該可以輕鬆的扛過去。

時間效率高和存儲量低

這實際上是兩個概念,時間效率就是指的時間複雜度,存儲量就是指的空間複雜度。翻譯過來就是一個好的算法應該考慮時間複雜度和空間複雜度。而每每時間複雜度和空間複雜度是相互彌補的。也就是從某些角度,咱們能夠了經過犧牲算法運算時間的方式來減小對內存的佔用,反之亦然。對於時間複雜度和空間複雜度這兩個概念,你們不用泰國迷惑,我會拿出來一篇文章專門講解,請你們稍安勿躁,持續關注。

PS:本篇文章是一個簡單的開始,裏面涉及了一些概念你們沒必要太過計較,之後的文章中會逐步的對這些概念進行展開講解。請你們不要急躁,不要氣餒!
 
圖片來源參考自:魚C工做室。感謝魚C工做室貢獻出了這麼好的圖片。
如非特別說明,筆者全部文章都是原創文章。若是您喜歡這篇文章,轉載請註明出處。若是您對數據結構感興趣,請關注我,後續會更新大量晶品文章供你們參考!
相關文章
相關標籤/搜索