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