C#資料結構與演算法揭秘一

來源:互聯網
上載者:User

這裡,我們 來說一說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)
{
y=y+1; ①
}

從理論上分析這是一重迴圈的程式,while 迴圈的迴圈次數為 n,所以,該程式段中語句①的頻度是 n,則程式段的時間複雜度是 T(n)=O(n) 。

從程式上驗證,當n=10時,運行結果:

當n=100000時,運行結果

由此證明,其中演算法的時間複雜度確實是接近於O(n)

for(i=1;i<n;++i) {
for(j=0;j<n;++j)
{
A[i][j]=i*j; ①
}
}

理論上解釋為這是二重迴圈的程式,外層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))
{
y=y+1; ①
}

這是一重迴圈的程式,while 迴圈的迴圈次數為 n,所以,該程式段中語句①的頻度是 n,則程式段的時間複雜度是 T(n)=O(√n) 。

從程式證明:當n=10時,運行效果:

當n=100000時,運行效果:

由此證明,其中演算法的時間複雜度確實是接近於O(√n)

本文一介紹了資料結構的基本概念 而介紹了演算法的基本概念,並且重點討論了演算法時間複雜度,並且用程式予以證明。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.