數據結構與算法之線性結構

什麼是線性結構?

線性結構時最常見,最普片的一種屬覺結構,線性表是線性結構的一種抽象。線性結構的特點是,線性結構數據元素之間存在着一對一的關係,這種元素之間的關係是指他們的位置關係,而這種一對一之間的元素關係是指:(1)除第一個元素外,它的前面永遠都只有一個元素,(2)除最後一個元素外,他的前面永遠只有一個元素。也就是說線性結構是數據一個挨着一個排列的。

在C#中常用的線性結構比較?

《1》先來說說內存連續的線性結構

在C# 中,我們通常要存儲一組數據,我們通常會想到: 數組,ArrayList,List這三個線性對象,而它們之間有什麼區別呢?我們先來說說數組。
數組由許多優點,比如說他內存是連續存儲的,當我們修改值,索引值的時候非常方便,而且也非常的快,不用整個去遍歷,直接拿到內存進行讀取修改。
string[] s=new string[3];

//賦值
s[0]="a";
s[1]="b";
s[2]="c";

//修改
s[1]="b1";

凡事有利也有弊,數組這樣讀區到是方便很多,但是當插入,創建的時候就非常的棘手和麻煩了,當創建的時候,必須要主動的給數組對象分配一定的空間來存儲,當你分配過大會浪費空間,當你分配的過小,那麼數組會溢出,當你添加一個新的元素在指定兩個元素之間的時候,我們需要把後邊的元素進行位置移動,然後空出的位置在插入新的元素。爲了解決這個問題,我們推出了新的數據結構ArrayList,我們先來上一個例子:
ArrayList list = new ArrayList();

//新增數據
list.Add("abc");
list.Add(123);

//修改數據
list[2] = 345;

//移除數據
list.RemoveAt(0);

//插入數據
list.Insert(0, "hello world");
從上面的例子我們可以看出,同一個Arraylist 不僅可以插入“abc” string類型,同時也可以插入123 int類型,這樣可以得知ArrayList插入不同的數據類型是可以的,同樣可以推理出,它數據的插入和讀取是經過“裝箱”和“拆箱”的過程的,是不安全的數據類型,而拆箱裝箱的過程是非常影響性能的,而且它把插入的數據都當作了object來處理,既使我們保證在插入數據的時候都很小心,都有插入了同一類型的數據,但在使用的時候,我們也需要將它們轉化爲對應的原類型來處理。
之所以ArrayList不是數據安全的,並且數據的操作需要裝箱,拆箱這一嚴重缺點,所以C# 2.0 之後又相繼推出了範型接口List,他基本上是ArrayList的等效類,操作也基本上相似,唯一不一樣的地方是,在創建的時候他需要制定特定的數據類型。
List<int> list = new List<int>();

//新增數據
list.Add(123);

//修改數據
list[0] = 345;

//移除數據
list.RemoveAt(0);
這樣,如果我們插入”abc“,在編譯的時候就會報錯,這樣就有效的避免了裝箱拆箱的過程,他融合了Array快速訪問,和ArrayList長度可以靈活變化的優點

《2》內存不一定連續,但是邏輯上連續的線性結構

LinkedList<T> 鏈表:和上述集合最大的區別就是它在內存上可以不是連續的,那麼它對比集合最大的優點也就很清楚了。
(1)向容器中添加或者刪除元素,無需調整容器的容量,因爲它內存上不是連續存儲的, 他是靠元素的指針來決定的。所以頻繁刪除和增加元素它比較有優勢。
(2)鏈表適合在需要有序的情況下添加刪除元素,他和數組比較,數組添加或者刪除元素的時候,他需要把現有的元素進行存儲位置的變更,而鏈表周要改變相鄰兩個元素指針的指向就OK了。
(3)他有優點也就有缺,他由於內存上排列不是連續的,所以就不能像數組一樣,利用下標來進行直接訪問,他需要對整個鏈表進行編譯,來進行對值做比較。這一點遠遠不能和數組相比。

Queue<T> 隊列:在這種線性結構中,最先被插入的數據是最先被刪除,反之最後插入的數據則最後被刪除,因此,他是一種先進先出的線性表結構對象。因此我們在使用他需要注意幾點:
 (1)先進先出的特性。
 (2)在默認情況下,Queue<T>的容量爲32,增長因子爲2
 (3)當Enqueue時,會先判斷他的容積是不是夠用,不夠用的時候,他會根據增長因子來擴充自己的容器。
Stack<T>  堆棧:這個是和Queue<T>相反的一個容器,他當然是先先進後出的,同時需要注意的就是它的默認容器爲10,使用Pop和push來進行操作。

結束:

常用的線性結構就基本上寫完了,在實際的編程過程中,你面對一些問題的時候,就可以根據數據的操作取向來進行選擇相應的數據結構,這樣就能夠揚長避短。

 

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