1. 程式人生 > >【數據結構總結1】-數據結構的自述

【數據結構總結1】-數據結構的自述

它的 除了 友情 設計 提高自己 ear hellip 編程人員 aid

一、數據結構的自我介紹

大家好,餓叫數據結構,是用來提高程序員的程序設計水平的。

官方定義我為:數據結構是指相互之間存在著一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成。記為:Data_Structure=(D,R) 其中D是數據元素的集合,R是該集合中所有元素之間的關系的有限集合。------摘自《百度百科》

二、基本概念和術語

2.1 數據(Data)

數值數據:整數、實數、復數

非數值數據:如字符、文字、圖形、圖像、聲音等

2.2數據元素(Data Element)和數據項(Data Item)

數據元素:數據元素是數據的基本單位,在計算機程序中通常被作為一個整體進行考慮 和處理。數據元素有時也被稱為元素、結點、頂點、記錄等。一個數據元素可由 若幹個數據項(Data Item)組成。

數據項:數據項是不可分割的、含有獨立意義的最小數據 單位,數據項有時也稱為字段(Field)或域(Domain)。

【舉例】:

在數據庫信息處理系 統中,數據表中的一條記錄就是一個數據元素。這條記錄中的學生學號、姓名、性別、籍貫、出生年月、成績等字段就是數據項。

數據項分為兩種:一種叫做初等項,如學生的性別、籍貫等,在處理時不能再進行分割;另一種叫做組合項, 如學生的成績,它可以再分為數學、物理、化學等更小的項。

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#)》

技術分享圖片

友情提示

作者: mhq_martin

博客園地址: http://www.cnblogs.com/mhq-martin/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

【數據結構總結1】-數據結構的自述