開始新的學習之旅了,朋友們準備好了嗎?下面的一段時間筆者將和大家一起複習以下數據結構這門基礎的課程。
不知道大家有沒有跟筆者一樣的情況,一直在說數據結構,數據結構,那什麼是數據結構呢?
一 概念
先賣個關子,我們來看一個開發中常見的場景:
一個用戶在使用我們系統的時候,註冊了一個帳號,我們在業務處理中根據註冊信息,通過一系列處理生成一個User對象。
然後通過save方法保存到資料庫中,這樣以後我們就可以直接從這個表中讀取用戶信息了。
好,現在我們來看一下數據結構的概念:
1. 數據結構,英文是data structure,其實名字已經很清晰了。
這是一門專門處理數據的學科,數據元素相互之間的關聯稱為結構,描述的是存儲和組織數據的方式。
按照書中的說法,數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。
下面我們就繼續明確幾個概念。
2. 數據:對客觀事物的符號表示,指所有能輸入到計算機中並被電腦程式處理的符號的總稱。
上面場景中的註冊信息,就是數據。資料庫中存儲的用戶記錄,那也是數據沒跑了。
3. 數據項:數據項是數據的不可分割的最小單位。
這個不用太困惑,如上圖所示的用戶表中的id,accont,password等每一個欄位,都是一個數據項。
4. 數據元素:數據的基本單位,在計算機中作為一個整體進行考慮和處理。一個數據元素由多個數據項組成。
那就比較好理解了,用戶表中的每一條User記錄就是一個數據元素。
5. 數據對象:性質相同的數據元素的集合,是數據的一個子集。
這裡要記住集合這個概念,所有的用戶組合到一起是數據對象,所有的女性用戶也是一組數據對象。
二 數據結構和數據類型
通常數據結構有四種結構:
1. 集合
2. 線性結構
3. 樹形結構
4. 圖(網)狀結構
上面說都是數據的邏輯關係,數據結構中的物理結構(存儲結構)有兩種:
1. 順序存儲結構
2. 鏈式存儲結構
下面再介紹一個概念,數據類型——一個值的集合和定義再這個值集上的一組操作的總稱。
注意:這個概念中說的,不只包含值的集合,還包含對值集的操作。
數據類型又分為兩類:
1. 原子類型:值不可再分割。比如Java中的int,char,String等。
2. 結構類型:由若干成分按某種結構組成,可以被分解。比如一個整型數組,可以循環分割成多個整型元素。
還有兩種不太常見的數據類型
1. 抽象數據類型(ADT):指一個數學模型以及定義在該模型上的一組操作,或者我們可以把它理解成我們開發過程中自己定義的數據類型。
筆者認為它與基本數據類型的並沒有本質的區別,主要在於抽象數據類型更貼近於實際的使用。
2. 多形態數據類型:指其成分不確定的數據類型,筆者認為這個不太重要,了解一下就可以了。
三 算法和算法分析
算法是對特定問題求解步驟的一種描述,說白了就是我們通過解決問題的程序代碼,就可以說是算法。
算法具有以下5個特徵:
1. 有窮性:算法必須在執行有限個步驟之後終止。
2. 確定性:算法的每一步驟必須有確切的定義,相同的輸入只能得出相同的輸出。
3. 可行性:或者叫有效性,每個計算步都可以在有限時間內完成。
4. 輸入:一個算法由零個或多個輸入。
5. 輸出:一個算法有一個或多個輸出。
好的算法的評判標準:
1. 正確性:滿足具體問題的需求。
2. 可讀性:容易被人所理解。
3. 健壯性:對輸入的非法數據,能偶適當的進行處理。
4. 效率與低存儲量需求:儘量使算法的執行時間越短,運行時佔用的空間更小。
算法效率的度量:
1. 事後統計的方法:對運行結果進行統計分析,得出執行效率。
2. 事前分析估算:估算算法的時間複雜度——算法的時間複雜度是一個函數,它定性描述了該算法的運行時間。這是一個關於代表算法輸入值的字符串的長度的函數。
時間複雜度常用大O符號表述,如O(1),O(n),O(n)等,不包括這個函數的低階項和首項係數。
一般我們最常用的辦法是討論算法在最壞情況下的時間複雜度。
喜歡文章或想一起學習的朋友可以關注我,給我點讚,我將會持續更新,有什麼疑問或文中有不當之處請給我留言,真誠地希望能與大家一起交流探討,學習進步!