標籤(空格分隔): 演算法 資料結構
對乙個線性表(課程裡面用vector指代),如果想要進行它的唯一化處理,就需要每一種元素僅僅保留乙個。比如說,進行唯一化處理之後,就是。
下面有必要分兩種情況進行討論。
線性表無序。如果線性表開始就是無序的,那麼顯然不存在什麼簡化演算法,只能從頭開始,依次遍歷,相互比較.
vector
a
...... //假設a已經初始化,非空了
for (int i=0;ifor (int j=i+1;jif (a[i]==a[j])
remove(j);
顯然,這個演算法複雜度是o(n^2),效率比較低。但是,對於無序表,這個演算法是我們能想到的較好的演算法了。
2. 線性表有序。既然有序,那我們就能想到這樣乙個演算法了:對每一部分相同項,都拿它們的第乙個向後比較,刪除所有其他的相同項。演算法實現如下。
for (int i=0;isize();)
這個演算法貌似很合理,但是不要忘了,remove操作也包含著o(n)的時間複雜度,再加上迴圈,可以很容易的看出,這個演算法在最壞情況下,就是序列全為相同元素的情況下,每次迴圈需執行的操作步數為n-1,n-2,……,2,1,時間複雜度也是o(n^2),與無序序列沒有差別。所以,這並不是個好演算法。
再看下面這乙個
int i=0
;if (i
這個顯然比上面那個要好。因為他的時間複雜度為o(n)。while迴圈語句起的作用僅僅是計算重複序列下標的作用,下面的if分支並沒有包含在while內。但是,因為用了太多變數,這個演算法還不是最好的。
再看下面這個。
for (int i-0
;iint i=0,j=0
;while (++ji++;shrink();
}
這個演算法實現了上乙個演算法的思想,而且沒有用到逐次刪除,只是在最後將所有冗餘元素一次刪除完了。它沒有用到多次刪除函式,而是一種隱式的刪除,就是把j元素移到i+1處,將那個重複元素覆蓋掉。目前來看,這個才是唯一化處理有序線性表的最優演算法。 資料結構 線性表的唯一化演算法
標籤 空格分隔 演算法 資料結構 對乙個線性表 課程裡面用vector指代 如果想要進行它的唯一化處理,就需要每一種元素僅僅保留乙個。比如說,進行唯一化處理之後,就是。下面有必要分兩種情況進行討論。線性表無序。如果線性表開始就是無序的,那麼顯然不存在什麼簡化演算法,只能從頭開始,依次遍歷,相互比較....
資料結構 線性表演算法
1.線性表 線性表是n個具有相同特性的資料元素的有限序列。線性表的主要儲存結構 順序儲存結構 順序表 鏈式儲存結構 鍊錶 2.順序儲存 儲存空間連續,用一組連續的儲存單元依次存放資料元素 即邏輯上相鄰的元素,其物理位置也相鄰。優點 隨機訪問 缺點 插入刪除結點困難 擴充套件不靈活 3.鏈式儲存 儲存...
資料結構 線性表(一)
我們在學習c語言的時候都用過陣列,再學深一點大概會學到結構體,鍊錶之類的。正常情況下,對於這一類的資料結構,我們都能看到他們的共同點。每乙個資料項之間都只跟另乙個資料項鏈結,所以我們把這一類的資料結構叫做線性表。不考慮實際記憶體位址的分配,從邏輯意義上看,我們可以把資料項都連起來,形成乙個像表一樣的...