資料結構 線性表的唯一化演算法

2022-06-13 19:36:12 字數 1077 閱讀 3519

標籤(空格分隔): 演算法 資料結構

對乙個線性表(課程裡面用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語言的時候都用過陣列,再學深一點大概會學到結構體,鍊錶之類的。正常情況下,對於這一類的資料結構,我們都能看到他們的共同點。每乙個資料項之間都只跟另乙個資料項鏈結,所以我們把這一類的資料結構叫做線性表。不考慮實際記憶體位址的分配,從邏輯意義上看,我們可以把資料項都連起來,形成乙個像表一樣的...