資料結構(四) 線性表的公式化描述小結

2021-10-07 02:46:38 字數 3435 閱讀 4627

公式化線性表的核心操作:插入、刪除、合併和搜尋

公式化線性表的操作 == 對陣列的操作

解題時可能用到的技巧:元素逆置、二分搜尋int型別模擬指標一點點想象力

時間空間複雜度要求:大部分情況:時間複雜度o(n),空間複雜度為o(1)。時間複雜度為o(logn)的題目較少,且最優解需要耗費時間。除非想不出其它解法,不輕易使用時間複雜度為o(nlogn)、o(n^2)解法,以及空間複雜度為o(n)的解法(比如建立大小為n的陣列)。

練習(僅供參考,部分題目非最優解)

//從順序表中刪除具有最小值的元素(假設唯一)並由函式返回被刪元素的值,空出的位置

//由最後乙個元素填補,若順序表為空則顯示出錯資訊並退出執行

elemtype deletemin

(sqlist &l)

elemtype res = data[index]

; data[index]

= data[l.length-1]

; l.length--

;return res;

}//設計乙個高效演算法,將順序表l的所有元素逆置,要求演算法的空間複雜度為大o(1)

void

reverses

(sqlist &l)

}// 對長度為n的順序表l, 編寫乙個時間複雜度為o(n)、空間複雜度為o(1)的演算法,該演算法

// 刪除線性表中所有值為x的資料元素

void

deleteallx

(sqlist &l,

const elemtype &x)

//從有序順序表中刪除其值在給定值s與t之間(要求s//為空,則顯示出錯資訊並退出執行

void

deletest

(sqlist &l,

const elemtype &s,

const elemtype &t)

//從有序順序表中刪除所有其值重複的元素,使表中的元素各不相同

void

deleterepeatsortedsqlist

(sqlist &l)

l.length = temp;

}//將兩個有序順序表合併為乙個新的有序順序表,並由函式返回結果順序表

void

mergesortedsqlist

(const sqlist &l1,

const sqlist &l2, sqlist &res)

if(s < l1.length)

}else}}

//已知在一維陣列a[m+n]中依次存放兩個線性表(a1,a2,a3,a4,..,am)和(b1,b2,b3,...,bn).

//試編寫乙個函式,將陣列中兩個順序表的位置互換,即將(b1,b2,b3,...,bn)放在

void

reversessq

(sqlist &l,

int m,

int n)

}void

swaparray

(sqlist &l,

int m,

int n)

//線性表(a1, a2,a3, ...,an)中的元素遞增有序且按順序儲存於計算機內。要求設計一演算法,完成

//用最少的時間在表中查詢數值為x的元素,若找到則將其與後繼元素位置互換,若找不到則將其插

//入錶中並使表中元素扔遞增有序。

void

binary

(sqlist &l,

const elemtype x)

else

if(l.data[p]

< x)

else

if(l.data[p]

> x)

}//找不到便插入,此時p1>p2,插入p1處,即使在邊界處也一樣

for(

int i = l.length; i>=p1;i--

) l.data[i+1]

= x;

}//設將n(n>1)個整數存放到一維陣列r中。設計乙個在時間和空間兩方面

//都盡可能高效的演算法。將r中儲存的序列迴圈左移p(0//r中的資料由(x0,x1,..,xn-1)變換為(xp,xp+1,..,xn-1,x0,x1,...,xp-1)

//需要一點想象力

/* 設計思想:將陣列分為兩個陣列ab,變換後應為ba。

首先我們分別翻轉ab,使之成為(a-1)(b-1)

再對整個陣列進行翻轉((a-1)(b-1))-1

結果為ba

*/void

cycleleft

(sqlist &l,

int m)

/* 空間複雜度:大o(1)

時間複雜度:大o(n)

*///乙個長度為l的公升序序列s,處在[l/2](向上取整)個位置的數稱為s的中位數。

//兩個等長序列的中位數是含它們所有元素的公升序序列的中位數。試設計乙個在時間

//和空間兩方面都盡可能高效的演算法,找出兩個序列a和b的中位數

/* 演算法思想:

找第[l/2](向上取整)大的數

因為是公升序序列,只需按陣列合併演算法比對就可

序列等長

*/elemtype findmedian

(const sqlist &l1,

const sqlist &l2)

return res;}/*

空間複雜度:大o(1)

時間複雜度:大o(n),非最優解,最優解為大o(logn)

最優解思想:迴圈比較兩個兩個陣列的中位數,捨棄邊緣元素(即中位數數一邊不可能為兩陣列中位數的元素),最後會得到兩個陣列的中位數相同或只剩兩個元素,若只剩兩個元素,取小的那個。

缺點:不通用,不可以用於求不等長兩陣列的中位數;邏輯繁瑣。

*///尋找主元素,即出現次數大於n/2的元素

/*首先利用名次排序,空間複雜度o(n),時間複雜度為o(n),非最優解,最優解空間複雜度為o(1)

最優解思想:取乙個int型別值依次記錄陣列元素的出現次數,相同加一,不同減一,減為0替換候選元素,出現次數

重置為一。利用了題目中主元素出現次數大於n/2的性質,不適用求出現次數最多的元素。

*/int

findmajor

(const sqlist &l,

int n)}if

(res <= n/2)

return-1

;else

return p;}/*

找出未出現的最小正整數,小於1的數直接忽略,

要求時間上高效,直接建立大小為n陣列

*/int

findminp

(const

int a)

}//時間複雜度o(n)

//空間複雜度o(n)

C 資料結構 公式化描述的佇列Queue類

公示化描述的佇列類queue include using namespace std fiifo物件 template class queue bool isempty const bool isfull const t first const 返回隊首元素 t last const 返回隊尾元素 ...

資料結構之線性表 C 陣列描述

前面我寫了幾節二叉樹,現在想想還是回過頭來吧線性表寫了 c 裡提供了強大的stl 標準模板庫 而且很多大神和相關書籍多提倡我們使用stl,切勿盲目自己寫,這樣反而效率更低。但是在使用stl的同時,能夠了解如何實現簡單的stl是很爽的。c 程式常用的資料描述方式是陣列描述和鏈式描述,而線性表可以用來說...

資料結構之線性表(C ) 鏈式描述

一般分為單鏈表,雙鏈表和迴圈鍊錶 單向或雙向 單鏈表結構是每個節點只有乙個鏈,例如 迴圈鍊錶是單鏈表的一種變種,單鏈表是將尾節點置為null,而迴圈鍊錶是將尾節點指向頭結點。定義節點的結構 template struct chainnode chainnode const t element cha...