求兩個有序整數集合的交集,比比誰的演算法快!

2022-07-10 00:51:10 字數 2912 閱讀 6874

方法一:

1

private

static setsetmethod(int a,int

b)7for(int j=0; j)

11return

set2;

12 }

方法二:

1

private

static setformethod(int a,int

b)14}15

return

set;

16 }

方法三:

1

private

static

int intersect(int a, int

b) 5int intersection = new

int[math.max(a.length, b.length)];

6int offset = 0;

7for (int i = 0, s = i; i < a.length && s < b.length; i++)

11if (a[i] ==b[s])

14while (i < (a.length - 1) && a[i] == a[i + 1]) 17}

18if (intersection.length ==offset)

21int duplicate = new

int[offset];

22 system.arraycopy(intersection, 0, duplicate, 0, offset);

23return

duplicate;

24 }

三種方法的效能對比測試:

1

public

class

numbercrosstest

7int a2 = new

int[200000];

8for (int i = 0; i < a2.length; i++)

11long begin =system.currenttimemillis();

12 setset1 =setmethod(a1, a2);

13long end =system.currenttimemillis();

14 system.out.println(end - begin);//

35915 begin =system.currenttimemillis();

16 setset2 =formethod(a1, a2);

17 end =system.currenttimemillis();

18 system.out.println(end - begin);//

16019 begin =system.currenttimemillis();

20int c =intersect(a1, a2);

21 end =system.currenttimemillis();

22 system.out.println(end - begin);//

1023

//測試兩種方法的結果是否相等

24 system.out.println(set1.equals(set2));//

true

25 setset3 = new hashset();

26for (int i = 0; i < c.length; i++)

29 system.out.println(set1.equals(set3));//

true30}

3132

private

static setsetmethod(int a, int

b) 38for (int j = 0; j < b.length; j++)

42return

set2;43}

4445

private

static setformethod(int a, int

b) 58}

59return

set;60}

6162

private

static

int intersect(int a, int

b) 66int intersection = new

int[math.max(a.length, b.length)];

67int offset = 0;

68for (int i = 0, s = i; i < a.length && s < b.length; i++)

72if (a[i] ==b[s])

75while (i < (a.length - 1) && a[i] == a[i + 1]) 78}

79if (intersection.length ==offset)

82int duplicate = new

int[offset];

83 system.arraycopy(intersection, 0, duplicate, 0, offset);

84return

duplicate;85}

86 }

結果對比:

方法一用時:359 毫秒

方法二用時:160 毫秒

方法三用時:10 毫秒

兩個有序集合求交集

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

兩個整數集合最快演算法求交集

b 兩個整數集合,設計乙個演算法求他們的交集,盡可能的高效。一 第一種演算法,暴力求解,直接採用遍歷或者列舉的方法,這種辦法最簡單易想,但是時間複雜度比較高,為 o n 2 這是最複雜的情況。二 預處理。其實思想和c語言中的預處理一樣,對資料記性歸一化處理。說白了,就是對陣列先進行排序。陣列排序的演...

Python演算法 如何求兩個有序集合的交集

兩個有序集合,集合中每個元素都是一段範圍,求其交集。例如集合和的交集為。最簡單方法就是遍歷兩個集合,針對集合中每個元素判斷是否有交集,如果有,則求其交集。方法一沒有利用集合有序的特點,因此,不是最佳的方法。假設兩個集合s1,s2,當前比較集合為s1 i 與s2 j 其中i與j分別是集合s1與s2的下...