सबसे पहले हम स्टार्ट टाइम द्वारा सूची को सॉर्ट करते हैं।
फिर हम इसे जांचते हुए लूप करते हैं कि अगला प्रारंभ समय पिछला अंत समय कम है या नहीं।
यह अगर x + 1 एक्स के साथ ओवरलैप हो जाँच करेगा (नहीं करता है, तो x + 2 एक्स के साथ, आदि overlaps)
intervals = [[100,200],[150,250],[300,400]]
intervalsSorted = sorted(intervals, key=lambda x: x[0]) # sort by start time
for x in range(1,len(intervalsSorted)):
if intervalsSorted[x-1][1] > intervalsSorted[x][0]:
print "{0} overlaps with {1}".format(intervals[x-1], intervals[x])
# result: [100, 200] overlaps with [150, 250]
निम्नलिखित पूरी सूची में आप सभी overlappings देना चाहिए।
intervals = [[100,200],[150,250],[300,400],[250,500]]
overlapping = [ [x,y] for x in intervals for y in intervals if x is not y and x[1]>y[0] and x[0]<y[0] ]
for x in overlapping:
print '{0} overlaps with {1}'.format(x[0],x[1])
# results:
# [100, 200] overlaps with [150, 250]
# [250, 500] overlaps with [300, 400]
ध्यान दें कि यह एक O (n * एन) देखने है। (अगर मैं गलत हूं तो कोई भी मुझे यहां सही करता है!)
यह संभवतः पहले की तुलना में धीमी है (इसका परीक्षण नहीं किया गया है, लेकिन मुझे लगता है कि यह है) क्योंकि यह प्रत्येक एकल अनुक्रमणिका के लिए पूरी सूची में पुनरावृत्त होता है। Loops उदाहरण के लिए arbarnert के घोंसला के समान होना चाहिए। लेकिन फिर यह आपको सभी ओवरलैपिंग मान देता है क्योंकि मैंने पहली विधि के विरोध में दिखाया है कि केवल इसके आगे के ओवरलैपिंग समय के लिए चेक किया गया है (प्रारंभ समय से क्रमबद्ध)।
विस्तारित परीक्षण देता है:
intervals = [[100,200],[150,250],[300,400],[250,500],[10,900],[1000,12300],[-151,32131],["a","c"],["b","d"],["foo","kung"]]
overlapping = [ [x,y] for x in intervals for y in intervals if x is not y and x[1]>y[0] and x[0]<y[0] ]
for x in overlapping:
print '{0} overlaps with {1}'.format(x[0],x[1])
# results:
# [100, 200] overlaps with [150, 250]
# [250, 500] overlaps with [300, 400]
# [10, 900] overlaps with [100, 200]
# [10, 900] overlaps with [150, 250]
# [10, 900] overlaps with [300, 400]
# [10, 900] overlaps with [250, 500]
# [-151, 32131] overlaps with [100, 200]
# [-151, 32131] overlaps with [150, 250]
# [-151, 32131] overlaps with [300, 400]
# [-151, 32131] overlaps with [250, 500]
# [-151, 32131] overlaps with [10, 900]
# [-151, 32131] overlaps with [1000, 12300]
# ['a', 'c'] overlaps with ['b', 'd']
क्या आप अब तक क्या ज़रूरत है? – kindall
सिर्फ यह विचार कि इसमें लूप के लिए दो की आवश्यकता है यदि दो नहीं ... – Robbie
क्रमबद्ध क्रम में प्रविष्टियां हैं? (और, यदि नहीं, तो क्या उन्हें पहले क्रमबद्ध करना उचित है?) – abarnert