程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [翻譯]C#數據結構與算法 – 前言&第一章

[翻譯]C#數據結構與算法 – 前言&第一章

編輯:C#入門知識

前言

    在專業程序員的成長過程中數據結構與算法的學習是至關重要的。雖然有許多書籍介紹數據結構與算法,但這些書大部分是作為高校教材並且以大學中常用於面向對象教學的Java或C++來講述的。C#正在成為一種流行的語言。此書適合C#程序員們來學習數據結構與算法的基礎知識。

    C#是一個基於.Net Framework這個豐富的開發環境的語言。.Net Framework的類庫中包括了一系列與數據結構相關的類型(也被稱作集合類)。這些類包括了從Array,Arraylist與集合類型到Stack與Queue類到HashTable與SortedList這眾多的類型。讀者可以先學著怎樣使用這些類而不用急著明白怎樣實現這些類。在這之前,教學者不得不先抽象討論數據結構的結構的原理(如堆棧),直到完整的構建出這樣一個數據結構。現在教學者們可以先給學生演示怎樣使用堆棧完成一些如數值轉換的計算,從而快速演示這些類的使用。有了這些背景,學生們可以回過頭來學習這些數據結構(或算法)的基礎,甚至給出了他們自己的實現。

    本書對所有程序員都需要知道並理解的數據結構和算法做了一個實用的概述。基於這個原因,本書不包括對這些數據結構與算法的正式分析。因此,本處沒有單一的數學公式也沒有提到大O分析(如果你不知道這是什麼意思,可以參考本書中提到的任何一本書)。取而代之,不同的數據結構及算法被用做解決問題的工具,以此來展示他們。簡單的時間測試被用來比較書中討論的數據結構及算法的性能。

預備知識

本書唯一需要讀者具有的預備知識是對C#有一個大概了解。特別是C#面向對象編程這方面。

章節組織

第1章介紹了數據結構作為一個數據集合的概念,線性與非線性集合類的概論;演示了集合類。本章也引入了泛型編程的概念,它允許程序員編寫一個適用於多種數據類型的類或方法。泛型是C#中添加的一個重要的特性,以至於針對(用於C#2.0及以後的版本)泛型數據類型在System.Collections.Generic命名空間下增加了一個專門的類庫。當此類庫中有某一數據結構的泛型實現的時候,我們將研究它的用法。在本章末尾,我們將討論衡量本書介紹的數據結構與算法性能的方法。

第2章回顧了數組是怎樣構建的同時演示了Array類的一些特性。Array類封裝了許多與數組操作有關的功能(如UBound,LBound等等)。ArrayList是一種特殊的數組,其提供了動態調整大小的能力。

第3章介紹了基本的排序算法,向冒泡排序,插入排序。第4章研究了大部分基本的內存查找算法,順序查找與二分查找。

第5章討論了兩種經典的數據結構,棧與隊列。本章的重點是這些數據結構在解決每天遇到的數據處理問題時的實用。第6章包含了BitArray類,其可以被用來高效的表示大量的整型數值,如測試分數。

    字符串通常不是數據結構的圖書所討論的內容,但第7章介紹了字符串,包括String類和StringBuilder類。C#中許多數據操作是對字符串執行的,讀者應該了解這兩個類中所包含的特殊技巧。第8章講解了正則表達式在進行文本處理及樣式匹配時的作用。正則表達式提供了比傳統字符串處理函數及方法更強大更高效的處理能力。

    第9章介紹了字典這種數據結構的使用。字典以及基於它們的其它不同的數據結構,將數據存儲為鍵/值對。本章給讀者展示了基於DictionaryBase這個抽象類來創建自己的類型的方法。第10章涵蓋了哈希表,講述了使用HashTable這種特殊的字典類型的哈希方法在內部保存數據的方法。

    第11章講述了另一個經典的數據結構 – 鏈表。C#中的鏈表並不像如C++這種基於指針的程序設計語言中的鏈表一般重要。但在C#編程中也有它自己的角色。第12章介紹了另一種經典的數據結構 – 二叉樹。二叉樹中的一種特殊形式 – 二叉查找樹是本章的主題,其它類型的二叉樹被安排在第15章討論。

    第13章演示了怎樣在集合類中存儲數據。當只能在某一數據結構中存儲獨一無二的數據值時這種數據類型相當有用。第14章包括了更多的高效排序算法,如流行且高效的快速排序,這也是實現.Net Framework類庫過程中所用到的大部分排序過程的基礎。第15章研究了在討論二叉查找樹時沒有涉及到的三種提供有用的查找功能的數據結構 – AVL樹,紅-黑樹及跳躍表。

    第16章討論了圖與圖算法。圖在展示許多不同類型的數據,尤其是網絡的時候十分有用。第17章介紹了算法設計技術的根本:動態算法和貪婪算法。

致謝

    許多不同類型的人幫助我完成此書,在此我向他們致謝。首先,謝謝那些首次聽我講述數據結構與算法的學生。他們是(沒有前後順序):Matt Hoffman, Ken Chen, Ken Cates, Jeff Richmond, and Gordon Caffey。 同樣我在Pulaski技術學院的同事Clayton Ruff聽了我的大部分課程並提供了很有價值的意見與批評。我同樣要感謝我的系主任David Durr及系主席Bernica Tackett,他們支持者我的寫作。同樣我要感謝我的家人在我投身於研究與寫作期間給我的支持。最後,要給劍橋出版社我的編輯Lauren Cowles和Heather Bergman很多的感謝,他們回答我的問題,幫助進行標題的更換以及容忍我習慣性的延期。

 

  1. 介紹集合類,泛型類及計時類

本書討論了基於C#語言的數據結構和算法的開發與實現。本書使用的數據結構源於.Net Framework類庫中System.Collections命名空間中所包含的類。在本章中我們首先實現一個我們自己的集合類(使用數組作為我們自己實現的基礎)來建立對於集合的概念,然後學習.Net Framework中的集合類。

C#2.0中引入的一個重要的新特性是泛型。使用泛型C#程序員使用可以編寫一個版本的函數 – 或獨立或存在於一個類中,在不用重載此函數多次的情況下即可接受不同的數據類型。C#2.0提供了一個特殊的命名空間,System.Collections.Generic,其中包含了System.Collections中數據結構的實現。本章將給讀者介紹泛型編程。

最後,本章將引入一個自定義類型,他將在以後章節中作為測量數據結構或算法性能的工具。這個類將取代大O分析,並不是大O分析不重要。而是因為本身采用一種更實用的方法來講授數據結構及算法。

集合定義

    有序集合是一種用來存儲數據的容器類型的數據結構,它提供向此容器添加數據,由其中移除數據,更新其中數據的方法同時提供了操作來設置或返回集合中不同屬性的值。

    集合類可以被分為兩種類型:線性和非線性。線性集合是一個元素的列表,其中後一個元素跟著前一個元素。線性集合中元素按位置(第一個,第二個,第三個等等)排序。在現實生活中,雜貨店商品列表就是一個線性集合的好例子,在計算機世界中(現實中也一樣),數組被設計為一個線性集合。

    非線性集合中的元素設有位置上的先後順序。組織圖標就是一個非線性集合的例子,就像撞球的架子。在計算機中,樹,堆,圖,無序集合都是非線性集合的例子。

    集合,無論是線性的還是非線性,都定義了一系列屬性來描述它們,並且定義了在它們上面可以執行的操作。集合的屬性的例子有集合Count屬性,它保存了集合中元素的數量。集合上定義的操作,也被稱為方法。包含了Add(向集合增加一個元素),Insert(在指定位置插入一個元素),Remove(移除指定的元素),Clear(移除集合中所有元素),Contains(確定指定元素是否為集合的一個成員),IndexOf(確定一個指定元素在集合中的位置)。

集合描述

    集合的兩個主要類型中又包含了幾種子類型。線性集合中既可直接訪問的集合也有需要順序訪問的類型。同樣非線性集合也分為層次化的或分組的。本部分分別講述了以上這幾種子類型。

直接訪問集合

直接訪問集合中最常見的例子就是數組。數組定義為一系列相同類型元素的集合,且可以通過一個整數索引直接訪問它的元素。如圖1.1所示

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved