這裡,我們 來說一說c#的資料結構了。
①什麼是資料結構。資料結構,字面意思就是研究資料的方法,就是研究資料如何在程式中組織的一種方法。資料結構就是相互之間存在一種或多種特定關係的資料元素的集合。 程式界有一點很經典的話,程式設計=資料結構+演算法。用源**來體現,資料結構,就是程式設計。他有哪些具體的關係了,
(1) 集合(set):如圖 1.1(a)所示,該結構中的資料元素除了存在「同屬於乙個集合」的關係外,不存在任何其它關係。 集合與數學的集合類似,有無序性,唯一性,確定性。
(2) 線性結構(linear structure):如圖 1.1(b)所示,該結構中的資料元素存在著一對一的關係。我們.net程式設計師做的最多的工作就是對資料庫的表crud,二表的最小的資料單元是行。每行資料是最明顯的線性結構。
(3) 樹形結構(tree structure):如圖 1.1(c)所示,該結構中的資料元素存在著一對多的關係。現實中,家族關係中是最明顯的樹形結構。如圖所示
而對於我們.net程式設計師來說,操作的樹形控制項是也是最明顯的樹形結構
(4) 圖狀結構(graphic structure):如圖 1.1(d)所示,該結構中的資料元素存在著多對多的關係。在現實中,圖應用的太多了,如圖所示:
對於我們。net程式設計師應用的較少,當你用c++作一些底層應用,如搜尋引擎,地圖導航應用的蠻多的。
以上是針對資料結構的介紹。
做過開發的人員都知道這個道理,演算法與資料結構和程式的關係非常密切。 進行程式設計時,先確定相應的資料結構,然後再根據資料結構和問題的需要設計相應的演算法。
②那什麼是演算法了?演算法,就是計算的方法了,就是解決問題的方案,就是對某一特定型別的問題的求解步驟的一種描述, 是指令的有限序列。 用源**體現,演算法就是程式設計的體現。乙個演算法應該具備以下 5個特性:
1、有窮性(finity):乙個演算法總是在執行有窮步之後結束,即演算法的執行時間是有限的。我們初學.net時候,經常寫著死迴圈,這不是演算法,因為這是無窮的。
2、確定性(unambiguousness):演算法的每乙個步驟都必須有確切的含義,即無二義,並且對於相同的輸入只能有相同的輸出。對於我們.net程式設計師寫出二義性的源**,編譯器根本讓你通不過。
3、輸入(input):乙個演算法具有零個或多個輸入。它即是在演算法開始之前給出的資料結構這些輸入是某資料結構中的資料物件。程式設計是解決問題的,如果不能輸入的話,怎麼解決問題了。
4、 輸出(output):乙個演算法具有乙個或多個輸出,並且這些輸出與輸入之間存在著某種特定的關係。 程式設計就是解決了生活中問題,你不讓使用者看到最後的結果,這就失去了程式設計的意義。
5、 能行性(realizability):演算法中的每一步都可以通過已經實現的基本運算的有限次執行來實現。這與有窮性息息相關。
那演算法的評價標準又是什麼了?
評價乙個演算法優劣的主要標準如下:1、 正確性(correctness)。2、可讀性(readability)3、健壯性(robustness)。4、執行時間(running time)。5、占用空間(storage space)。
前3個性質,我們很好拿捏。與我們程式設計師息息相關的是執行時間與占用空間。然而,隨著硬體越來越便宜,面對占用空間,我們無非增加硬體。面對海量資料,我們尤為關心是執行時間(running time)。這此時的計算機的執行時間由以下因素決定:
1、硬體條件。包括所使用的處理器的型別和速度(比如,使用雙核處理器還是單核處理器) 、可使用的記憶體(快取和 ram)以及可使用的外存等。
2、實現演算法所使用的計算機語言。實現演算法的語言級別越高,其執行效率相對越低。
3、所使用的語言的編譯器/直譯器。一般而言,編譯的執行效率高於解釋,但解釋具有更大的靈活性。
4、所使用的作業系統軟體。作業系統的功能主要是管理計算機系統的軟體和硬體資源,為計算機使用者方便使用計算機提供乙個介面。各種語言處理程式如編譯程式、解釋程式等和應用程式都在作業系統的控制下執行。
評價執行時間就是乙個演算法時間複雜度, 乙個演算法的時間複雜度(time complexity)是指該演算法的執行時間與問題規模的對應關係。
演算法中的基本操作一般是指演算法中最深層迴圈內的語句,因此,演算法中基本操作語句的頻度是問題規模n的某個函式f(n),記作:t(n)=o(f(n))。其中「o」表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,或者說,用「o」符號表示數量級的概念。 這些 都只是一些理論的概念,我們這裡用計時器來證明這個理論概念。
如:①x=n; /*n>1*/
y=0;
while(y < x)
從理論上分析這是一重迴圈的程式,while 迴圈的迴圈次數為 n,所以,該程式段中語句①的頻度是 n,則程式段的時間複雜度是 t(n)=o(n) 。
從程式上驗證,當n=10時,執行結果如圖所示:
當n=100000時,執行結果如圖所示
由此證明,其中演算法的時間複雜度確實是接近於o(n)
for(i=1;i理論上解釋為這是二重迴圈的程式,外層for迴圈的迴圈次數是n,內層for迴圈的迴圈次數為n,所以,該程式段中語句①的頻度為n*n,則程式段的時間複雜度
為t(n)=o(n²) 。
從程式上證明,當n=10,其執行效果如圖所示:
當n=100000,其執行效果如圖所示:
由此證明,其中演算法的時間複雜度確實是接近於o(n²)
③x=n; /*n>1*/
y=0;
while(x >= (y+1)*(y+1))
這是一重迴圈的程式,while 迴圈的迴圈次數為 n,所以,該程式段中語句①的頻度是 n,則程式段的時間複雜度是 t(n)=o(√n) 。
從程式證明:當n=10時,執行效果如圖所示:
當n=100000時,執行效果如圖所示:
由此證明,其中演算法的時間複雜度確實是接近於o(√n)
本文一介紹了資料結構的基本概念 而介紹了演算法的基本概念,並且重點討論了演算法時間複雜度,並且用程式予以證明。
資料結構與演算法 揭秘
字面意思就是研究資料的一種方法,就是研究資料在程式中組織的一種方法。資料結構就是,元素與元素有一種或者多種關係的集合,在軟體界有一種比較普片的公式就是程式 資料結構 演算法。1 集合 set 和數學的集合一樣,具有唯一性,確定性,無序性。2 線性結構 典型的資料庫二維表,一對一的關係。3 樹形結構 ...
C 資料結構與演算法揭秘13
這節,我們來看看一下什麼了,來看看圖的遍歷吧!首先,搞清楚,圖的遍歷的基本的含義了。圖的遍歷是指從圖中的某個頂點出發,按照某種順序訪問圖中的每個頂點,使每個頂點被訪問一次且僅一次。圖的遍歷與樹的遍歷操作功能相似。圖的遍歷是圖的一種基本操作,並且圖的許多其他操作都是建立在遍歷操作的基礎之上的。遍歷示意...
C 資料結構與演算法揭秘二
上文對資料結構與演算法,有了乙個簡單的概述與介紹,這篇文章,我們介紹一中典型資料結構 線性結構。什麼是線性結構,線性結構是最簡單 最基本 最常用的資料結構。線性表是線性結構的抽象 abstract 線性結構的特點是結構中的資料元素之間存在一對一的線性關係。這 種一對一的關係指的是資料元素之間的位置關...