Was ist eine naive Methode?

9

Ich habe mich mit dynamischer Programmierung befasst und Folgendes gelesen:

Bei Verwendung einer naiveren Methode werden viele der Teilprobleme häufig generiert und viele Male gelöst.

Was ist eine naive Methode?

Chopper Draw Lion4
quelle
4
Schon mal was von "Brute Force" gehört?
Raphael

Antworten:

15

Es ist kein Fachbegriff mit einer genauen Bedeutung, es ist nur das englische Wort "naiv". In einem Informatikkontext bedeutet das Wort normalerweise so etwas wie "eines der Dinge, an die Sie zuerst denken würden, ohne jedoch eine weniger offensichtliche, aber wichtige Tatsache zu erkennen".

Wenn man zum Beispiel weiß, dass die Definition von Fibonacci-Zahlen , dann wäre eine "naive" Implementierung SeinFib(n)=Fib(n1)+Fib(n2)

def Fib(n):
  if n <= 1:
    return 1
  else:
    return Fib(n-1) + Fib(n-2)

Was ist das Problem? Wenn wir beispielsweise anrufen, werden am Fib(7)Ende immer wieder viele der gleichen Anrufe getätigt, z. B. Fib(4)(weil Fib(7)Anrufe Fib(6)und Fib(5)und Fib(6)Anrufe Fib(5)und Fib(4), und beide Male nennen wir Fib(5)es Anrufe Fib(4)und Fib(3)und so weiter).

Hier wäre eine eher "ausgefeilte" als eine naive Lösung wie eine dynamische Programmierung und würde alle zusätzlichen Berechnungen vermeiden.

usul
quelle
0

Im Allgemeinen können wir jedes Problem in NP in der Zeit durch rohe Gewalt lösen , was bedeutet, dass wir explizit alle Kandidaten für einen NP-Zeugen aufzählen, dessen Längenpolynom in der Eingabegröße . In diesem Zusammenhang kann die Methode "jede mögliche Lösung prüfen" als naiv angesehen werden.2poly(n)n

Juho
quelle
0

Die naive Implementierung ist die Lösung, bei der sie unkompliziert und weniger schwierig wie möglich aussieht.

In einigen Fällen kann es sein, dass es kein gutes räumliches oder zeitliches Verhalten aufweist, wie die naive Implementierung der Fibonacci-Funktion (eher exponentiell als linear).

Aber in vielen Fällen kann es die meiste Zeit gut funktionieren. Mit dem naiven Ansatz ist also nichts falsch. Sie können dies in drei Schritten tun:

"Mach es möglich" (wie gewünscht) -> "Mach es elegant / schön" (Refactoring, besser lesbar) -> "Mach es schnell" (Leistungsoptimierung)

Für Programmiersprachen mit Traditionen der "Überentwicklung" wie Java würde ich jeden Tag die "einfachste Lösung" empfehlen.

DucQuoc.wordpress.com
quelle