簡単な方法の 1 つは、ツリー構造を持つことです。ツリーのルートには、リスト全体の最小/最大値があります。次に、前半と後半などの最小/最大を与える2つの子を持ちます。これにより、O(log(n))検索アルゴリズムを使用できます。ここで、nは間隔リスト全体のサイズです。
まず、ツリーを作成します。これは、間隔のリストを 2 つに分割し、サブ間隔ごとにツリーを作成することで、再帰的に実行できます。
def makeTree(begin,end,intervals):
if end==begin:
return None
if end==begin+1:
return Node(begin,end,intervals[begin],None,None)
partition=(begin+end)/2
left=makeTree(begin,partition)
right=makeTree(partition,end)
range=combineRanges(rangeOf(left),rangeOf(right))
return Node(begin,end,range,left,right)
ツリーを取得したら、ツリーのルートをこの関数に渡すことができます。
def findRange(node,begin,end):
# If the node's range doesn't intersect the range you are looking for,
# then you don't have to look any deeper.
if node is None or begin>=node.end or end<=node.begin:
return None
# If the node's range is completely inside the range you are looking for, then
# you also don't need to look any deeper.
if begin<=node.begin and end>=node.end:
return node.range
# Otherwise, check each child.
left_range=findRange(node.left,begin,end)
right_range=findRange(node.right,begin,end)
# And return the combined result.
return combineRanges(left_range,right_range)
間隔内の任意の x に対して begin <= x < end となるように、半分開いた間隔を使用していることに注意してください。これにより、コードが少しきれいになります。