對已知有限集合中缺失或重複元素的查詢

2021-09-06 06:37:41 字數 1007 閱讀 3047

問題描述: 一直有限集u,u內元素各不相同,先從u中刪去/新增元素 x1, x2, ... , xn (0<=n<=u.length, xi 屬於 u)得到 u',找出所有刪去/新增的元素, 要求時間複雜度為o(n),空間複雜度為o(1)

1.先討論最簡單的情況,我們只從集合u中刪除/新增 1個元素

例如, u =   u' =

又如   u =   u' =

這種情況解法很簡單,一般來講如下:

1) 設sum(u)表示集合u所有元素之和,則刪除的元素為 sum(u) - sum(u'), 新增的元素為 sum(u') - sum(u)

2) 根據異或的性質, a ^ a = 0, a ^ 0 = a, 設新增或刪除的元素為x, 可知 u ^ u' = x

2. 假設是從集合u中刪除/新增 2 個元素 a, b, 又如何

1) 假設sum(u)表示u所有元素之和,容易知道 sum(u) - sum(u') = +/- (a + b),由數學知識容易知道解2元方程需要兩個方程,那麼現在需要構造第二個方程。設product(u)表示u所有元素之積,那麼 product(u) / product(u') = a*b 或 1/(a*b), 如果說這裡product(u)有可能溢位,我們可以改用平方和。那麼由這兩個方程

sum(u) - sum(u') = +/- (a + b)

product(u) / product(u') = a * b 或 1 / (a * b)

即可解出所求的a, b

2) 使用異或,實際上此時 u ^ u' = a ^ b, 我們已經無法繼續得到 a 或者 b的值

3. 假如刪除/新增的元素有n個, a1, a2, ... , an ,又如何?

1) 可以繼續使用解方程組的形式,當然你得找的到這麼多方程組,還能解得出來

2) 想到原來雙陣列查詢重複元素的方法, 可以先對 u 和 u『 進行排序,然後將元素多的陣列在 短的陣列裡進行順序查詢,找到的元素從短陣列裡刪去,找不到的元素即為重複或刪去的元素,這個演算法複雜度是排序演算法的複雜度。

python中對集合的操作

集合是無序可變,元素不能重複。集合底層是字典實現,集合的所有元素都是字典中的 鍵物件 因此是不能重複的且唯一的。1.使用 建立物件,並使用add 方法新增元素。a a a.add 4 a 2.使用set 將列表 元祖等可迭代的物件都轉成集合。如果原來資料存在重複資料,則只保留乙個。a a b c c...

java中對集合List的操作

1 建立乙個集合型別的變數 listlist new arraylist 2 新增元素 list.add 1 3 修改指定位置上元素的值 list.set 索引位置,重新賦的值 4 刪除元素利用iterator listlist new arraylist for int i 0 i 10 i sy...

C 中對List集合的理解

在我們以往的儲存資料經常使用陣列,但由於陣列大小是固定的,如果有更多的資料儲存進來,就必須重新定義陣列。現在可以使用list集合儲存資料,好處是集合大小會隨著儲存資料的多少自動增加,其實根本原理也是陣列機制,乙個空的列表內部預設建立乙個大小為0的陣列,當給列表中新增元素的時候,列表的容量會擴大為4,...