亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#數據結構與算法揭秘二 線性結構

2020-01-24 03:39:58
字體:
來源:轉載
供稿:網友

上文對數據結構與算法,有了一個簡單的概述與介紹,這篇文章,我們介紹一中典型數據結構――線性結構。

什么是線性結構,線性結構是最簡單、最基本、最常用的數據結構。線性表是線性結構的抽象(Abstract), 線性結構的特點是結構中的數據元素之間存在一對一的線性關系。 這

種一對一的關系指的是數據元素之間的位置關系,即: (1)除第一個位置的數據元素外,其它數據元素位置的前面都只有一個數據元素; (2)除最后一個位置的數據元素外,其它數據元素位置的后面都只有一個元素。也就是說,數據元素是一個接一個的排列。因此,可以把線性結構想象為一種數據元素序列的數據結構。

線性結構(List)是由 n(n≥0)個相同類型的數據元素構成的有限序列。對于這個定義應該注意兩個概念:一是“有限” ,指的是線性表中的數據元素的個數是有限的,線性表中的每一個數據元素都有自己的位置(Position)。本書不討論數據元素個數無限的線性表。二是“相同類型” ,指的是線性表中的數據元素都屬于同一種類型。這體現在我們常用的數據結構就是數組,泛型等等他們都是線性結構的。

他們之間的關系 是:線性表的形式化定義為:線性表(List)簡記為 L,是一個二元組, L = (D, R) 其中:D 是數據元素的有限集合。 R 是數據元素之間關系的有限集合。

線性結構的基本操作如下:

public interface IListDS<T> {
int GetLength(); //求長度
void Clear(); //清空操作
bool IsEmpty(); //判斷線性表是否為空
void Append(T item); //附加操作
void Insert(T item, int i); //插入操作
T Delete(int i); //刪除操作
T GetElem(int i); //取表元
int Locate(T value); //按值查找
}

這里為什么是IListDS是與。net自帶IList相區別。對每個方法解釋如下:

1、求長度:GetLength()
初始條件:線性表存在;
操作結果:返回線性表中所有數據元素的個數。
2、清空操作:Clear()
初始條件:線性表存在且有數據元素;
操作結果:從線性表中清除所有數據元素,線性表為空。
3、判斷線性表是否為空:IsEmpty()
初始條件:線性表存在;
操作結果:如果線性表為空返回 true,否則返回 false。
4、附加操作:Append(T item)
初始條件:線性表存在且未滿;
操作結果:將值為 item 的新元素添加到表的末尾。
5、插入操作:Insert(T item, int i)
初始條件:線性表存在,插入位置正確()(1≤i≤n+1,n 為插入前的表長)。
操作結果:在線性表的第 i 個位置上插入一個值為 item 的新元素,這樣使得原序號為 i,i+1,…,n 的數據元素的序號變為 i+1,i+2,…,n+1,插入后表長=原表長+1。 
6、刪除操作:Delete(int i)
初始條件:線性表存在且不為空,刪除位置正確(1≤i≤n,n 為刪除前的表長)。
操作結果:在線性表中刪除序號為 i 的數據元素,返回刪除后的數據元素。刪除后使原序號為 i+1,i+2,…,n 的數據元素的序號變為 i,i+1,…,n-1,刪除后表長=原表長-1。
7、取表元:GetElem(int i)
初始條件:線性表存在,所取數據元素位置正確(1≤i≤n,n 為線性表的表長) ; 操作結果:返回線性表中第 i 個數據元素。
8、按值查找:Locate(T value)
初始條件:線性表存在。
操作結果:在線性表中查找值為 value 的數據元素,其結果返回在線性表中首次出現的值為 value 的數據元素的序號,稱為查找成功;否則,在線性表中未找到值為 value 的數據元素,返回一個特殊值表示查找失敗。

先看最簡單的線性結構――順序表

什么是順序表,線性結構的順序存儲是指在內存中用一塊地址連續的空間依次存放線性表的數據元素,用這種方式存儲的線性就叫順序表(Sequence List)。

順序表儲存結構如圖所示

假設順序表中的每個數據元素占w個存儲單元, 設第i個數據元素的存儲地址為Loc(ai),則有: Loc(ai)= Loc(a1)+(i-1)*w 1≤i≤n 式中的Loc(a1)表示第一個數據元素a1的存儲地址,也是順序表的起始存儲地址,稱為順序表的基地址(Base Address). 這里我們舉個例子吧,比如你去酒店的時候,知道101號房間的基準的位置,你要去111號房間,你知道每個房間之間的距離是5,那里只需要前進50米。順序表的地址運算就這么簡單。

而順序表是繼承與線性結構,他的源代碼又是這個樣子的。

public class SeqList<T> : IListDS<T> {
private int maxsize; //順序表的容量   順序表的最大容量
private T[] data; //數組,用于存儲順序表中的數據元素 用于存儲順序表的結構 
private int last; //指示順序表最后一個元素的位置  

//索引器
public T this[int index]
{
get
{
return data[index];
}
set
{
data[index] = value;
}
}

//最后一個數據元素位置屬性
public int Last
{
get
{
return last;
}
}

//容量屬性
public int Maxsize
{
get
{
return maxsize;
}

set
{
maxsize = value;
}
}

//構造器 進行函數初始化工作

public SeqList(int size) 

{
data = new T[size];
maxsize = size;
last = -1;
}

//求順序表的長度
public int GetLength()
{
return last+1;
}

//清空順序表

//清除順序表中的數據元素是使順序表為空,此時,last 等于-1。

public void Clear()
{
last = -1;
}

//判斷順序表是否為空

//如果順序表的 last 為-1,則順序表為空,返回 true,否則返回 false。
public bool IsEmpty()
{
if (last == -1)
{
return true;
}
else
{
return false;
}
}


//判斷順序表是否為滿

//如果順序表為滿,last 等于 maxsize-1,則返回 true,否則返回 false。
public bool IsFull()
{
if (last == maxsize-1)
{
return true;
}
else
{
return false;
}
}
//附加操作是在順序表未滿的情況下,在表的末端添加一個新元素,然后使順序表的last加1。

//在順序表的末尾添加新元素
public void Append(T item)
{
if(IsFull())
{
Console.WriteLine("List is full");
return;
}

data[++last] = item;
}
//順序表的插入是指在順序表的第i個位置插入一個值為item的新元素, 插入后使 原 表 長 為 n 的 表 (a1,a2, … ,ai-1,ai,ai+1, … ,an) 成 為 表 長 為 n+1 的 表(a1,a2,…,ai-1,item,ai,ai+1,…,an)。i的取值范圍為 1≤i≤n+1,i為n+1 時,表示在順序表的末尾插入數據元素。 順序表上插入一個數據元素的步驟如下: 

復制代碼 代碼如下:

//(1)判斷順序表是否已滿和插入的位置是否正確,表滿或插入的位置不正確不能插入;
//(2)如果表未滿和插入的位置正確,則將an~ai依次向后移動,為新的數據元素空出位置。在算法中用循環來實現;
//(3)將新的數據元素插入到空出的第 i 個位置上;
//(4)修改 last(相當于修改表長) ,使它仍指向順序表的最后一個數據元素。
//在順序表的第i個數據元素的位置插入一個數據元素
public void Insert(T item, int i)
{
if (IsFull())
{
Console.WriteLine("List is full");
return;
}

if(i<1 | i>last+2)
{
Console.WriteLine("Position is error!");
return;
}

if (i == last + 2)
{
data[last+1] = item;
}
else
{
for (int j = last; j>= i-1; --j)
{
data[j + 1] = data[j];
}

data[i-1] = item;
}
++last;
}


算法的時間復雜度分析:順序表上的插入操作,時間主要消耗在數據的移動上, 在第i個位置插入一個元素, 從ai到an都要向后移動一個位置, 共需要移動n-i+1
個元素,而i的取值范圍為 1≤i≤n+1,當i等于 1 時,需要移動的元素個數最多,為n個;當i為n+1 時,不需要移動元素。設在第i個位置做插入的概率為pi,則平
均移動數據元素的次數為n/2。這說明:在順序表上做插入操作平均需要移動表中一半的數據元素,所以,插入操作的時間復雜度為O(n) 。

//順序表的刪除操作是指將表中第i個數據元素從順序表中刪除, 刪除后使原表長 為 n 的 表 (a1,a2, … ,ai-1,ai, ai+1, … ,an) 變 為 表 長 為 n-1的 表(a1,a2,…,ai-1,ai+1,…,an)。i的取值范圍為 1≤i≤n,i為n時,表示刪除順序表末尾的數據元素。 

順序表上刪除一個數據元素的步驟如下:
(1)判斷順序表是否為空和刪除的位置是否正確,表空或刪除的位置不正
確不能刪除;
(2)如果表未空和刪除的位置正確,則將ai+1~an依次向前移動。在算法中
用循環來實現;
(3)修改 last(相當于修改表長) ,使它仍指向順序表的最后一個元素。

復制代碼 代碼如下:

//刪除順序表的第i個數據元素
public T Delete(int i)
{
T tmp = default(T);
if (IsEmpty())
{
Console.WriteLine("List is empty");
return tmp;
}

if (i < 1 | i > last+1)
{
Console.WriteLine("Position is error!");
return tmp;
}

if (i == last+1)
{
tmp = data[last--];
}
else
{
tmp = data[i-1];
for (int j = i; j <= last; ++j)
{
data[j] = data[j + 1];
}
}

--last;
return tmp;
}


算法的時間復雜度分析:順序表上的刪除操作與插入操作一樣,時間主要消耗在數據的移動上。在第i個位置刪除一個元素,從ai+1到an都要向前移動一個位置,共需要移動n-i個元素,而i的取值范圍為 1≤i≤n,當i等于 1 時,需要移動的元素個數最多,為n-1 個;當i為n時,不需要移動元素。設在第i個位置做刪除的概率為pi,則平均移動數據元素的次數為(n-1)/2。這說明在順序表上做刪除操作平均需要移動表中一半的數據元素,所以,刪除操作的時間復雜度為O(n) 。

//取表元運算是返回順序表中第 i 個數據元素,i 的取值范圍是 1≤i≤last+1。由于表是隨機存取的,所以,如果 i 的取值正確,則取表元運算的時間復雜度為O(1) 。

//獲得順序表的第i個數據元素 
public T GetElem(int i)
{
if (IsEmpty() | | (i<1) | | (i>last+1))
{
Console.WriteLine("List is empty or Position is error!");
return default(T);
}

return data[i-1];
}
//順序表中的按值查找是指在表中查找滿足給定值的數據元素。

在順序表中完成該運算最簡單的方法是:從第一個元素起依次與給定值比較,如果找到,則返回在順序表中首次出現與給定值相等的數據元素的序號,稱為查找成功;否則,在順序表中沒有與給定值匹配的數據元素,返回一個特殊值表示查找失敗。

復制代碼 代碼如下:

//在順序表中查找值為value的數據元素
public int Locate(T value)
{
if(IsEmpty())
{
Console.WriteLine("List is Empty!");
return -1;
}

int i = 0;
for (i = 0; i <= last; ++i)
{
if (value.Equals(data[i]))
{
break;
}
}

if (i > last)
{
return -1;
}
return i;
}
}


算法的時間復雜度分析:順序表中的按值查找的主要運算是比較,比較的次數與給定值在表中的位置和表長有關。當給定值與第一個數據元素相等時,比較次數為 1;而當給定值與最后一個元素相等時,比較次數為 n。所以,平均比較次數為(n+1)/2,時間復雜度為 O(n) 。

如:已知順序表 L,寫一算法將其倒置,即實現如圖 2.4 所示的操作,其中(a)為倒置前,(b)為倒置后。

我思考的思路就是以所在的中間數進行前后調換。相應的源代碼如下:

復制代碼 代碼如下:

public void ReversSeqList(SeqList<int> L)
{
int tmp = 0;
int len = L.GetLength();
for (int i = 0; i<= len/2; ++i)
{
tmp = L[i];
L[i] = L[len - i];
L[len - i] = tmp;
}
}


該算法只是對順序表中的數據元素順序掃描一遍即完成了倒置, 所以時間復雜度為 O(n)。其中運行效果如圖所示:

還譬如,我就我開發親身經歷而言  在俄羅斯方塊這個項目中,我的順序結構用的確實很多譬如初始化過程中。

復制代碼 代碼如下:

// 初始化形狀集合,共七種形狀
_pieces = new List<PieceBase> { new I(), new L(), new I2(), new L2(), new N(), new N2(), new O(), new T() };
// 初始化方塊容器(用 Block 對象填滿整個容器)
Container = new Block[_rows, _columns];
for (int i = 0; i < _rows; i++)
{
for (int j = 0; j < _columns; j++)
{
var block = new Block();
block.Top = i * block.rectangle.ActualHeight;
block.Left = j * block.rectangle.ActualWidth;
block.Color = null;
Container[i, j] = block;
}
}
// 初始化下一個形狀的容器(用 Block 對象將其填滿)
NextContainer = new Block[4, 4];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
var block = new Block();
block.Top = i * block.rectangle.ActualHeight;
block.Left = j * block.rectangle.ActualWidth;
block.Color = null;
NextContainer[i, j] = block;
}
}
// 創建一個新的形狀
CreatePiece();
// 呈現當前創建出的形狀
AddPiece(0, 0);
// Timer 用于定時向下移動形狀
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromMilliseconds(_initSpeed);
_timer.Tick += _timer_Tick;
GameStatus = GameStatus.Ready;

你看看我用的初始化方塊容器,這個容器是二維數組,這就是一種明顯的順序表。將他top位置,left位置賦值,進行一系列初始化工作。這就等同于順序表初始化操作。這個算法的復雜度為O(n²)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲精品一区二区| 日韩欧美中文在线| 日本欧美在线视频| 全色精品综合影院| 欧美高清不卡在线| 欧美午夜视频在线观看| 亚洲欧洲一区二区三区在线观看| 久久久999精品| 国产成人av在线播放| 欧美性videos高清精品| 亚洲欧洲一区二区三区久久| 黑丝美女久久久| 中文字幕久精品免费视频| 日韩美女av在线免费观看| 亚洲精品av在线播放| 精品久久久久久亚洲精品| 国产成人精品视| 欧美成人激情在线| 国产一区二区三区中文| 国产精品久久久久av| 亚洲iv一区二区三区| 欧美激情综合色综合啪啪五月| 欧美日韩一区二区精品| 成人久久精品视频| 欧美老女人bb| 国产三级精品网站| 精品露脸国产偷人在视频| 97视频在线观看免费高清完整版在线观看| 成人两性免费视频| 色先锋资源久久综合5566| 亚洲视频国产视频| 久久艳片www.17c.com| 欧美一区二区视频97| 亚洲激情国产精品| 欧美日韩国产专区| 精品中文视频在线| 97av视频在线| 久久好看免费视频| 亚洲日韩第一页| 国内精品美女av在线播放| 97超碰国产精品女人人人爽| 成人美女免费网站视频| 91国内揄拍国内精品对白| 亚洲bt欧美bt日本bt| 久久天天躁狠狠躁夜夜爽蜜月| 欧美黄色www| 久久亚洲一区二区三区四区五区高| 欧美一区二区三区图| 91av网站在线播放| 啊v视频在线一区二区三区| 亚洲欧洲一区二区三区久久| 国产视频精品xxxx| 欧美在线观看一区二区三区| 亚洲国产精品美女| 国产亚洲人成网站在线观看| 97视频国产在线| 91亚洲国产成人久久精品网站| 久久久女女女女999久久| 国内精品久久久久影院优| 国产精品久久久久久中文字| 国产精品久久久久久久久久久久久久| 日韩欧美国产中文字幕| 久99九色视频在线观看| 亚洲精品狠狠操| 亚洲va欧美va国产综合剧情| 亚洲精品国产精品国产自| 亚洲电影免费观看高清完整版在线观看| 中文字幕视频一区二区在线有码| 一区二区三区四区在线观看视频| 日韩在线观看免费高清完整版| 在线播放日韩专区| 91精品国产综合久久香蕉922| 国外成人免费在线播放| 亚洲男人天堂2019| 日韩一区二区av| 久久久久中文字幕2018| 成人性生交大片免费看视频直播| 清纯唯美亚洲综合| 日韩在线免费高清视频| 中文字幕亚洲专区| 久久6免费高清热精品| 精品亚洲va在线va天堂资源站| 2019av中文字幕| 在线播放日韩精品| 疯狂欧美牲乱大交777| 欧美日韩国产色视频| 亚洲第一男人av| 色老头一区二区三区| 在线视频国产日韩| 亚洲网址你懂得| 91av中文字幕| 久久精品最新地址| 亚洲最大成人在线| 91精品视频播放| 欧美综合国产精品久久丁香| 国产精国产精品| 成人高清视频观看www| 精品国产一区二区三区久久久| 国产成人亚洲综合91| 日本免费一区二区三区视频观看| 国产精品成人观看视频国产奇米| 国产视频丨精品|在线观看| 欧美限制级电影在线观看| 日韩免费不卡av| 色哟哟入口国产精品| 国产精品免费久久久久久| 日本精品一区二区三区在线| 大伊人狠狠躁夜夜躁av一区| 日韩在线观看免费全| 欧美激情一级精品国产| 国产精品一区久久| 国产精品丝袜久久久久久高清| 日韩一区二区三区在线播放| 久久久久久久久久久亚洲| 久久久影视精品| 亚洲精品v天堂中文字幕| 日韩欧美亚洲一二三区| 欧美又大又粗又长| 中文综合在线观看| 九九久久久久99精品| 中文亚洲视频在线| 欧美日韩国产丝袜另类| 日韩一中文字幕| 国产精品稀缺呦系列在线| 国产一区二区在线免费| 亚洲精品资源在线| 色婷婷**av毛片一区| 性色av一区二区三区| 日韩av在线最新| 欧美电影免费观看网站| 国产成人涩涩涩视频在线观看| 亚洲成人黄色在线观看| 久色乳综合思思在线视频| 成人激情视频在线观看| 久久99久久99精品免观看粉嫩| 日韩视频在线免费观看| 亚洲欧美另类中文字幕| 日韩电影中文字幕| 91午夜在线播放| 色综合91久久精品中文字幕| 欧美高清在线视频观看不卡| 色午夜这里只有精品| 亚洲欧美在线x视频| 日韩午夜在线视频| 久久久久久中文字幕| 日韩国产中文字幕| 国模精品视频一区二区| 91成人精品网站| 伊人成人开心激情综合网| 欧美性猛交xxxx富婆弯腰| 国产精品一区二区三区成人| 久久久精品一区| 人人澡人人澡人人看欧美| 国产成人在线一区二区| 亚洲黄色免费三级| 亚洲国产精品免费| 国产一区二区日韩精品欧美精品| 成人欧美一区二区三区黑人孕妇| 91精品国产自产91精品| 成人激情视频在线播放| 国产精品久久久久高潮| 欧美激情高清视频| 成人在线免费观看视视频| 亚洲第一精品夜夜躁人人爽|