2010-05-12 10 views
7

I kürzlich dieses Problem auf einem Test hat: Bei einem gegebenen Satz von Punkten m (alle auf der x-Achse) und einen Satz n von Linien mit Endpunkten [l, r] (wieder auf der x-Achse), finden Sie die minimale Teilmenge von n so, dass alle Punkte durch eine Linie abgedeckt sind. Beweisen Sie, dass Ihre Lösung immer die minimale Teilmenge findet.Punkt abdeckt Problem

Der Algorithmus, den ich für sie schrieb, war etwas in der Art von: (zB Linien als Arrays mit der linken Endpunkt in Position 0 und der rechten Seite in Position gespeichert sind 1)

algorithm coverPoints(set[] m, set[][] n): 
    chosenLines = [] 
    while m is not empty: 
     minX = min(m) 
     bestLine = n[0] 
     for i=1 to length of n: 
      if n[i][0] <= minX and n[i][1] > bestLine[1] then 
       bestLine = n[i] 
     add bestLine to chosenLines 
     for i=0 to length of m: 
      if m[i] <= bestLine[1] then delete m[i] from m 
    return chosenLines 

Ich bin einfach nicht sicher, ob dies immer die minimale Lösung findet. Es ist ein einfacher Greedy-Algorithmus, also sagt mir mein Bauchgefühl, dass es nicht geht, aber einer meiner Freunde, der viel besser ist als ich, sagt, dass ein gieriger Algorithmus für dieses Problem immer die minimale Lösung findet. Um zu beweisen, dass meins immer die minimale Lösung findet, habe ich eine sehr handbewaffnete Beweisführung durch Widerspruch gemacht, wo ich eine Vermutung gemacht habe, die wahrscheinlich überhaupt nicht wahr ist. Ich vergesse genau, was ich getan habe.

Wenn dies keine minimale Lösung ist, gibt es einen Weg, es in weniger als O (n!) Zeit zu tun?

Dank

+0

Ich habe Schwierigkeiten, Ihrem Pseudocode zu folgen. Was soll 'n [i] [0] <= m 'bedeuten, wenn' n [i] [0] 'ein Punkt auf der x-Achse und' m 'eine Menge ist? Kannst du ein bisschen erklären und vielleicht erklären, was deine Idee ist? Mit Satz meinen Sie eine sortierte Sammlung oder eine Sammlung? Nach welchen Kriterien bestellst du 'n'? – IVlad

+0

Entschuldigung, ich meinte <= minX. Bearbeitet. Ich hätte wahrscheinlich das Wort Array anstelle von Set für die Eingänge verwendet. Es ist geordnet, dass auf die Elemente nacheinander zugegriffen werden kann, aber nicht in dem Sinne, dass die Punkte in aufsteigender oder absteigender Reihenfolge sind. Alle Eingänge sind zufällig angeordnet, nahm ich an. Der Kern meines Algorithmus war: Arbeiten Sie von links, finden Sie die Linie mit der längsten Länge, die den ersten unbedeckten Punkt bedeckt, und fügen Sie ihn der Sammlung hinzu. Wiederholen Sie diesen Vorgang, bis alle Punkte abgedeckt sind. – Sean

+1

Betrachte die Punkte "1, 100, 101, 102, 103, 104" und die Linien "[1, 100] [10, 101] [20, 102] [30, 103] [40, 104] [101, 104 ] '. Wenn ich Ihren Algorithmus richtig verstehe, wird er '[1, 100]' wählen, um die ersten beiden Punkte zu bedecken, [10, 101] 'um die dritte, bis zu [40, 104] zu bedecken, um die letzte zu bedecken . Wir können viel besser machen, indem wir '[1, 100]' und '[101, 104]' oder '[1, 100]' und '[40, 104]' wählen. Wenn ich Ihren Algorithmus richtig verstanden habe, wird er nicht in allen Fällen funktionieren. – IVlad

Antwort

7

Ihr Greedy-Algorithmus IS korrekt. Wir können dies beweisen, indem wir zeigen, dass JEDE andere Deckung nur verbessert werden kann, indem Sie sie durch die Abdeckung ersetzen, die von Ihrem Algorithmus erzeugt wurde.

Sei C eine gültige Überdeckung für eine gegebene Eingabe (nicht unbedingt eine optimale), und sei S die Überdeckung nach deinem Algorithmus. Lassen Sie uns jetzt die Punkte p1, p2, ... pk untersuchen, die die Min-Punkte darstellen, mit denen Sie in jedem Iterationsschritt umgehen. Die Abdeckung C muss sie alle ebenfalls abdecken. Beachten Sie, dass es in C kein Segment gibt, das zwei dieser Punkte abdeckt; andernfalls hätte Ihr Algorithmus dieses Segment gewählt! Daher gilt | C |> = k. Und wie hoch sind die Kosten (Segmente) in Ihrem Algorithmus? | S | = k.

Das vervollständigt den Beweis.

Zwei Anmerkungen:

1) Umsetzung: Initialisierung BestLine mit n [0] ist falsch, da die Schleife um es zu verbessern nicht in der Lage sein kann, und n [0] nicht unbedingt minX decken.

2) Eigentlich ist dieses Problem eine vereinfachte Version des Problems Set Cover. Während das Original NP-vollständig ist, ergibt sich diese Variation als Polynom.

+0

+1, sieht gut aus und ich kann kein Gegenbeispiel finden. – IVlad

+0

Hört sich gut an, danke für die Hilfe. Ich habe vergessen, den Fall zu bedecken, wo es nicht möglich ist, die Punkte mit den gegebenen Linien zu überdecken, du hast recht. – Sean

0

Hinweis: versuchen Sie zuerst Algorithmus für die Sätze von Größe funktioniert beweist 0, 1, 2 ... und sehen, ob Sie diese verallgemeinern kann einen Beweis durch Induktion zu erstellen.

Verwandte Themen