兩個有序集合,集合中每個元素都是一段範圍,求其交集。例如集合和的交集為。
最簡單方法就是遍歷兩個集合,針對集合中每個元素判斷是否有交集,如果有,則求其交集。
方法一沒有利用集合有序的特點,因此,不是最佳的方法。假設兩個集合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...