資料結構與演算法 學習記錄(壹)

2021-10-01 23:23:07 字數 3716 閱讀 9136

群集是一種結構化的資料型別。

群集可以分為兩類:線性的和非線性的。

線性群集是一張元素列表,表中的元素順次相連。線性群集中的元素通常由位置來決定次序(例如,第乙個元素、第二個元素、第三個元素,依次類推)。在現實世界中,購物清單就是很好的線性群集例項。而在計算機世界中(當然這也是真實世界)則把陣列設計成線性群集。

非線性群集所包含的元素在群集內沒有位置次序之分。組織結構圖就像用架子壘好的撞球一樣是乙個非線性群集的例項。而在計算機世界中樹、堆、圖和集都是非線性群集。

群集 count 就是群集屬性的乙個例項。它儲存著群集中資料項的數量。這裡把群集的操作稱為方法,它包括 add(即向群集新增新元素),insert(即在群集指定的索引位置新增新元素)、remove(即從群集中移除指定元素)、clear(即從群集中移除所有元素)、contains(即確定指定元素是否是群集的成員)、以及 indexof(即確定指定元素在群集中的索引位置)。

在兩種主要的群集類中有幾個子類別。線性的群集可能是直接訪問群集,也可能是順序訪問群集。而非線性的群集既可以是層次群集,也可以是組群集。

直接訪問群集最常見的例項就是陣列。

陣列可以是靜態的,這樣當宣告陣列的時候便於針對程式的長度來固定指定元素的數量。陣列也可以是動態的,通過 redim 或者 redim preserve 語句就可以增加陣列元素的數量。

在 c#語言中,陣列不只是內建的資料型別,它還是一種類。

我們可以用陣列來儲存乙個線性的群集。向陣列新增新元素是很容易的,只要簡單地把新元素放置在陣列尾部第乙個空位上就可以了。但是,在陣列中插入乙個元素就不是這麼容易的(或高效)了。因為要給插入的元素空出位置,所以需要按順序向後移動陣列元素。從陣列的尾部刪除乙個元素也是很有效率的操作,只要簡單地移除掉最後乙個元素的值就可以了。但是,刪除陣列中任何其他位置上的元素就沒有這麼有效率了,就像處理插入操作一樣,為了保持陣列中元素的連續性,可能需要先前調整許多陣列元素的位置。

字串是直接訪問群集的另外一種型別。字串是字元的群集。和訪問陣列元素的方式一樣,也可以基於字元的索引對其進行訪問。在 c#語言中,字串也是作為類物件來實現的。這個類包含乙個在字串上執行標準操作的龐大的方法集合,其中操作有串連線、返回子串、插入字元、移除字元等等。

c#字串是不可變的。這意味著一旦對字串進行了初始化,就不能再改變它了。當要修改字串的時候,不是改變原始的字串,而是建立乙個字串的副本。在某些情況下這種行為可能會導致效能下降。

c#語言的結構所增加的強大能力就是為執行儲存在資料上的操作定義了方法。儘管不能從結構繼承或推導出一種新的型別,但是這種做法使得結構在某些地方很像乙個類。

由於不能直接訪問線性表的元素,為了訪問某個元素就需要遍歷線性表直到到達要找元素的位置為止。線性表的實現通常允許兩種遍歷表的方法:一種是單向從前往後遍歷,而另一種則是雙向遍歷,即從前向後和從後先前遍歷。

線性表的某些型別限制訪問資料元素。這類線性表有堆疊和佇列。堆疊是一種只允許在表頭(或頂端)訪問資料的表。在表的頂端放置資料項,而且也只能從表的頂端移出資料項。正是基於這種原因,堆疊也被稱為後進先出結構。這裡把向堆疊新增資料項的操作稱為入棧,而把從堆疊移出資料項的操作稱為出棧。

佇列是一種只允許在表尾進行資料項新增和移出操作的表。它也被稱為是先進先出結構。這裡把向佇列新增資料項稱為 enqueue,而把從佇列移出資料項稱為 dequeue。

最後要討論的一類線性群集被稱為通用的索引群集。這類群集的第一種就是雜湊表。它儲存了一組與關鍵字相關聯的資料值。在雜湊表中有乙個被稱為雜湊函式的特殊函式。此函式會取走乙個資料值,並且把此資料值(稱為關鍵字)轉換成用來取回資料的整數索引。然後此索引會用來訪問訪問與關鍵字相關聯的資料記錄。c#語言有乙個稱為 hashtable 的類用來儲存雜湊表的資料。

另外一種通用的索引群集就是字典。字典也被稱為聯合,它是由一系列鍵值對構成的。此結構與詞典類似,詞典中的詞是關鍵字,而詞的定義則是與關鍵字相關聯的值。關鍵字就是與其相關聯的值內的索引。雖然索引不需要就是整數,但是由於上述這種索引方案,所以還是常把字典稱為聯合陣列。

非線性群集分為兩大主要型別:層次群集和組群集。層次群集是一組劃分了層次的資料項集合。位於某一層的資料項可能會有位於下一較低層上的後繼資料項。

樹是一種常見的層次群集。樹群集看上去像是一棵倒立的樹,其中乙個資料項作為根,而其他資料值則作為葉子掛在根的下面。樹的元素被稱為節點,而且在特定節點下面的元素被稱為是此節點的孩子。

二叉樹是樹群集的一種特殊型別,樹中每個節點最多只有兩個孩子。二叉樹可以變成二叉查詢樹,這樣做可以極大地提高查詢大量資料的效率。實現的方法是依據從根到要儲存資料的節點的路徑為最短路徑的方式來放置節點。還有一種樹型別就是堆。堆這樣組織就是為了便於把最小資料值始終放置在根節點上。在刪除時會移除根節點。此外,堆的插入和刪除操作總是會導致堆的重組,因為只有這樣才能把最小值放在根節點上。我們經常會用堆來排序,這被稱為是堆排序。通過反覆刪除根節點以及重組堆的方式就可以對儲存在堆內的資料元素進行排序。

資料項為無序的非線性群集被稱為組。集合、圖和網路是組群集的三種主要型別。集合是一種無序資料值的群集,並且集合中每乙個資料值都是唯一的。當然,就像整數一樣,班級中學生的列就是乙個集合的例項。在集合上執行的操作包括聯合和交叉。

.net 框架庫不包括用於儲存資料的通用 collection 類,但是大家可以使用一種抽象的類 collectionbase 類來構造屬於自己的 collection 類。collectionbase 類為程式設計師提供了實現定製 collection 類的能力。collectionbase 類隱含實現了兩個為構造 collection 類所必需的介面,即 icollection 和 ienumerable,而留給程式設計師要做的工作就只是對這些作為 collection 類特殊內容的方法的實現。

在 c#語言中定義乙個collection 類最簡單的方法就是把在 system.collections庫中已找到的抽象類collectionbase類作為基礎類。此類提供了一套可以實現構造自身群集的抽象方法集合。collectionbase 類還提供了一種基礎的資料結構—innerlist(乙個 arraylist)。此結構可以用作自身類的基礎。如何使用 collectionbase 來構造collection 類。

彌補 collection 類的全部方法包括一些與類的基礎資料結構 innerlist 相互動的型別。第一部分要實現的方法是 add 方法、remove 方法、count 方法和 clear 方法。儘管定義的其他方法可以使類更有用,但是上述這些方法是類的絕對基本要素。

using system;

using system.collections;

class program

console.writeline(names.count());

names.remove("names1");

console.writeline(names.count());

names.clear();

console.writeline(names.count());}}

class collection : collectionbase

public void remove(object item)

public new void clear()

public new int count()

}

物件導向程式設計的問題之一就是所謂「**膨脹」的特徵。為了說明方法引數所有可能的資料型別而需要過載某種方法或過載一套方法集合的時候,就會發生某種型別的**膨脹。**膨脹的解決方案之一就是使某個值呈現多種資料型別的能力,同時僅提供此值的一種定義。這種方法被稱為是泛型程式設計。泛型程式設計提供資料型別「佔位符」。它在編譯時由特定的資料型別填充。這個佔位符用一對尖括號(< >)和放在括號間的識別符號來表示。

資料結構與演算法學習記錄(堆疊應用)

例如中綴表示式為a b c,其對應的字尾表示式是abc 首先將其轉化為全括號表示式 a b c 看表示式的右括號,如果把操作符 移到右括號的位置,替代它,再把左括號刪去,這個式子就可以變成字尾形式 字尾表示式的操作符要比運算元晚輸出,而實際掃瞄中綴表示式時,在碰到第二個運算元之前,已經掃瞄到了操作符...

資料結構與演算法學習記錄 快速排序

快速排序的基本思想 分治法,即,分解,求解,組合 分解 在無序區r low.high 中任選乙個記錄作為基準 通常選第乙個記錄,並記為pivot,其下標為pivotpos 以此為基準劃分成兩個較小的子區間r low,pivotpos 1 和r pivotpos 1 high 並使左邊子區間的所有記錄...

資料結構與演算法學習

我想重新學習一下資料結構與演算法,打好基礎。to measure is to know.我們用演算法複雜度t n 來表示演算法的效率,效能。t n 的取值 所有問題規模為n的問題例項中,將他們的計算成本進行總體的比較,取出最壞情況下的值。有幾點需要catch,1.演算法執行的時間,會根據程式語言,作...