你們好,餓叫數據結構,是用來提升程序員的程序設計水平的。程序員
官方定義我爲:數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成。記爲:Data_Structure=(D,R) 其中D是數據元素的集合,R是該集合中全部元素之間的關係的有限集合。------摘自《百度百科》算法
2.1 數據(Data)數據庫
數值數據:整數、實數、複數編程
非數值數據:如字符、文字、圖形、圖像、聲音等數組
2.2數據元素(Data Element)和數據項(Data Item)數據結構
數據元素:數據元素是數據的基本單位,在計算機程序中一般被做爲一個總體進行考慮 和處理。數據元素有時也被稱爲元素、結點、頂點、記錄等。一個數據元素可由 若干個數據項(Data Item)組成。函數
數據項:數據項是不可分割的、含有獨立意義的最小數據 單位,數據項有時也稱爲字段(Field)或域(Domain)。工具
【舉例】:spa
在數據庫信息處理系 統中,數據表中的一條記錄就是一個數據元素。這條記錄中的學生學號、姓名、性別、籍貫、出生年月、成績等字段就是數據項。設計
數據項分爲兩種:一種叫作初等項,如學生的性別、籍貫等,在處理時不能再進行分割;另外一種叫作組合項, 如學生的成績,它能夠再分爲數學、物理、化學等更小的項。
2.3數據對象
數據對象是性質相同的數據元素的集合,是數據的一個子集。例如,整數數 據對象是{0,±1,±2,±3,…},字符數據對象是{a,b,c,…}。
2.4數據類型
非結構的原子類型:如 C#語言中的基本類型 (整型、實型、字符型等);
結構類型:它的成分能夠由多個結構類型 組成,並能夠分解。結構類型的成分能夠是非結構的,也能夠是結構的。例如, C#語言中數組的成分能夠是整型等基本類型,也能夠是數組等結構類型。
2.5數據結構
數據結構是相互之間存在一種或多種特定關係的數據元素的集合。在任何問題中,數據元素之間都不是孤立的,而是存在着必定的關係,這種關係稱爲結構 (Structure)。根據數據元素之間關係的不一樣特性,一般有 4 類基本數據結構:
(1) 集合(Set):如圖 1.1(a)所示,該結構中的數據元素除了存在「同屬於一個集 合」的關係外,不存在任何其它關係。
(2) 線性結構(Linear Structure):如圖 1.1(b)所示,該結構中的數據元素存在着一 對一的關係。
(3) 樹形結構(Tree Structure):如圖 1.1(c)所示,該結構中的數據元素存在着一對 多的關係。
(4) 圖狀結構(Graphic Structure):如圖 1.1(d)所示,該結構中的數據元素存在着 多對多的關係。
數據結構的形式化定義爲:數據結構(Data Structure)簡記爲DS,是一個二元組, DS = (D,R)其中:D 是數據元素的有限集合,R 是數據元素之間關係的有限集合。
3.1算法的特性
有窮性;肯定性;輸入;輸出;能行性。
3.2算法的評價標準
正確性;可讀性;健壯性;運行時間;佔用空間。
3.3算法的時間複雜度
一個算法的時間複雜度(Time Complexity)是指該算法的運行時間與問題規 模的對應關係。一個算法是由控制結構和原操做構成的,其執行的時間取決於二 者的綜合效果。爲了便於比較同一問題的不一樣算法,一般把算法中基本操做重複 執行的次數(頻度)做爲算法的時間複雜度。算法中的基本操做通常是指算法中 最深層循環內的語句,所以,算法中基本操做語句的頻度是問題規模n的某個函 數f(n),記做:T(n)=O(f(n))。
其中「O」表示隨問題規模n的增大,算法執行時 間的增加率和f(n)的增加率相同,或者說,用「O」符號表示數量級的概念。
若是一個算法沒有循環語句,則算法中基本操做的執行頻度與問題規模n無 關,記做O(1),也稱爲常數階。若是算法只有一個一重循環,則算法的基本操做 的執行頻度與問題規模n呈線性增大關係,記做O(n),也叫線性階。經常使用的還有 平方階O(n2)、立方階O(n3)、對數階O(log2n)等。
【例1】 分析如下程序的時間複雜度。
x=n; /*n>1*/ y=0; while(x >= (y+1)*(y+1)) { y=y+1; ① }
解:這是一重循環的程序,while 循環的循環次數爲 根號n,因此,該程序段中的語句①的頻度是 根號n,則程序段的時間複雜度是 T(n)=O(根號 n)。
4.1集合
4.2對數
4.3遞歸
若是一個算法直接調用本身或間接地調用本身,就稱這個算法是遞歸 的(Recursive)。
(1)直接遞歸(Direct Recursion):好比,在收看電視節目時,若是演播室中也有一臺電視機播放的是與當前相 同的節目,觀衆就會發現屏幕裏的電視套有一層層的電視畫面。這種現象相似於 直接遞歸。 (2)間接遞歸(Indirect Recursion) : 若是把兩面鏡子面對面擺放,即可從任意一面鏡子裏看到兩面鏡子無數個影 像,這相似於間接遞歸。
函數的遞歸調用能夠理解爲:經過一系列的自身調用,達到某一終止條件後, 再按照調用路線逐步返回。遞歸是程序設計中強有力的工具,有不少數學函數是 以遞歸來定義的。
如你們熟悉的階乘函數,咱們能夠對n!做以下定義:
根據定義,如要計算 n!(factorial(n)),須要先調用 factorial(n-1)計算 (n-1)!,而要計算(n-1)!須要先調用 factorial(n-2)計算(n-2)!,以此類推,最 終須要調用 factorial(0)計算 0!,而後程序逐步返回,便可計算出 n!。階乘函數的C#語言實現以下。
public static long fact(int n) { if(n <= 1) { return 1; } else { return n * fact(n-1); } }
把遞歸做爲一種主要用於設計和描述簡單算法的工具,對於不熟悉它的編程人員而言是很難接受的。遞歸算法一般不是解決問題最有效的計算機程序,由於 遞歸包含函數調用,函數調用須要時空開銷。因此,遞歸比其餘替代選擇諸如while循環等,所花費的代價更大。
最後,用一句話結束此篇用來勉勵園子裏的程序猿們。
只有多思索、 多練習,才能提升本身的程序設計水平;不然,書看得再多,提升也不大。-----摘自《數據結構(C#)》
注:本文部分引用《數據結構(C#)》