问答题 3.  有两个有序的集合,集合中的每个元素都是一段范围,求其交集,例如集合{[4,8],[9,13]}和{[6,12]}的交集为{[6,8],[9,12]}。
【正确答案】方法一:蛮力法
   最简单的方法就是遍历两个集合,针对集合中的每个元素判断是否有交集,如果有,则求出它们的交集,实现代码如下:
   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(n2)。
   方法二:特征法
   上述这种方法显然没有用到集合有序的特点,因此,它不是最佳的方法。假设两个集合为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的下界,如下图所示:
   
【答案解析】[考点] 如何求两个有序集合的交集