判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...
算法思想有很多,業界公認的常用算法思想有8種,分別是枚舉、遞推、遞歸、分治、貪心、試探法、動態迭代和模擬。當然8種只是一個大概的劃分,是一個“仁者見仁、智者見智”的問題。
其實這些算法都是用來處理數據的,這些被處理的數據必須按照一定的規則進行組織。當這些數據之間存在一種或多種特定關系時,通常將這些關系稱為結構。在C語言數據之間一般存在如下3種基本結構。
- ① 線性結構:數據元素間是一對一關系。
- ② 樹形結構:數據元素間是一對多關系。
- ③ 網狀結構:數據元素間是多對多關系。
今天小編將分享第一種線性結構。
線性表詳解
線性表中各個數據元素之間是一對一的關系,除了第一個和最后一個數據元素外,其他數據元素都是首尾相接的。因為線性表的邏輯結構簡單,便于實現和操作,所以該數據結構在實際應用中被廣泛采用。在本節中,將詳細講解線性表的基本知識。
1.1.1 線性表的特性
線性表是一種最基本、最簡單、最常用的數據結構。在實際應用中,線性表都是以棧、隊列、字符串、數組等特殊線性表的形式來使用的。因為這些特殊線性表都具有自己的特性,所以掌握這些特殊線性表的特性,對于數據運算的可靠性和提高操作效率是至關重要的。
線性表是一個線性結構,它是一個含有n>=0個節點的有限序列。在節點中,有且僅有一個開始節點沒有前驅并有一個后繼節點,有且僅有一個終端節點沒有后繼并有一個前驅節點,其他的節點都有且僅有一個前驅和一個后繼節點。通??梢园岩粋€線性表表示成一個線性序列:k1,k2,…,kn,其中k1是開始節點,kn是終端節點。
1.線性結構的特征
在編程領域中,線性結構具有如下兩個基本特征。
① 集合中必存在唯一的“第一元素”和唯一的“最后元素”。
② 除最后元素之外,均有唯一的后繼;除第一元素之外,均有唯一的前驅。
由n(n>=0)個數據元素(節點)a1,a2,…,an組成的有限序列,數據元素的個數n定義為表的長度。當n=0時稱為空表,通常將非空的線性表(n>0)記作:(a1,a2,…,an)。數據元素ai(1<=i<=n)沒有特殊含義,不必去“剖根問底”地研究它,它只是一個抽象的符號,其具體含義在不同的情況下可以不同。
2.線性表的基本操作過程
線性表雖然只是一對一的關系,但是其操作功能非常強大,具備了很多操作技能。線性表的基本操作如下。
① 用Setnull(L):置空表。
② 用Length(L):求表長度和表中各元素個數。
③ Get(L,i):獲取表中第i個元素(1<=i<=n)。
④ Prior(L,i):獲取i的前趨元素。
⑤ Next(L,i):獲取i的后繼元素。
⑥ Locate(L,x):返回指定元素在表中的位置。
⑦ Insert(L,i,x):插入新元素。
⑧ Delete(L,x):刪除已存在元素。
⑨ Empty(L):判斷表是否為空。
3.線性表的結構特點
線性表具有如下結構特點。
① 均勻性:雖然不同數據表的數據元素是各種各樣的,但同一線性表的各數據元素必須有相同的類型和長度。
② 有序性:各數據元素在線性表中的位置只取決于它們的序。數據元素之前的相對位置是線性的,即存在唯一的“第一個”和“最后一個”數據元素,除了第一個和最后一個外,其他元素前面只有一個數據元素直接前趨,后面只有一個直接后繼。
1.1.2 順序表操作
在現實應用中,有兩種實現線性表數據元素存儲功能的方法,分別是順序存儲結構和鏈式存儲結構。順序表操作是最簡單的操作線性表的方法,此方式的主要操作功能有以下幾種。
(1)計算順序表的長度
數組的最小索引是0,順序表的長度就是數組中最后一個元素的索引last加1。使用C語言計算順序表長度的算法實現如下所示。
public int GetLength() {return last+1; }(2)清空操作
清空操作是指清除順序表中的數據元素,最終目的是使順序表為空,此時last等于?1。使用C語言清空順序表的算法實現如下所示。
public void Clear() {last = -1; }(3)判斷線性表是否為空
當順序表的last為?1時表示順序表為空,此時會返回true,否則返回false表示不為空。使用C語言判斷線性表是否為空的算法實現如下所示。
public bool IsEmpty() {if (last == -1) {return true; }else {return false; } }(4)判斷順序表是否為滿
當順序表為滿時last值等于maxsize?1,此時會返回true,如果不為滿則返回false。使用C語言判斷順序表是否為滿的算法實現如下所示。
public bool IsFull() {if (last == maxsize - 1) {return true; }else {return false; } }(5)附加操作
在順序表沒有滿的情況下進行附加操作,在表的末端添加一個新元素,然后使順序表的last加1。附加操作的算法實現如下所示。
public void Append(T item) {if(IsFull()) { Console.WriteLine("List is full"); return; }data[++last] = item; }(6)插入操作
在順序表中插入數據的方法非常簡單,只需要在順序表的第i個位置插入一個值為item的新元素即可。插入新元素后,會使原來長度為n的表(a1,a2,…,a(i?1),ai,a(i+1),…,an)的長度變為(n+1),也就是變為(a1,a2,…,a(i?1),item,ai,a(i+1),…,an)。i的取值范圍為1<=i<=n+1,當i為n+1時,表示在順序表的末尾插入數據元素。
在順序表插入一個新數據元素的基本步驟如下。
① 判斷順序表的狀態,判斷是否已滿和插入的位置是否正確,當表滿或插入的位置不正確時不能插入。
② 當表未滿直插入的位置正確時,將an~ai依次向后移動,為新的數據元素空出位置。在算法中用循環來實現。
③ 將新的數據元素插入到空出的第i個位置上。
④ 修改last值以修改表長,使其仍指向順序表的最后一個數據元素。
順序表插入數據示意圖如圖3-1所示。
圖1-1 順序表插入數據示意圖
使用C語言在順序表中實現插入操作的算法代碼如下所示。
public void Insert(T item, int i) { //判斷順序表是否已滿if (IsFull()) { Console.WriteLine("Listisfull"); return;}//判斷插入的位置是否正確//i小于1表示在第1個位置之前插入//i大于last+2表示在最后一個元素后面的第2個位置插入if(i<1||i>last+2){ Console.WriteLine("Positioniserror!"); return;}//在順序表的表尾插入數據元素if(i==last+2){ data[i-1]=item;}else//在表的其他位置插入數據元素{//元素移動for(intj=last;j>=i-1;--j){ data[j+1]=data[j];}//將新的數據元素插入到第i個位置上data[i-1]=item;}//修改表長++last;}在上述代碼中,位置變量i的初始值是1而不是0。
(7)刪除操作
可以刪除順序表中的第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時,表示刪除順序表末尾的數據元素。
在順序表中刪除一個數據元素的基本流程如下。
① 判斷順序表是否為空,判斷刪除的位置是否正確,當為空或刪除的位置不正確時不能刪除;
② 如果表為空和刪除的位置正確,則將ai+1~an依次向前移動,在算法中用循環來實現移動功能;
③ 修改last值以修改表長,使它仍指向順序表的最后一個數據元素。
圖1-2展示了在一個順序表中刪除一個元素的前后變化過程。圖3-2中的表原來長度是8,如果刪除第5個元素E,在刪除后為了滿足順序表的先后關系,必須將第6~8個元素(下標位5~7)向前移動一位。
圖1-2 順序表中刪除一個元素
使用C語言在順序表中刪除數據元素的基本算法實現如下所示。
publicTDelete(inti){ T tmp = default(T); //判斷表是否為空if (IsEmpty()) { Console.WriteLine("List is empty"); return tmp; } //判斷刪除的位置是否正確 // i小于1表示刪除第1個位置之前的元素 // i大于last+1表示刪除最后一個元素后面的第1個位置的元素if (i < 1 || i > last+1) { Console.WriteLine("Position is error!"); return tmp; } //刪除的是最后一個元素if (i == last+1) { tmp = data[last--]; return tmp; } else //刪除的不是最后一個元素 { //元素移動 tmp = data[i-1]; for (int j = i; j <= last; ++j) { data[j] = data[j + 1]; } } //修改表長 --last;return tmp; }(8)獲取表元
通過獲取表元運算可以返回順序表中第i個數據元素的值,i的取值范圍是1<=i<=last+1。因為表中數據是隨機存取的,所以當i的取值正確時,獲取表元運算的時間復雜度為O(1)。使用C語言實現獲取表元運算的算法實現如下所示。
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]; }(9)按值進行查找
所謂按值查找,是指在順序表中查找滿足給定值的數據元素。它就像住址的門牌號一樣,這個值必須具體到XX單元XX室,否則會查找不到。按值查找就像Word中的搜索功能一樣,可以在繁多的文字中找到需要查找的內容。在順序表中找到一個值的基本流程如下所示。
① 從第一個元素起依次與給定值進行比較,如果找到,則返回在順序表中首次出現與給定值相等的數據元素的序號,稱為查找成功。
② 如果沒有找到,在順序表中沒有與給定值匹配的數據元素,返回一個特殊值表示查找失敗。
使用C語言實現按值查找運算的算法實現如下所示。
publicintLocate(Tvalue){//順序表為空if(IsEmpty()){Console.WriteLine("listisEmpty");return-1;}inti=0;//循環處理順序表for(i=0;i<=last;++i){//順序表中存在與給定值相等的元素if(value.Equals(data[i])){ break;}}//順序表中不存在與給定值相等的元素if(i>last){ return-1;}returni;}END
喜歡的讀者請轉發到朋友圈
本文摘自《算法學習與應用從入門到精通》
總結
以上是生活随笔為你收集整理的判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中classmethod的用
- 下一篇: python函数的组成要素_python