Go轉型——資料結構初級(一)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。**1**.資料結構基本概念在電腦中,我們可以用一個由若干“位”組合起來形成的一個位串來表示一個資料元素,比如,用一個字長的位串來表示一個整數,用八位位元字來表示一個字元,我們管這種位串叫**元素**或**節點**。當資料元素由若干資料項目組成時,位串對應資料項目的子位串稱為**資料域**。資料元素之間的關係可以分為兩種不同的表示方式:**順序映象**和**非順序映象**。並且得到了兩種儲存結構:**順序儲存結構**和**鏈式儲存結構**。順序映象的特點是藉助資料元素在儲存空間中的相對位置來表示資料元素之間的邏輯關係,而非順序映象利用指示資料元素儲存地址的指標來表示資料元素之間的邏輯關係,日常一圖頂千言:![image.png](https://static.studygolang.com/180119/f784c747076724bfe443af8d7c245692.png)如果用著兩種儲存結構表示z=3.0-2.3i, 結果應為 a :0300 0302 b :0611 0415**2**.如何描述儲存結構我們可以藉助進階語言中都有的一維數組來描述**順序儲存結構**,藉助C語言中的指標來描述**鏈式儲存結構**,**3**.簡述資料類型**資料類型**最早出現在進階程式語言中,用以刻畫操作對象的特性,因此資料類型是一個值的集合和定義在這個集合上的一組操作的總稱。例如:C語言中的整型變數,值的集合為某個區間上的整數(區間由機器決定),定義在七上的操作為,加、減、乘、除和模數等算數操作。根據“值”的不同特性,進階程式設計語言中的分為兩類:(1).**非結構的原子類型**:原子類型值都是不可分解的,例如C語言中的基本類型(整型、實型、字元型和枚舉型)、指標類型和空類型。(2).**結構類型**:結構類型的值是由若干成分按某種結構組成的,換而言之,值是可分解的。而且它的成分可以是結構的,也可以是非結構的。**4**.簡述抽象資料類型,並說明它與資料類型的關係。**抽象資料類型**.是指一個一個數學模型以及定義在該模型上的操作,抽象資料類型的定義僅取決於它的一組邏輯特性,而與他在電腦內部如何表示和實現無關,即無論其內部結構不發生變化,只要他的數學特性不發生變化,都不影響其外部的使用。抽象資料類型與資料類型本質上是一個概念,抽象的意義在於資料類型的數學抽象特性,另一方面抽象資料類型範疇更廣,不再局限於各大處理器已經定義並實現的資料類型(也可以稱之為固有資料類型)抽象資料類型根據值的不同可以分為三種,(1).**原子類型**:屬於原子類型的變數的值都是不可分的,(2).**固定彙總類型**:屬於該類型的變數值由數目確定的成分按一定結構組成,(3).**可變彙總類型**:與固定彙總類型相比,組成其值的成分數目不確定,日常一圖勝千言![image.png](https://static.studygolang.com/180120/50787e823bdfecef25fbbb9a4882587a.png)**5**.如何描述演算法,淺談對演算法設計的基礎理解**演算法**:是指令的有限序列,其中每條指令都是表示一個或多個操作,一個演算法應包含如下特性:**(1)**:**有窮性**:一個演算法應在執行有窮步後結束,且每一步都在有窮時間內完成**(2)**:**確定性**:演算法中每一條指令的含義都必須是確定的,讀者閱讀不會產生歧義,任何情況下,演算法只有唯一的一條執行路徑,即對相同的輸入值只能得出相同的輸出**(3)**:**可行性**:即演算法是可以通過已經實現的基本操作執行有限次數來實現的**(4)**:**輸入**:一個演算法有多個或零個輸入,這些輸入取自某個特定的集合**(5)**:**輸出**:一個演算法有一個或多個輸出,這些輸出與輸入一樣,具有某些相同的關係**演算法設計**:衡量一個演算法設計是否達到“好”的標準有以下這些:**(1)**:正確性:即演算法應當滿足當前需求,這個正確性不同於我們日常所說的“正確”,這個正確性大致分為四層:**a**.程式不包含語法錯誤**b**.程式對於幾組輸入資料能夠給出滿足要求的結果**c**.程式對於精心挑選、苛刻帶有刁難性的幾組資料能夠給出滿足要求的結果**d**.程式對於任何合法輸入的資料能夠給出滿足要求的結果顯然,一個演算法達到d級是相當困難的,所以一般達到c級就被認為是合格的**(2)**:可讀性:演算法首先是為了人之間的交流,其次才是機器執行,可讀性意味著更易於閱讀理解,更容易調試和修改**(3)**:健壯性:當輸入資料非法時,演算法也能進行適當的反應,不會產生莫名其妙的結果**(4)**:效率和低儲存量需求:效率是指演算法執行的時間,對於一個問題如果有多個演算法能夠解決問題,那麼執行時間最短的演算法效率最高。儲存量需求指的是演算法執行需要的最大儲存空間,這兩個因素都與問題規模有關,例如,求1000人的平均分和10000人的平均分**6**.演算法效率的度量演算法執行時間由機器執行演算法運行消耗的時間來度量,衡量一個演算法執行時間通常有兩種方式:**(1)**.事後統計的方法,不同的演算法可以通過相同的資料輸入來測試執行時間,但這種方法一,必須先運行演算法程式,二,主要依賴電腦的硬體軟體等因素,對結果影響較大,所以通常使用另一種方式;**(2)**.事前分析估算的方法。進階程式語言編寫的程式在電腦上運行所消耗的時間主要取決於以下幾個因素:**1**.依據的演算法根據何種策略略**2**.問題的規模,例如上文提到的求平均分的人數,是1000還是100**3**.書寫程式的語言,對於同一個演算法來說,語言等級越高,執行效率越低**4**.編譯器所產生的機器代碼品質**5**.機器執行指令的速度。由此可見,根據執行時間來衡量演算法效率絕對不是可靠的,因為他們或多或少都依賴於機器、語言,這些外界因素對於我們的結果影響過大,所以我們需要一個沒有外界因素幹擾,撇開這些因素,可以認定一個特定演算法運行工作量的大小,單純的依賴問題的規模,或者說他是問題規模的函數。一個演算法是由控制結構(順序、分支和迴圈)和固有資料類型的操作構成的,演算法的時間取決於這兩者的綜合效果,![image.png](https://static.studygolang.com/180120/916f89312104326aa14a2889f9f7917d.png)例如:**(a)**.{x++}**(b)**.for i:=0;i<n;i++{x++}**(c)**.for i:=0;i<n;i++{ for j:=0;j<n;j++{x++}}(a)中x++語句重複執行的次數(即頻度)為1, 所以時間複雜度為O(1),這種類型也被稱為常量階;(b)中x++語句重複執行的次數(即頻度)為n, 所以時間複雜度為O(n),這種類型也被稱為線性階;(c)中x++語句重複執行的次數(即頻度)為n*n, 所以時間複雜度為O(n²),這種類型也被稱為平方階;除上述三種情況,時間複雜度還可能為對數階O(log n),指數階O(n²),各時間複雜度性狀如所示,![image.png](https://static.studygolang.com/180120/52420c6ce5f79d77a590e4f43719b38c.png)由此可知,我們應該多用多項式階O(nⁿ k次方打不出來,用n代替)演算法,而不希望使用指數階的演算法。**7**.空間複雜度的度量類似於時間複雜度,我們用空間複雜度來作為演算法所需儲存空間的度量,也就是:![image.png](https://static.studygolang.com/180120/9f05c8d281dcdb8d0fafc13c5496b53e.png)n為問題的規模,一個上機執行的程式除了需要儲存空間來寄存本身所用的輸入資料,也需要一些對資料操作的工作單元和儲存一些為實現計算所需的資訊的輔助空間。326 次點擊  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.