Nombre maximum d'intersections

24 August 2013

Algorithme Interview

Etant donné une liste d'intervalles fermés [a1, b1], [a2, b2], ..., [an, bn]. Trouver le plus grand nombre Q tel qu'il existe un nombre qui appartient à Q intervalles.

L'astuce pour résoudre ce problème est de considérer de façon indépendante la liste des débuts d'intervalle et la liste des fins d'intervalle.

On trouve ensuite facilement Q en parcourant l'ensemble des points (de début et de fin). A chaque fois qu'on rencontre un début d'intervalle, on incrémente Q. A chaque fois qu'on sort d'un intervalle, on décrémente Q. La solution est la valeur maximale de Q.

Voici l'algorithme :

fonction findMaxOverlapingInterval([a1, b1], [a2, b2], ... , [an, bn])

    A := tableau des a1 à an
    B := tableau des b1 à bn

    trier(A)
    trier(B)

    indexA := 1
    indexB := 1
    q := 0
    maxq := 0

    Tant que indexA <= n
        si A[indexA] < B[indexB] alors
            indexA := indexA + 1
            q := q + 1
            si q > maxq alors maxq = q
        finsi
        si A[indexA] > B[indexB] alors
            indexB := indexB + 1
            q := q - 1
        finsi
        si A[indexA] = B[indexB] alors
            // Pas de changement pour q
            indexA := indexA + 1
            indexB := indexB + 1

    retourne maxq

La compléxité de l'algorithme est O(n * logn), à cause de l'étape de tri initiale.

L'implementation en java est disponible sur github.

Le saviez vous ?




Sur Internet