Bestimmen der bestimmten Zahl in Zeit und Raum (schlimmster Fall)

10

, A[1..n] sind ganze Zahlen, so dass 0A[k]m für alle 1kn und das Auftreten von jedem Zahl mit Ausnahme einer bestimmten Zahl in A[1..n] ist eine ungerade Zahl. Versuchen Sie, die Nummer zu finden, deren Vorkommen eine gerade Zahl ist.

Es gibt einen Θ(nlogn) -Algorithmus: Wir sortieren A[1..n] in B[1..n] und B[1..n] in viele Teile, deren Elementwert der ist gleich, daher können wir das Auftreten jedes Elements zählen.

Ich möchte einen Worst- Case- O(n) -Zeit- und -O O(n) -Raum-Algorithmus finden.

Angenommen, m=Ω(n1+ϵ) und ϵ>0 , ist die Radix-Sortierung daher nicht akzeptabel. Binäre bitweise Operationen sind zulässig, z. B. A[1]xorA[2] .

Yai0Phah
quelle
Die Antwort von Aryabhata unten zeigt, dass der allgemeine Fall nicht gut ist, aber vielleicht haben Sie weitere Einschränkungen zur Verfügung? Eine einfache (aber große) Einschränkung wäre, zu erzwingen, dass alle Einträge im Array eine Größe von O(n) haben. Dies würde einen ziemlich trivialen linearen Algorithmus ergeben.
Luke Mathieson
1
@LukeMathieson: Ich habe diese Antwort gelöscht, da ich noch nicht davon überzeugt bin, dass das von mir zitierte Papier ohne Änderungen funktionieren wird, und außerdem scheint OP nur an dem RAM-Modell mit einheitlichen Kosten interessiert zu sein.
Aryabhata
@ Aryabhata: hehe, nun die Antwort, die dann nicht da ist! Was war Ihrer Meinung nach das Problem bei der Anpassung des Ergebnisses in der Zeitung, das für Frank interessant und vielleicht nützlich war? Ein kurzer Blick darauf deutete darauf hin, dass es zutraf, aber ich habe es offensichtlich nicht gelesen.
Luke Mathieson
@LukeMathieson: Die Tatsache, dass die anderen Elemente im aktuellen Problem ungerade oft vorkommen müssen. Seitdem habe ich auch den Beweis überflogen ...
Aryabhata
Es wäre interessant, wenn Sie an theoretischen Ergebnissen oder praktischen Lösungen interessiert sind. Aus theoretischer Sicht ist meine erste schnelle Antwort, dass Sie eine Liste von ganzen Zahlen schneller als sortieren können . Es gibt einen deterministischen Algorithmus von Han , der in wird. Für randomisierte Algorithmen sind noch bessere Ergebnisse bekannt, z. B. haben Han und Thorup einen Algorithmus erwartete Zeit gefunden. Ich denke jedoch, dass Ihr Problem keine Sortierung erfordern sollte. O(nlogn)O(loglogn)O(nloglogn)
A.Schulz

Antworten:

2

Hier ist eine Idee für einen einfachen Algorithmus; Zähle einfach alle Vorkommen!

  1. Finden . - Zeitm=maxAΘ(n)
  2. Array " . - Zeit ¹C[0..m]O(1)
  3. Iteriere über und erhöhe um eins, wenn du findest . Wenn war , Add zu einer linearen Liste . - ZeitAC[x]A[_]=xC[x]0xLΘ(n)
  4. Iteriere über und finde das Element mit gerade. - Zeit .LxeC[xe]O(n)
  5. Sie .xe

Alles in allem erhalten Sie einen linearen Zeitalgorithmus, der (im Sinne einer Zuweisung) viel Speicher verwenden kann. Beachten Sie, dass es hier entscheidend ist, unabhängig von in konstanter Zeit auf zugreifen zu können .Cm

Ein zusätzliches , das an den Raum gebunden ist, ist bei diesem Ansatz schwieriger; Ich kenne keine Wörterbuchdatenstruktur, die eine -Zeit-Suche bietet . Sie können Hash-Tabellen verwenden, für die hier Implementierungen mit erwarteter Suchzeit ( der Tabellengröße, der Anzahl der gespeicherten Elemente) vorhanden sind, damit Sie mit linearem Raum beliebig gut werden können - erwartungsgemäß. Wenn alle Werte in demselben Hashwert zugeordnet sind, werden Sie geschraubt.O(n)O(1)O(1+k/n) nkA


  1. In einem RAM erfolgt dies implizit. Alles was wir brauchen ist die Startposition und vielleicht die Endposition.
Raphael
quelle
0

Eine fast triviale Lösung - die jedoch Leerzeichen verwendet - ist die Verwendung einer Hash-Map. Denken Sie daran, dass eine Hash-Map die Laufzeit zum Hinzufügen und Nachschlagen von Elementen amortisiert hat .Θ(n)O(1)

Daher können wir den folgenden Algorithmus verwenden:

  1. Ordnen Sie eine Hash-Karte . Iterate über . Erhöhen Sie für jedes Element die Anzahl der beobachteten Vorkommen, dh .HAiAH(i)++

  2. Durchlaufen Sie den Schlüsselsatz der Hash-Map und überprüfen Sie, welcher der Schlüssel eine gleichmäßige Anzahl von Vorkommen aufweist.

Dies ist ein einfacher Algorithmus, der keinen großen Trick verwendet, aber manchmal reicht sogar dieser aus. Wenn nicht, möchten Sie möglicherweise angeben, welche Speicherplatzbeschränkungen Sie auferlegen.

HdM
quelle
Ich würde immer noch gerne wissen, ob es einen nicht randomisierten -Zeitalgorithmus gibt, der den Polynomraum verwendet. Gibt es insbesondere theoretische Beweise dafür, dass es schwieriger ist, das einzige gerade vorkommende Objekt zu finden, als das einzige ungerade vorkommende Objekt zu finden? O(n)
A.Schulz
@ A.Schulz Ich denke, dass es der -erwartete Zeitalgorithmus unter Verwendung der Hash-Tabelle ist. Ich erinnere mich, dass mir jemand einen -Algorithmus (oder für einen speziellen Fall beispielsweise ungerade = 1 und gerade = 2) mit Stapel gesagt hat, aber ich kann mich nicht daran erinnern. O(n)O(n)
Yai0Phah
Nicht jede Hashtable-Implementierung hat diese Eigenschaft. Normalerweise ist die Suche nicht , nicht einmal amortisiert (afaik). Tatsächlich hat eine vorherige Diskussion keine Implementierung ergeben, die eine konstante Zeitsuche aufweist. Kannst du genauer sein? O(1)
Raphael