Kann mir jemand den Algorithmus erklären?

...komplette Frage anzeigen

3 Antworten

Der erste ist eine Minimumssuche, der zweite ist Unsinn.

Er holt sich die erste Zahl aus dem Array "numbers" und schreibt sie in "min" (bisher gefundene kleinste Zahl).

Dann läuft er in einer Schleife sequentiell über alle Zahlen in "numbers", vergleicht, ob die aktuell betrachtete Zahl kleiner als die Zahl in "min" (die bisher kleinste Zahl) ist. Wenn ja, ersetzt er "min" mit der gerade betrachteten Zahl.

Wenn er durch alle Zahlen durch ist, gibt er "min" aus. Das ist die kleinste Zahl in "numbers".

Der zweite Code gibt einfach die erste Zahl in "numbers" aus, denn "min" wird mit diesem Wert initialisiert und danach wird "min" nie wieder etwas anderes zugewiesen.

Sommerbild 16.11.2013, 19:38

Wie würde das in C# aussehen?

1
NoHumanBeing 16.11.2013, 20:02
@Sommerbild

In etwa so.

int numbers = new int[] {49, 29, 84, 28, 19, 11, 51, 52, 10, 13};
int idx = 0;
int smallest = numbers[idx];

/* numbers[0] haben wir schon evaluiert,
darum können wir hier bei 1 anfangen.
Bei null anzufangen würde zwar auch
nicht schaden, kostet aber nur
zusätzliche Laufzeit. */

for (int i = 1; i < numbers.Length; i++)
{
   int current_number = numbers[i];

   if (current_number < smallest)
   {
      smallest = current_number;
      idx = i;
   }

}

String i_as_string = i.ToString(System.Globalization.CultureInfo.InvariantCulture);
String idx_as_string = idx.ToString(System.Globalization.CultureInfo.InvariantCulture);

System.Console.WriteLine("Die kleinste Zahl lautet " + i_as_string + " und befindet sich im Array am Index " + idx_as_string + ".");

Die "& lt;" sind eigentlich kleiner Zeichen (<). Leider kriegt die Software dieses Portals das nicht vernünftig hin. Das ganze umgeben mit einer ...

public class MyClass
{

   public static void Main(string[] args)
   {
      /* Hier der Code. */
   }

}
1
NoHumanBeing 16.11.2013, 20:12
@NoHumanBeing

Sorry, das "string" als Typ in den vorletzten beiden Zeilen (bei der Variablendeklaration) natürlich klein. (In Java wäre es groß.)

1
Sommerbild 16.11.2013, 20:40
@NoHumanBeing

Vielen Dank! Wo haben Sie so gut programmieren gelernt und wie lange programmieren Sie schon?

1
NoHumanBeing 16.11.2013, 22:51
@Sommerbild

Ich bin Informatiker und entwickle bereits seit Jahrzehnten. Ob Du's glaubst oder nicht, ich habe angefangen, mit Programmiersprachen herumzuexperimentieren, bevor ich eingeschult wurde. Trotzdem kannst Du mich ruhig Duzen. ;-)

Die Minimumssuche ist eine Variante der so genannten "linearen Suche", die widerum ein absolutes Standardproblem in der Informatik darstellt.

1
Sasatux 17.11.2013, 06:57
@NoHumanBeing

Die Minimumssuche ist eine Variante der so genannten "linearen Suche", die widerum ein absolutes Standardproblem in der Informatik darstellt.

Auf die jeder Programmierer, der es interessiert lernt auch selbst kommt ;-)

Leider gibt es davon heutzutage nicht mehr viele :-D

1
Sommerbild 18.11.2013, 21:09
@Sasatux

Hallo,

Ich bin für jede Kritik offen, aber das ist doch nun sehr lächerlich, was du da behauptest. Ich würde erstmal an meine eigene Nase fassen, bevor man solche Behauptungen aufstellt. Zudem wusste ich auch, was dieser Code auslösen wurde, trotzdem frage ich nun mal bei Unklarheiten nach. Wer das nicht akzeptiert, ist in diesem Forum fehl am Platz.

1
Sommerbild 18.11.2013, 21:15
@NoHumanBeing

Wie lernt man den am besten programmieren? Ich bin seit ca einem halben Jahr dabei und kann die "Basics" , aber ich finde der ganze Theoriekram bringt einfach garnichts - da hilft nur learning by doing.

1
NoHumanBeing 19.11.2013, 01:44
@Sommerbild

Wie ich programmieren gelernt habe, kann ich Dir leider nicht beantworten, weil es einfach schon so lange her ist und ich mich wirklich nicht mehr daran erinnern kann, wie es vonstatten ging. Ich "wuchs quasi mit einem Computer auf". Ich habe Befehle in einen BASIC-Interpreter gehackt, bevor ich eingeschult wurde. (Kein Witz!) Ich habe es mir auf jeden Fall selbst angeeignet und zwar zu einer Zeit, als die gängigen Hochsprachen (außer C, das es damals natürlich schon gab und das auch bereits alles konnte!) noch nicht einmal Unterprogramme (Funktionen) unterstützt haben, geschweige denn Objektorientierung und was es heute alles gibt.

Meine erste objektorientierte Sprache war dann Java. Vorher hatte ich aber bereits einen objektbasierten (Objektbasierung ist die Vorstufe zu Objektorientierung - in objektbasierten Sprachen gibt es Klassen und Instanzen, aber noch keine Vererbung) BASIC-Dialekt gelernt. Nachdem ich Java beherrscht habe, habe ich mir jede weitere Sprache (JavaScript, C#, C, Python, C++, Assembler für ARM, ...) innerhalb weniger Wochen aneignen können.

Um Programmieren zu lernen hilft eigentlich nur "learning by doing", aber ein guter Programmierer ist noch lange kein guter Informatiker. Da gehört dann eben auch ein Haufen Theorie dazu, um tatsächlich Probleme systematisch analysieren und ausgeklügelte Algorithmen erfinden, entwerfen, spezifizieren und implementieren zu können.

1
NoHumanBeing 19.11.2013, 01:48
@NoHumanBeing

Und die richtig guten Leute können eine Lösung nicht nur erarbeiten (wie oben beschrieben), sondern sie anschließend auch noch objektiv vergleichen und bewerten.

1
NoHumanBeing 19.11.2013, 23:45
@Sommerbild

Ruhig Blut! Ich gehe nicht davon aus, dass dieser Kommentar gegen Dich gerichtet war.

1
Sommerbild 18.01.2014, 17:58
@NoHumanBeing
            int[] Numbers = { 12, 5465, };
        int maximum = 0;

        for (int i = 0; i < Numbers.Length; i++)
        {
            if (maximum < Numbers[i])
            {
                maximum = Numbers[i];
            }
        }

        Console.WriteLine(maximum);
        Console.ReadLine(); 

So bin jetzt besser geworden, der sieht doch mal noch ne Ecke besser aus. Gruss

0

Beide Algorithmen sorgen dafür, daß min am Ende den kleinsten im Array numbers enthaltenen Wert angibt. Aber sie tun es auf radikal verschiedene Weise.

Der erste Algorithmus tut es, indem er den Wert von min solange anpaßt, bis er dem kleinsten der Werte im Array entspricht. Die Werte im Array läßt er unverändert.

Der zweite Algorithmus tut es, indem er min auf einen Festwert setzt (er nimmt dafür den ersten, den er im Array findet) und dann die Werte im Array solange anpaßt, bis keiner von ihnen mehr kleiner ist als min.

Franz1957 17.11.2013, 00:28

Ein Beispiel. Das Array vorher und nachher, sowie der schließliche Wert von min.

Algorithmus 1:

5 8 4 3 9 1 6 7 0 2
5 8 4 3 9 1 6 7 0 2
0

Algorithmus 2:

5 8 4 3 9 1 6 7 0 2
5 8 5 5 9 5 6 7 5 5
5
0
Franz1957 17.11.2013, 00:52

Und noch ein Hinweis.

Deine beiden Codebeispiele sind wohl ursprünglich in einer 2er Version von Python geschrieben. Die Software des Forums hat die Formatierung kaputt gemacht. Lästig ist das allemal, aber bei Python-Programmen hat es größere Auswirkungen als bei den meisten anderen Programmiersprachen, denn die Formatierung entscheidet bei Python darüber, was zu welcher Kontrollstruktur gehört. Ob z.B. die print-Anweisung zur inneren oder zur äußeren oder zu keiner der beiden Schleifen gehört, ist hier aus der Zeichenkette nicht mehr eindeutig rekonstruierbar.

Hier ist der Ausweg:

Wenn Du den Code in Deinem Beitrag markierst und dann den Button mit dem blauen <> anklickst, dann steht der Code in so einem hellbraunen Kasten und die Formatierung (sowie auch Sterne, die sonst oft aufgefressen werden), bleiben alle erhalten.

min = numbers[0]
for number in numbers: 
    if number < min: 
        min = number 
print min

min = numbers[0]
for number in numbers: 
    if number < min: 
        number = min 
print min
0
Sommerbild 18.11.2013, 21:13
@Franz1957

Guten Tag, diese Codes sorgen eben nicht dafür, dass der gleiche Fall ausgelöst wird. Das hab ich mir nämlich auch gedacht, einfach mal ausprobieren.

0
Franz1957 18.11.2013, 23:29
@Sommerbild

Klar, ich habe ja oben die Resultate der beiden Testläufe eines Beispiels gezeigt. Der Zustand der Variablen nach dem Ablauf ist natürlich nicht in beiden Fällen gleich. Es trifft nur in beiden Fällen die Aussage zu, daß min den dann kleinsten Wert angibt, der (dann noch) im Array enthalten ist.

Vermitteln will ich damit, daß das obige Urteil von NoHumanBeing "der zweite ist Unsinn" zu kurz greift. Sinn ergibt ein Algorithmus nur im Rahmen einer vorgegebenen Zielsetzung oder Absicht, man sagt auch Spezifikation. Da Du über die Zielsetzung in der Fragestellung nichts gesagt hast, können wird schon mal nicht sagen, ob einer der beiden Algorithmen "richtig" und der andere "falsch" ist. Freilich ist die Minimumsuche in einer Menge ein bekanntes Standardproblem und deshalb erkennt man unschwer, daß Algorithmus 1 genau diese Absicht erfüllt, falls man sie hat. Genau deshalb und in diesem Sinne ist er sinnvoll. Wer aber etwas anderes vorhat, für den kann aber Algorithmus 2 oder auch keiner der beiden Algorithmen die Lösung sein. Da es prinzipiell keine sichere Methode gibt, unbekannte Absichten zu durchschauen, kann man nie sicher behaupten, daß ein Objekt, dessen Sinn man nicht erkennt, gar keinen Sinn hat.

1

Das ist ein Teil eines Programms.

Es sind einfache Wertzuweisungen (mit Abhängigkeit durch "if") an Variablen. Die Variable, an die ein Wert zugewiesen werden soll, steht links vom Gleichheitszeichen.

Der Unterschied besteht nur darin, dass einmal an die Variable "min" ein Wert zugewiesen wird, und das andere Mal an die Variable "numbers".

"Print min" heißt, dass der Computer den Wert der Variable "min" am Bildschirm anzeigen soll.

"for number in numbers" ist eine Schleife, d.h. der Befehl wird wiederholt ausgeführt (die Zahl der Wiederholungen wird durch die Variable number geregelt).

Sommerbild 16.11.2013, 19:38

Wie würde das in C# aussehen?

0
Goofy62 16.11.2013, 21:23
@Sommerbild

C# kenne ich leider nicht, aber es gibt Bücher darüber. Oder mal googeln nach "C# loop array".

0

Was möchtest Du wissen?