有序區間求交集演算法

2021-08-26 08:55:58 字數 990 閱讀 9365

我們知道,兩個集合的交集必定是去滿足範圍小的那個集合,因此此題的解法就是每次尋找乙個小的範圍。那麼,關鍵之處就在於如何尋找這個範圍。

如下圖所示,兩個集合和:

集合從左到右進行掃瞄,每次選取邊界的時候都是去選取值小的邊界,假設兩個陣列的索引分別為i和j並指向起始位置。

以此類推……

那麼,什麼時候確定為乙個結果子集呢?

由於掃瞄為從左到右掃瞄,開始掃瞄的時左邊界,每次總是取邊界中值較小的邊界,我們要去尋找乙個右邊界,因此達到一左一右的狀態時,即為乙個結果子集。但是,這裡有乙個重要的地方就是判斷結果是否正確。比如上面的例子中,選擇1之後的索引達到了一左一右的狀態,但是[2,10]並不是我們想要的。在我們選2之後,選8之前,i和j分別指向8和10,即在確定右邊界之前,必定要達到兩個集合的索引同時達到右邊界,然後對兩個右邊界加以判斷。因此需要加乙個標誌,去判斷確定右邊界之前是否同時達到右邊界。

public class setintersection  else 

if (a[i] < b[j]) else

if (flag == 1 && ((i % 2 == 0 && j % 2 == 1) || (i % 2 == 1 && j % 2 == 0)))

} }public static void main(string args) ;

int b = ;

new setintersection().intersection(a, b);

}}

這裡我們將兩個集合的邊界有序地放到了陣列裡面,下面是程式的輸出結果。

有興趣的朋友可以自己試著改進一下我的演算法。

求交集演算法

集合 redis 設計與實現 求交集演算法 sinter 和 sinterstore 兩個命令所使用的求並交集演算法可以用 python 表示如下 coding utf 8 def sinter multi set 根據集合的基數進行排序 sorted multi set sorted multi ...

兩個有序集合求交集

方案一 暴力法,for for,時間複雜度o n n 當資料量很大時,不可取 方案二 拉鍊法 有序集合1 有序集合2 兩個指標指向首元素,比較元素的大小 1 如果相同,放入結果集,隨意移動乙個指標 2 否則,移動值較小的乙個指標,直到隊尾 這種方法的好處是 1 集合中的元素最多被比較一次,時間複雜度...

求有序序列的交集(鍊錶)

問題描述 使用帶頭結點的單鏈表程式設計 有兩個有序序列,分別表示兩個集合。求它們的交集並輸出。注意 這裡要利用到 有序 的特性。輸入說明 第一行輸入序列a的資訊 第乙個整數n 0 n 100 表示共有n個元素,其後有n個整數,表示n個元素的資料 第一行輸入序列b的資訊 第乙個整數n 0 n 100 ...