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
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
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
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