Es gibt auch einen linearen Algorithmus für Zeit und konstanten Raum, der auf Partitionierung basiert. Dieser Algorithmus ist möglicherweise flexibler, wenn Sie versuchen, dies auf Varianten des Problems anzuwenden, bei denen der mathematische Ansatz nicht gut funktioniert. Dies erfordert eine Mutation des zugrunde liegenden Arrays und hat schlechtere konstante Faktoren als der mathematische Ansatz. Genauer gesagt, glaube ich , in Bezug auf die Gesamtzahl der Werte der Kosten und die Anzahl der Duplikate d sind O ( n log d ) und O ( d ) jeweils mehr Zeit rigoros obwohl Beweis nehmen , als ich im Moment haben .ndO(nlogd)O(d)
Algorithmus
Beginnen Sie mit einer Liste von Paaren, wobei das erste Paar der Bereich über das gesamte Array ist oder wenn 1-indiziert.[(1,n)]
Wiederholen Sie die folgenden Schritte, bis die Liste leer ist:
- Nimm ein beliebiges Paar aus der Liste und entferne es .(i,j)
- Finden Sie die minimale und maximale, und max , des bezeichneten Subarray.minmax
- Wenn , besteht das Subarray nur aus gleichen Elementen. Gib seine Elemente mit einer Ausnahme aus und überspringe die Schritte 4 bis 6.min=max
- Wenn , enthält das Subarray keine Duplikate. Überspringen Sie die Schritte 5 und 6.max−min=j−i
- Partitionieren Sie das Subarray um , so dass Elemente bis zu einem gewissen Indexkkleiner als das Trennzeichen sind und Elemente über diesem Index nicht.min+max2k
- Fügen Sie der Liste und ( k + 1 , j ) hinzu .(i,k)(k+1,j)
Kursive Analyse der Zeitkomplexität.
Die Schritte 1 bis 6 benötigen die Zeit , da das Finden des Minimums und Maximums und das Partitionieren in linearer Zeit erfolgen können.O(j−i)
Jedes Paar in der Liste ist entweder das erste Paar ( 1 , n ) oder ein Kind eines Paares, für das das entsprechende Subarray ein doppeltes Element enthält. Es gibt höchstens d ⌈ log 2 n + 1 ⌉ solche Eltern Da jeder Traversierung Hälften in dem der Bereich ein Duplikat sein kann, so gibt es höchstens 2 d ⌈ log 2 n + 1 ⌉ Gesamt wenn einschließlich Paaren über Subarrays mit nein Duplikate. Zu jedem Zeitpunkt beträgt die Größe der Liste nicht mehr als 2 Tage(i,j)(1,n)d⌈log2n+1⌉2d⌈log2n+1⌉2d.
Betrachten Sie die Arbeit, um ein Duplikat zu finden. Dies besteht aus einer Folge von Paaren über einen exponentiell abnehmenden Bereich, so dass die Gesamtarbeit die Summe der geometrischen Folge oder . Dies ergibt eine offensichtliche Folgerung, dass die Gesamtarbeit für d Duplikate O ( n d ) sein muss , was in n linear ist .O(n)dO(nd)n
Um eine engere Grenze zu finden, betrachten Sie das Worst-Case-Szenario, bei dem Duplikate maximal verteilt werden. Intuitiv dauert die Suche zwei Phasen, eine, bei der jedes Mal das gesamte Array durchlaufen wird, und eine, bei der die Teile kleiner als so werden nur Teile des Arrays durchlaufen. Die erste Phase kann nurlogdtief sein, hat also die KostenO(nlogd), und die zweite Phase hat die KostenO(n),weil die gesuchte Gesamtfläche wieder exponentiell abnimmt.ndlogdO(nlogd)O(n)