Dies mag eine lächerliche Frage sein, aber ist es möglich, dass ein Problem auftritt, das mit zunehmender Größe der Eingaben tatsächlich einfacher wird? Ich bezweifle, dass solche praktischen Probleme vorliegen, aber vielleicht können wir ein entartetes Problem erfinden, das diese Eigenschaft hat. Vielleicht beginnt es sich zu "lösen", wenn es größer wird, oder es verhält sich auf eine andere bizarre Art und Weise.
algorithms
asymptotics
dsaxton
quelle
quelle
Antworten:
Nein, es ist nicht möglich, zumindest nicht im asymptotischen Sinne, wo Sie das Problem haben müssen, immer einfacher zu werden, als es .n→∞
Sei die bestmögliche Laufzeit zur Lösung eines solchen Problems, wobei die Größe der Eingabe ist. Beachten Sie, dass die Laufzeit ein Zähler für die Anzahl der Anweisungen ist, die vom Algorithmus ausgeführt werden. Es muss sich also um eine nicht negative Ganzzahl handeln. Mit anderen Worten, für alle . Wenn wir nun eine Funktion , sehen wir, dass es keine solche Funktion gibt, die streng monoton abnimmt. (Was auch immer ist, es muss endlich sein, sagen wir ; aber da monoton streng abnimmt, ist undn T ( n ) ≤ N n T : N → N T ( 0 ) T ( 0 ) = c T T ( c ) ≤ 0 T ( c + 1 ) ≤ - 1 T ( n ) n 0 n ≥ n 0 T ( n )T(n) n T(n)∈N n T:N→N T(0) T(0)=c T T(c)≤0 T(c+1)≤−1 , was unmöglich ist.) Aus ähnlichen Gründen gibt es keine asymptotisch streng abnehmende Funktion: Ebenso können wir beweisen, dass es keine Laufzeitfunktion gibt, in der existiert, so dass für alle , ist monoton streng abnehmend (jede solche Funktion müsste irgendwann negativ werden).T(n) n0 n≥n0 T(n)
Ein solches Problem kann also nicht existieren, aus dem einfachen Grund, dass Laufzeiten nicht negative ganze Zahlen sein müssen.
Beachten Sie, dass diese Antwort nur deterministische Algorithmen abdeckt (dh Worst-Case-Laufzeit). Es schließt die Möglichkeit randomisierter Algorithmen nicht aus, deren erwartete Laufzeit für immer streng monoton abnimmt. Ich weiß nicht, ob es einen solchen Algorithmus geben kann. Ich danke Beni Cherniavsky-Paskin für diese Beobachtung .
quelle
Obwohl es nicht ganz die Antwort auf Ihre Frage, der Boyer-Moore-Algorithmus kommt in der Nähe. Wie Robert Moore auf seiner Webseite über den Algorithmus sagt,
Mit anderen Worten, im Allgemeinen sucht der Algorithmus nach einer Instanz einer Zielzeichenfolge in einer Quellzeichenfolge und nach einer festen Quellzeichenfolge. Je länger die Zielzeichenfolge ist, desto schneller wird der Algorithmus ausgeführt.
quelle
Aus rein mathematischer, rein CS-Algorithmus-Sicht ist dies natürlich unmöglich. Tatsächlich gibt es jedoch mehrere Beispiele aus der Praxis, anhand derer das Skalieren Ihres Projekts vereinfacht wird. Viele davon sind für Endbenutzer nicht intuitiv.
Richtungen : Je länger Ihre Richtungen werden, desto einfacher werden sie manchmal. Wenn ich zum Beispiel möchte, dass Google Maps mir eine Wegbeschreibung für 3000 Meilen in Richtung Westen gibt, könnte ich an die Westküste fahren - und dort Anweisungen für Geländefahrten erhalten. Aber wenn ich 6000 Meilen westlich fahren wollte, hätte ich am Ende wesentlich einfachere Anweisungen: Steigen Sie in ein Flugzeug von NYC nach Hokkaido. Es ist algorithmisch ziemlich schwierig, mir eine Cross-Country-Route zu geben, die Verkehr, Straßen, Wetter usw. enthält, aber es ist vergleichsweise viel einfacher, mich in ein Flugzeug zu setzen und Flüge in einer Datenbank nachzuschlagen. ASCII-Graph von Schwierigkeitsgrad gegen Distanz:
Rendern : Angenommen, ich möchte ein Gesicht und 1000 Gesichter rendern. Dies gilt für eine Plakatwerbung, sodass beide endgültigen Bilder 10000 x 5000 Pixel groß sein müssen. Ein Gesicht realistisch zu rendern wäre schwierig - bei einer Auflösung von mehreren tausend Pixeln muss man wirklich leistungsstarke Maschinen verwenden -, aber für die Menge von 1000 Gesichtern muss jedes Gesicht nur zehn Pixel breit sein und kann einfach geklont werden! Ich könnte wahrscheinlich 1000 Gesichter auf meinem Laptop rendern, aber ein realistisches Gesicht mit einer Auflösung von 10000px zu rendern würde sehr lange dauern und leistungsstarke Maschinen benötigen. ASCII-Diagramm der Schwierigkeit im Vergleich zu gerenderten Objekten, das zeigt, wie die Schwierigkeit beim Rendern von n Objekten zu einem Bild einer festgelegten Größe schnell abnimmt und dann langsam zurückkehrt:
Hardware-Kontrolle : Viele Dinge mit Hardware werden viel einfacher. "Motor um 1 Grad bewegen" ist schwierig und / oder unmöglich, und Sie müssen sich mit allen möglichen Dingen auseinandersetzen, die Sie für "Motor um 322 Grad bewegen" nicht hätten erledigen müssen.
Aufgaben von kurzer Dauer: Angenommen, Sie möchten, dass Gegenstand X jede Sekunde (für sehr wenig Zeit) eingeschaltet ist. Wenn Sie die Laufzeit von X erhöhen, benötigen Sie weniger komplexe Software und Hardware.
quelle
Es gibt Fälle. Dies sind die Fälle, in denen das Erfolgskriterium von den Daten abhängt, anstatt eine einzige Antwort zu finden. Beispielsweise können statistische Prozesse, deren Ergebnisse mit Konfidenzintervallen formuliert sind, einfacher werden.
Ein besonderer Fall, an den ich denke, sind Probleme, die einen Übergang von diskretem Verhalten zu kontinuierlichem Verhalten aufweisen, wie z. B. Flüssigkeitsflüsse. Das Lösen des kleinen Problems innerhalb eines gewissen Fehlergrades kann das Modellieren aller diskreten Wechselwirkungen umfassen, was möglicherweise einen Supercomputer erforderlich macht. Das kontinuierliche Verhalten ermöglicht häufig Vereinfachungen, ohne dass Ergebnisse außerhalb einer damit verbundenen Fehlergrenze erzielt werden.
quelle
Die Frage ist interessant und NÜTZLICH, denn unsere Philosophie in der Informatik ist es, Probleme zu lösen, je mehr wir lesen, desto schwieriger wird es. Tatsächlich können die meisten der Probleme, die auf typische (schwierige) Art und Weise dargestellt werden, auf einfache Weise dargestellt werden. selbst wenn man die Antwort von DW kennt (was falsch ist, wenn man bedenkt, dass einfach nicht schneller bedeutet, bedeutet "weniger langsam"; man muss also keine negativen Zeiten finden, man muss asymptotische Zeiten finden).
Der Trick, einen zu finden, besteht darin, den Teil der Lösung wie Hinweise als Eintrag zu setzen und den Eintrag des Problems als konstanten Parameter zu betrachten.
Beispiel: Was ist der längste Weg im Auto zwischen London und Paris, um zu vermeiden, zweimal eine französische und eine britische Stadt zu besuchen und kein anderes Land zu besuchen? Überlegen Sie, Sie müssen nach Birmingham vor Ashford, Orleans vor Versailles, La Rochelle vor Limoge usw. gehen.
Es ist klar, dass dieses Problem bei langen Einträgen einfacher ist als bei kurzen.
Anwendungsbeispiel: Stellen Sie sich ein Spiel vor, das von der Maschine verwaltet wird, und das IA des Computers muss bestimmen, ob er mehr im Spiel erforschen muss, um weitere Hinweise zu finden, oder ob es jetzt an der Zeit ist, die beste Entscheidung zu treffen .
quelle
Stellen Sie sich ein Programm vor, das das eingibt, was Sie über ein Kennwort wissen, und dann versucht, es zu knacken. Ich denke das macht was du willst. Zum Beispiel:
Ich sollte hinzufügen, dass dies ein Trick ist, da das Problem umgekehrt zur Eingabegröße ist. Sie können eine Abstraktionsebene weglassen und sagen, dass die Eingabegröße für keine Eingabe groß (alle Symbole und Wortlängen prüfen) und klein ist, wenn Sie am Anfang das richtige Kennwort eingeben.
Es kommt also darauf an, wie viel Abstraktion Sie zulassen.
quelle
Tatsächlich habe ich ein Problem, das mit zunehmenden Datenmengen kleiner wird. Eine meiner Anwendungen zeichnet Attribute eines bestimmten Produkts auf, beispielsweise Käse. Attribute sind zum Beispiel CheeseType, Brand, Country, Area, MilkType usw. Jeden Monat oder so erhalte ich eine Liste der neuen Käsesorten, die während dieser Zeit auf den Markt kamen, zusammen mit ihren Attributen. Diese Attribute werden nun von einer Gruppe von Menschen von Hand eingegeben. Einige machen Tippfehler oder kennen den Wert nicht für alle Attribute.
Wenn Sie in meiner Datenbank suchen, versuche ich anhand von Statistiken vorherzusagen, wie der Käse schmeckt, basierend auf diesen Attributen. Was passiert, ist, dass ich für jedes Attribut eine Reihe von Werten erhalte; Einige sind gültig, andere sind ungültig. Das Beseitigen oder Korrigieren dieser ungültigen ist nur möglich, wenn ich genügend Daten habe. Es geht darum, den Unterschied zwischen echten Werten und Rauschen zu machen, ohne seltene, aber gültige Werte zu eliminieren.
Wie Sie sich vorstellen können, ist bei geringer Lautstärke das Rauschen zu wichtig, um die Probleme richtig zu beheben. Wenn Sie 5 Instanzen von Cheddar, 1 von Brie, 1 von Bri und 1 von Chedar haben, wie kann ich feststellen, welche richtig und welche ein Tippfehler ist? Mit zunehmender Lautstärke bleiben die Tippfehler in der Regel sehr niedrig, aber die seltenen Werte werden in einigen entscheidenden Schritten erhöht, sodass sie dem Rauschen entkommen (gestützt auf die Erfahrung). In diesem Fall könnte ich mir zum Beispiel 50000 Cheddar, 3000 Brie, 5 Bri, 15 Chedar vorstellen.
Also ja, einige Probleme lösen sich schließlich von selbst, wenn Sie über genügend Daten verfügen.
quelle
Betrachten Sie das NP-vollständige Problem 3-SAT. Wenn Sie das Problem weiterhin durch Eingabe der Form x_i = true / false vergrößern, konvertieren Sie die einzelnen Disjunktionen entweder in Klauseln mit zwei Variablen, wodurch ein 2-SAT-Problem entsteht, das eindeutig P ist, oder Sie erhalten einfach das Ergebnis eine wahr / falsch Antwort.
Für den Fall, dass die x_i = true / false-Eingänge redundant sind (häufig bereitgestellte gleiche Eingänge oder widersprüchliche Eingänge), können Sie die Eingänge einfach sortieren und entweder die redundanten Werte ignorieren oder einen Fehler melden, wenn die Werte widersprechen.
Ich denke auf jeden Fall, dass dies ein „realistisches“ Problem darstellt, das mit zunehmender Anzahl von Eingaben leichter zu lösen ist. Der einfachere Aspekt besteht darin, ein NP-vollständiges Problem in ein P-Problem umzuwandeln. Sie können das System trotzdem spielen, indem Sie lächerliche Eingaben machen, so dass nur das Sortieren länger dauern würde, als es das Problem brutal erzwingen würde.
Ein wirklich cooles Szenario wäre, wenn wir bereit wären, T (0) zu akzeptieren (unter Verwendung der DW-Notation in der obigen Antwort), dass es unendlich sein kann. Zum Beispiel könnte T (0) gleichbedeutend mit dem Lösen des Halteproblems von Turing sein. Wenn wir uns ein Problem ausdenken könnten, das durch Hinzufügen weiterer Eingaben in ein lösbares Problem umgewandelt wird, haben wir Gold getroffen. Beachten Sie, dass es nicht ausreicht, es asymptotisch in ein lösbares Problem umzuwandeln - denn das ist genauso schlimm wie brachiales Erzwingen des Problems.
quelle
Die Frage lautet: "Ist es möglich, ein Problem zu haben, das mit zunehmender Größe der Eingaben tatsächlich einfacher wird?" Was ist, wenn die Eingaben Ressourcen sind , die vom Algorithmus für die Arbeit an einem Job verwendet werden. Es ist allgemein bekannt, dass je mehr Ressourcen desto besser sind. Unten sehen Sie ein Beispiel, in dem es umso besser ist, je mehr Mitarbeiter vorhanden sind.
3) Ausgabe:
Die Ausgabe gibt die Pfade zwischen den Aufgaben an, die von den Mitarbeitern ausgeführt werden müssen. Jeder Pfad ist mit der Anzahl der Mitarbeiter verknüpft, die ihn verwenden. Zum Beispiel:
4) Mögliche Lösung:
Eine mögliche Lösung besteht darin, zuerst den kürzesten Pfad zu den nächsten Knoten von A zu berechnen. Dies ist ein Vorwärtspfad. Berechnen Sie dann rekursiv den Weiterleitungspfad für jede besuchte Aufgabe. Das Ergebnis ist ein Baum. Zum Beispiel:
quelle