c# 數據結構與算法1

  • 學習數據結構的意義:
  1. 數據結構算是程序員的一個工具箱,對程序中的問題會有很好的解決方案。
  2. 可以提高自己的編程能力。
  1. 集合(Set):該結構中的數據元素除了存在“同屬於一個集合”的關係外,不存在任何其它關係。 集合與數學的集合類似,有無序性,唯一性,確定性。
  2. 線性結構(Linear Structure):該結構中的數據元素存在一對一的關係。我們.net程序員做的最多的工作就是對數據庫的表操作,二表的最小的數據單元是行。每行數據是最明顯的線性結構。 
  3. 樹形結構(Tree Structure):該結構中的數據元素存在着一對多的關係。現實中,家族關係中是最明顯的樹

     

  4. 圖狀結構(Graphic Structure):該結構中的數據元素存在多對多的關係。對於我們。net程序員應用的較少,當你用C++作一些底層應用,如搜索引擎,地圖導航應用的蠻多的。
  • 什麼是算法

算法可以理解爲有基本運算及規定的運算順序所構成的完整的解題步驟。或者看成按照要求設計好的有限的確切的計算序列,並且這樣的步驟和序列可以解決一類問題。

  • 算法的特性
  1. 有窮性(Finity):一個算法總是在執行有窮步之後結束,即算法的執行時間是有限的。我們初學.net時候,經常寫着死循環,這不是算法,因爲這是無窮的。 
  2. 確定性(Unambiguousness):算法的每一個步驟都必須有確切的含義,即無二義,並且對於相同的輸入只能有相同的輸出。對於我們.net程序員寫出二義性的源代碼,編譯器根本讓你通不過。 
  3. 輸入(Input):一個算法具有零個或多個輸入。它即是在算法開始之前給出的數據結構這些輸入是某數據結構中的數據對象。編程是解決問題的,如果不能輸入的話,怎麼解決問題了。 
  4.  輸出(Output):一個算法具有一個或多個輸出,並且這些輸出與輸入之間存在着某種特定的關係。 編程就是解決了生活中問題,你不讓用戶看到最後的結果,這就失去了編程的意義。
  5.  能行性(realizability):算法中的每一步都可以通過已經實現的基本運算的有限次運行來實現。這與有窮性息息相關。
  • 算法的評價標準
  1. 運行時間 2、佔用空間(有時需要犧牲空間來換取時間,有時需要犧牲時間在換取空間)
  2. 其他方法:正確性 、 可讀性 、 健壯性

評價運行時間就是一個算法時間複雜度,  一個算法的時間複雜度(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) 。

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²) 。

③x=n; /*n>1*/
y=0;
while( x >= (y+1)*(y+1) )
{
    y=y+1; ①
}

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章