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

2021-09-26 03:05:34 字數 2977 閱讀 7340

兩個有序集合,集合中每個元素都是一段範圍,求其交集。例如集合和的交集為。

最簡單方法就是遍歷兩個集合,針對集合中每個元素判斷是否有交集,如果有,則求其交集。

方法一沒有利用集合有序的特點,因此,不是最佳的方法。假設兩個集合s1,s2,當前比較集合為s1[i]與s2[j],其中i與j分別是集合s1與s2的下標,可以分為幾種情況:

(1)s1集合下界小於s2上界,顯然沒有交集

(2)s1上界介於s2下界與上界之間,交集為s2下界與s1上界

(3)s1包含s2,交集為s2

(4)s2包含s1,交集為s1

(5)s1下界介於s2下界與上界之間,交集為s1下界與s2上界

(6)s2上界小於s1下界,顯然沒有交集

#方法一

# -*- coding:utf-8 -*-

class myset():

def __init__(self,mins,maxs):

self.mins = mins

self.maxs = maxs

def getmin(self):

return self.mins

def setmin(self,mins):

self.mins = mins

def getmax(self):

return self.maxs

def setmax(self,maxs):

self.maxs = maxs

def getintersection(s1,s2):

if s1.getmin() < s2.getmin():

if s1.getmax() < s2.getmin():

return none

elif s1.getmax() <= s2.getmax():

return myset(s2.getmin(),s1.getmax())

else:

return myset(s2.getmin(),s2.getmax())

elif s1.getmin() <= s2.getmax():

if s1.getmax() <= s2.getmax():

return myset(s1.getmin(),s1.getmax())

else:

return myset(s1.getmin(),s2.getmax())

else:

none

def getintersection2(l1,l2):

result =

i = 0

while i < len(l1):

j = 0

while j < len(l2):

s = getintersection(l1[i],l2[j])

if s != none:

j += 1

i += 1

return result

if __name__ == "__main__":

l1 =

l2 =

result = getintersection2(l1,l2)

i = 0

while i < len(result):

print("["+str(result[i].getmin())+","+str(result[i].getmax())+"]")

i +=1

執行結果:

[6,8]

[9,12]

#方法二

# -*- coding:utf-8 -*-

class myset():

def __init__(self,mins,maxs):

self.mins = mins

self.maxs = maxs

def getmin(self):

return self.mins

def setmin(self,mins):

self.mins = mins

def getmax(self):

return self.maxs

def setmax(self,maxs):

self.maxs = maxs

def getitersections(l1,l2):

result =

i = 0

j = 0

while i < len(l1) and j < len(l2):

s1 = l1[i]

s2 = l2[j]

if s1.getmin() < s2.getmin():

if s1.getmax() < s2.getmin():

i += 1

elif s1.getmax() <= s2.getmax():

i += 1

else:

j += 1

elif s1.getmin() <= s2.getmax():

if s1.getmax() <= s2.getmax():

i += 1

else:

j += 1

else:

j += 1

return result

if __name__ == "__main__":

l1 =

l2 =

result = getitersections(l1,l2)

i = 0

while i < len(result):

print("["+str(result[i].getmin())+","+str(result[i].getmax())+"]")

i += 1

執行結果:

[6,8]

[9,12]

方法一時間複雜度為o(方法二時間複雜度為o(n1+n2),其中n1、n2分別為兩個集合大小。

兩個有序集合求交集

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

演算法題 兩個有序陣列求中位數

leetcode上遇到的一道題,感覺很有意思 因為要求o log m n 所以第一反應時用二分來找,但是該怎麼用二分呢?陣列a,b分別有序,我們可以先找到陣列a中的一條分界線i,使得陣列a分為a left,和a right兩部分,那麼因為時要找到中位數,我們可以直接計算出b陣列的一條分界線j,使得s...

求兩個有序數列的合併 分治演算法

用分治演算法來求乙個陣列的排序 分治演算法 例如 將兩個陣列a 100 這個陣列排序 先將這個陣列分為均兩部分得到,再將分為兩部分,再分為,這時乙個數就不用排序了,直接輸出自己。簡單問題,就可以用二分或者三分來算。上 include using namespace std void hebing i...