performance frage


  • Mod

    kantaki schrieb:

    kannst du mir erklären was ein "Graph mit Knoten und Kanten" ist?

    Das versucht dir hier ein jeder im Thread seit 4 Seiten zu erklären! Wie möchtest du noch jemanden motivieren, das noch einmal zu tun, wenn du bisher nur den Eindruck erweckst, dass man gegen eine Wand anschreibt.

    Das Stichwort lässt sich aber auch hervorragend googlen.



  • Um auf Dein Problem zurück zu kommen:

    (1) Bau Dir irgendwie einen Graphen.
    (2) Nimm einen altbekannten Wegsuchealgorithmus, wie z.B. den A-Stern.

    Aber: Das ist eher ein Programmier-Problem als ein Problem mit der Sprache C++.

    Zum Implementieren der Graph-Datenstruktur empfehle ich Dir std::list als Knoten-Container. Das praktische dabei ist, dass Zeiger auf Knoten solange gültig bleiben, bis der Knoten aus der Liste wieder gelöscht wird. Wird die Liste zerstört, werden auch automatisch die gespeicherten Knoten zerstört. Um böse Überraschungen mit den Zeigern zu vermeiden, kannst Du das Kopieren der Datenstruktur unterbinden. Mal ein einfaches Beispiel ohne großartige Kapselung:

    Pseudo-Code:

    struct vec3d {
      double coeffs[3];
    };
    
    struct knoten {
      vec3d position;
      vector<knoten*> direkte_nachbarn;
    };
    
    struct graph {
      list<knoten> alle_knoten;
    
      knoten* knoten_hinzufuegen(vec3d c) {
        knoten temp = {c};
        alle_knoten.push_back(temp);
        return &alle_knoten.back();
      }
    
    private:
      // Kopieren und Zuweisen ausschalten...
      graph(graph const&);            // bleibt absichtlich undefiniert
      graph& operator=(graph const&); // bleibt absichtlich undefiniert
    };
    

    oder so ähnlich.

    Wenn Du nach 4 Seiten immer noch nicht weißt, was ein Graph ist, frag nochmal in "Rund um die Programmierung" zu dem Thema. Das hat wirklich nix mit C++ zu tun.



  • Ich hab jetzt irgendwann aufgehört zu lesen, weil zwei Seiten vergeblich versucht wurde zu erklären, was das Problem an OPs Ansatz ist.

    Nur ganz kurz. Falls das hier deine Punktewolke ist (Wege sind eingezeichnet, aber die hast du ja nicht): http://www.leda-tutorial.org/de/offiziell/Pictures/DFS_NUMDemoGraphWin.png

    Dann würde dein Algo von 1|14 zu 15|18 ja als kürzesten Weg angeben, dass er über 19|19 geht. Aber wie man sieht, gibt es dort gar keine Verbindung (Fluss dazwischen).



  • okay super vielen danke

    ich weiß zwar noch nicht was struct oder list ist, aber das lässt sich ja einfach googlen.
    ich lese nur gerade primer und bin noch nicht sehr weit (s.300).
    aber ich wollte einfach mal was programmieren, und ich muss sagen obwhol es sehr unneffizient ist, bin ich trotzdem stolz das ich es geschafft habe.

    naja ich werde mich jetzt mal in das obrige programm einlesen

    vielen dank 🙂



  • Juchu, endlich Mal jemand, der zum Einstieg ein vernünftiges Buch liest. 🙂



  • okay ich habe mich in ein paar algorithmen eingelesen.
    leider muss ich feststellen das mein grundwissen doch noch sehr viele lücken aufweist 😞
    Ich werde wohl erstmal bei meiner momentanen Version bleiben.

    Allerdings lasse ich nun die string koordinaten sofort in ein struct speichern und diesen struct speichere ich in einen vector. Das hat mir einen enormen perfomance vorteil verschafft =).
    Danke schonmal dafür.

    Ein Problem habe ich leider noch und ich kann den fehler nicht finden.
    Wenn die Distanz zu groß ist werden garbage werte ausgegeben(immer der selbe wert)

    Würde vielleicht jemand über den Code drüber schauen und mir ein paar tipps geben?

    Leider ist der Code 250Zeilen groß und ich möchte ungern das forum vollspamen.
    Dafür ist er gut Kommentiert 🙂
    Also wenn sich jemand bereiterklären würde, wäre ich sehr dankbar.
    bzw wenn sich jemand findet, dann würde ich ihn auch hier posten, wenn das in ordnung wäre.



  • Kommentare sind übrigens üblicherweise ein Zeichen von schlechtem Code.



  • 314159265358979 schrieb:

    Kommentare sind übrigens üblicherweise ein Zeichen von schlechtem Code.

    weil der code kommentare braucht um verständlich zu sein ?



  • Richtig 😉



  • 314159265358979 schrieb:

    Kommentare sind übrigens üblicherweise ein Zeichen von schlechtem Code.

    Lösung: Kommentare entfernen.



  • Bashar schrieb:

    314159265358979 schrieb:

    Kommentare sind übrigens üblicherweise ein Zeichen von schlechtem Code.

    Lösung: Kommentare entfernen.

    😃 👍



  • 314159265358979 schrieb:

    Kommentare sind übrigens üblicherweise ein Zeichen von schlechtem Code.

    Das stimmt nicht. Kommentare sind üblicherweise ein zeichen für Code, der mehr macht als simple GUI-Boilerplate Logik. Wenn du einen Algorithmus implementierst, dann gibt es oftmals teile, die zwar im originalpaper hergeleitet wurden, aber die Herleitung hat keine Intuition die stark genug ist, dass sprechende Variablennamen alleine den Code beschreiben können.



  • In seiner Größenordnung stimmt das normalerweise 😉



  • otze schrieb:

    314159265358979 schrieb:

    Kommentare sind übrigens üblicherweise ein Zeichen von schlechtem Code.

    Das stimmt nicht.

    Das stimmt aber auch nicht.

    otze schrieb:

    Kommentare sind üblicherweise ein zeichen für Code, der mehr macht als simple GUI-Boilerplate Logik. Wenn du einen Algorithmus implementierst, dann gibt es oftmals teile, die zwar im originalpaper hergeleitet wurden, aber die Herleitung hat keine Intuition die stark genug ist, dass sprechende Variablennamen alleine den Code beschreiben können.

    Das wäre der Idealfall. Ich beneide Dich um die Arbeitskollegen, die das auch so handhaben.

    In der Welt passiert aber leider sowas:
    http://stackoverflow.com/questions/3198615/wrote-a-quick-and-dirty-brainfuck-interpreter-what-could-i-do-better

    Auf den ersten Eindruck erscheint es wie ein bestens kommentiertes Programm; es kann sogar Profis beeindrucken, wie hübsch es doch sei. Und zu sowas führt es, wenn man Anfänger zwingt, viele Kommentare zu schreiben. In Wirklichkeit ist es schlechtestens kommentiert. Die ganzen einfachen Sachen sind kommentiert, sodaß man alles doppelt liest, aber der elegante Trick, wie '[' und ']' zusammenarbeiten, ist kein Bißchen kommentiert(*). Da stottert man beim Lesen. Und zwar nicht umsonst: Der Code ist falsch.

    Ich halte es so, daß ich dermaßen ausgewalzte Kommentare ein Zeichen von Unverständnis und Praxisferne halte, ein fettes Warnblinklicht, das mir sagt, ich hätte mich da nicht einmischen sollen, dann hätte ich den Code jetzt auch nicht lesen müssen.

    Vielleicht wäre es gut, die Anfänger nicht mehr zum Kommentieren anzuhalten. Und die Profis sollten vor jede Klasse schreiben (können), warum sie diese Klasse einführen. Das wäre schön. Ach, was würden viele RessourcenManager und curiously recurring templates sterben. Nee, das klappt nie:

    class RessourcenManager{
    //Diese Klasse managt Ressourcen, ist doch kla, du. 
    ...//weiter wie gehabt, oder noch schlimmer
    

    ^(*) Man erkennt nur am ?:-Operator, daß der Schreiber sich dort viele Gedanken gemacht hat und ein Profi ist.^


Anmelden zum Antworten