1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| # -*- coding:utf-8 -*-
from pprint import pprint as pp
from random import randint
class Intervalle(object):
def __init__(self,inf,sup,qui=list()):
self.inf = inf
self.sup = sup
self.qui = qui
def isdisjoint(self,other):
# self et other sont-ils disjoints ?
return self.sup < other.inf or other.sup < self.inf
def union(self,other):
# union de deux intevalles non disjoints
assert not self.isdisjoint(other)
return Intervalle(min(self.inf,other.inf),max(self.sup,other.sup),sorted(self.qui+other.qui))
def __repr__(self):
return "[%d;%d] (%s)" % (self.inf,self.sup,'' if not self.qui else ','.join(map(lambda q:"%02d"%q,self.qui)))
# ton exemple du post#10
L = [[1428, 2111], [2332, 7328], [2332, 4496], [2332, 3480], [7098, 8040], [8045, 9060], [8617, 9946], [9151, 9946], [9937, 15715], [11300, 15715], [13520, 15715], [16041, 20969], [16041, 18964], [20942, 24767], [24761, 28024], [27850, 30494], [27850, 28865], [30143, 31822], [30489, 31822], [31433, 31822], [32157, 41577], [41614, 44514], [44375, 45594], [45802, 49218], [48132, 49218], [49564, 50734], [50690, 51963], [51961, 53144], [53150, 54672], [54812, 58837], [54812, 58127], [54812, 56504], [54812, 55750], [58684, 59762], [59732, 61839], [63625, 65263], [65258, 65795], [65789, 70988], [69977, 70988], [71035, 76362], [72205, 75105], [73847, 75115], [76123, 79464], [76430, 79464], [77480, 79464], [79248, 79464], [79769, 81235], [80899, 85537], [83338, 85537], [85543, 88313], [85543, 86583], [88251, 91398], [90776, 91398], [91483, 94366], [91483, 93947], [91483, 93085], [91483, 92367], [95042, 107984], [95210, 96687], [101586, 106712], [113869, 115895], [116600, 119318], [117693, 119318], [119385, 120926], [120614, 120926], [120927, 121512], [121953, 123979], [131136, 136262]]
# j'en fais une liste d'objets "Intervalle"
L = [ Intervalle(i,s,[q]) for (q,(i,s)) in enumerate(L) ]
# liste désordonnée avec les indices entre 0 et len(L)-1
melange = list()
while len(melange) != len(L):
candidat = randint(0,len(L)-1)
if candidat not in melange:
melange.append(candidat)
# L est maintenant dans le désordre
L = [ L[i] for i in melange ]
#============ début de l'algo proprement dit
# à reculons, de n-1 à 1 (pas 0)
for i in range(len(L)-1,0,-1):
# à reculons, de i-1 à 0
for j in range(i-1,-1,-1):
# si les deux intervalles ne sont pas disjoints
if not L[i].isdisjoint(L[j]):
# j'en fais l'union (indice le + petit)
L[j] = L[j].union(L[i])
# je supprime l'élément de plus grand indice (i)
# ca ne perturbe pas ma boucle for i
del L[i]
# j'arrete la recherche (boucle for j)
break
#============ fin de l'algo proprement dit
# tri uniquement là pour l'affichage
L.sort(key=lambda e:e.inf)
pp(L) |
Partager