方法一:蛮力法 最简单的方法就是遍历两个集合,针对集合中的每个元素判断是否有交集,如果有,则求出它们的交集,实现代码如下:
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 getlntersection(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.getMinO,s2.getMax())
else:
return None
def getlntersection2(11,12):
result=[]
i=0
while i<len(11):
j=0
while j<len(12):
s=getIntersection(11[i,12[j])
if s!=None:
result.append(s)
j+=1
i+=1
return result
if __name__="__main__":
11=[]
12=[]
11.append(MySet(4,8))
11.append(MySet(9,13))
12.append(MySet(6,12))
result=getIntersection2(11,12)
i=0
while i<len(result):
print "["+str(result[i].getMin())+","+str(result[i].getMax())+"]"
i+=1
代码运行结果为:
[6,8]
[9,12]
算法性能分析: 这种方法的时间复杂度为O(n
2)。
方法二:特征法 上述这种方法显然没有用到集合有序的特点,因此,它不是最佳的方法。假设两个集合为s1,s2。当前比较的集合为s1[i]和s2[j],其中,i与j分别表示的是集合s1与s2的下标。可以分为如下几种情况:
1)s1集合的下界小于s2的上界,如下图所示:
在这种情况下,s1[i]和s2[j]显然没有交集,那么接下来只有s1[i+1]与s2[j]才有可能会有交集。
2)s1的上界介于s2的下界与上界之间,如下图所示:
在这种情况下,s1[i]和s2[j]有交集(s2[j]的下界和s1[i]的上界),那么接下来只有s1[i+1]与s2[j]才有可能会有交集。
3)s1包含s2,如下图所示:
在这种情况下,s1[i]和s2[j]有交集(交集为s2[j]),那么接下来只有s1[i]与s2[j+1]才有可能会有交集。
4)s2包含s1,如下图所示:
在这种情况下,s1[i]和s2[j]有交集(交集为s1[i]),那么接下来只有s1[i+1]与s2[j]才有可能会有交集。
5)s1的下界介于s2的下界与上界之间,如下图所示:
在这种情况下,s1[i]和s2[j]有交集(交集为s1[i]的下界和s2[j]的上界),那么接下来只有s1[i]与s2[j+1]才有可能会有交集。
6)s2的上界小于s1的下界,如下图所示:
在这种情况下,s1[i]和s2[j]显然没有交集,那么接下来只有s1[i]与s2[j+1]才有可能会有交集。
根据以上分析给出实现代码如下:
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 getlntersection(11,12):
result=[]
i=0
j=0
while i<len(11)and j<len(12):
s1=11[i]
s2=12[j]
if s1.getMin()<s2.getMin():
if s1.getMax()<s2.getMin():
i+=1
elif s1.getMax()<=s2.getMax():
result.append(MySet(s2.getMin(),s1.getMax(()))
i+=1
else:
result.append(MySet(s2.getMin(),s2.getMax()))
j+=1
elif s1.getMin()<=s2.getMax():
if s1.getMax()<=s2.getMax():
result.append(MySet(s1.getMin(),s1.getMax()))
i+=1
else:
result.append(MySet(s1.getMin(),s2.getMax()))
j+=1
else:
j+=1
return result
if __name__="__main__":
11=[]
12=[]
11.append(MySet(4,8))
11.append(MySet(9,13))
12.append(MySet(6,12))
result=getIntersection(11,12)
i=0
while i<len(result):
print "["+str(result[i].getMin())+","+str(result[i].getMax())+"]"
i+=1
算法性能分析: 这种方法的时间复杂度为O(N1+N2),其中N1、N2分别为两个集合的大小。