公式化線性表的核心操作:插入、刪除、合併和搜尋
公式化線性表的操作 == 對陣列的操作
解題時可能用到的技巧:元素逆置、二分搜尋、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...