Foren » 33. BwInf

Veröffentlichung von Einsendungen nach Einsendeschluss

    • 230 Beiträge
    18. April 2015 10:14:11 CEST
    Hallo zusammen,

    am Montag ist ja mal wieder Einsendeschluss. Nach dem Einsendeschluss kann auch gerne über die konkreten Lösungsideen und deren Umsetzungen diskutiert werden. Dann können die Einsendungen gerne auch online für andere zur Verfügung gestellt werden. Es sollte nur gewartet werden, bis das PMS auch wirklich keine Einsendung mehr entgegen nimmt. Ein entsprechender Link zu der Einsendung hier wäre dann auch ganz gut, dann gibt es auch die Möglichkeit, über verschiedenen Lösungen zu diskutieren.

    Viele Grüße
    Thomas
  • 21. April 2015 09:33:24 CEST
    Hallo BwInf-ler

    Falls jemanden meine Bearbeitung der Aufgaben 2 und 3 interessiert, findet er sie unter
    https://link.tim-hollmann.de/27c9010660
    Aufgabe 3 übrigens auch mit Suffix-Baum.

    @Matthis: Wie lange braucht dein Programm für E.coli bei k=2 l=1?

    LG

    -Tim
    Dieser Beitrag wurde am 24. April 2017 12:06:29 CEST von nicht mehr angemeldetes Mitglied bearbeitet
    • 2 Beiträge
    21. April 2015 10:20:23 CEST
    @Matthis Verstehe ich das richtig, dass du bei seilschaften3 keine Lösung gefunden hast?

    Viel Respekt euch beiden, ihr habt das ganze doch eine Ecke ordentlicher gemacht als ich. Bei Interesse kann ich auch meine Lösung einmal posten, prinzipiell habe ich bei Aufgabe 1 eine (sogar recht schnelle) Breitensuche versucht und bei Aufgabe 3 ein Verfahren, dessen Namen mir nicht bekannt ist ;) Hat grob das Prinzip einer Breitensuche. Naja, die Lösung mit dem Suffixbaum gefällt mir da schon besser, auch weil es wesentlich schneller ist (ich brauch für E.Coli.100000 l=2 k=2 grob 310 Sekunden).

    Mit freundlichen Grüßen
    Jonathan
    Dieser Beitrag wurde am 21. April 2015 10:45:36 CEST von Jonathan du Mesnil bearbeitet
    • 4 Beiträge
    21. April 2015 10:53:52 CEST
    [blockquote]Jonathan du Mesnil said:
    @Matthis Verstehe ich das richtig, dass du bei seilschaften3 keine Lösung gefunden hast?

    Viel Respekt euch beiden, ihr habt das ganze doch eine Ecke ordentlicher gemacht als ich. Bei Interesse kann ich auch meine Lösung einmal posten, prinzipiell habe ich bei Aufgabe 1 eine (sogar recht schnelle) Breitensuche versucht und bei Aufgabe 3 ein Verfahren, dessen Namen mir nicht bekannt ist ;) Hat grob das Prinzip einer Breitensuche. Naja, die Lösung mit dem Suffixbaum gefällt mir da schon besser, auch weil es wesentlich schneller ist (ich brauch für E.Coli.100000 l=2 k=2 grob 310 Sekunden).

    Mit freundlichen Grüßen
    Jonathan [/blockquote]

    Lustig, geht mir genau so. Bei Aufgabe eins löst meine Suche alle Aufgaben in >= 200 ms und findet auch für alle bis auf seilschaften5.txt eine Lösung. Ich hatte sogar in Erwägung gezogen, einen Suffix-Baum zu nutzen, habe mich aber auf Grund der Anforderungen (10000) entschieden, die Brute-Force-Alternative zu nutzen, was bei mir für 10000 Zeichen etwa zwei Minuten braucht (k=2, l=2).

    MfG
    Leo
    Dieser Beitrag wurde am 21. April 2015 11:03:35 CEST von Leo Tietz bearbeitet
  • 21. April 2015 14:12:51 CEST
    Ich habe Aufgabe 3 etwas anders gelöst.
    Ein Teilstring y, der Teilstring x enthält, kann nicht häufiger vorkommen als x, dass er genau so häufig ist, ist allerdings möglich.
    Ich habe auch einen Baum genutzt, der einen leeren Teilstring als Wurzel hat. Die Kindknoten in diesem Baum haben genau ein Zeichen mehr als ihre Elternknoten, dieses zusätliche Zeichen wird einfach am Ende eingefügt. Dadurch, dass einfach nur ein Zeichen am Ende mehr vorhanden ist, kann der Teilstring nicht häufiger vorkommen als der Elternknoten. Wenn also schon der Kindknoten das Kriterium nicht erfüllt, dass er mindestens k-mal vorkommt, wird besagter Kindknoten gelöscht. Ein Knoten, der daher nur Nachfolger hat, die weniger als k-mal vorkommen, ist daher ein Blatt. Der Baum wird auf diese Weise auf alle Teilstrings beschränkt, die dieses Kriterium erfüllen.
    Ob der Teilstring lang genug ist, wird ganz einfach durch auszählen der Zeichen ermittelt.
    Alle Teilstrings, die widerlegen könnten, dass der Teilstring maximal ist, müssen am Anfang oder am Ende des Teilstrings mindestens ein Zeichen mehr haben und genau so häufig vorkommen. Die Kindknoten sind solche Teilstrings. Wenn also ein Kindknoten genau so häufig vorkommt, ist der Elternknoten nicht maximal. Die anderen Teilstrings haben ein weiteres Zeichen am Anfang. Auch sie müssen ausgezählt werden. Sollte einer von ihnen genau so häufig vorkommen, ist der Teilstring nicht maximal.
    Der Baum in meiner Lösung existiert jedoch nie vollständig, sondern wird rekursiv abgesucht, sodass immer nur der Weg von der Wurzel bis zum aktuell untersuchten Knoten existiert.
    Beim Auszählen der Häufigkeit eines Teilstrings wird nur an den Stellen gesucht, an denen der Teilstring auch existieren kann. Wenn z.B. Teilstring y den Teilstring x enthält und man bereits weiß, wo x sich befindet, sucht man eben nur dort.
    Für die e-coli sequenz bei k = 2 und l = 2 benötigt das Programm ca. 15 Sekunden und findet 54540 Teilstrings.
    • 11 Beiträge
    • 2 Beiträge
    21. April 2015 14:42:42 CEST
    @Marvin Ich habe das so ähnlich gelöst wie du, nur habe ich zuerst alle Teilketten mit der Mindestlänge gesucht und dann immer diese nach links und rechts erweitert. Bei mir entsteht also der ganze Baum. Wie hast du es realisiert, dass immer nur der Weg zum aktuellen Knoten existiert? Von der Laufzeit her scheint deine Lösung ja im Vorteil zu sein. Würde mich freuen, wenn du vielleicht deinen Quelltext mal zeigen könntest, dann könnte ich das ein bisschen vergleichen.
  • 21. April 2015 15:20:43 CEST
    [blockquote]Jonathan du Mesnil said:
    @Marvin Ich habe das so ähnlich gelöst wie du, nur habe ich zuerst alle Teilketten mit der Mindestlänge gesucht und dann immer diese nach links und rechts erweitert. Bei mir entsteht also der ganze Baum. Wie hast du es realisiert, dass immer nur der Weg zum aktuellen Knoten existiert? Von der Laufzeit her scheint deine Lösung ja im Vorteil zu sein. Würde mich freuen, wenn du vielleicht deinen Quelltext mal zeigen könntest, dann könnte ich das ein bisschen vergleichen.[/blockquote]
    Hier meine komplette Aufgabe 3. Hab ich auch jetzt nicht so ordentlich gemacht wie Matthis und Tim aber ich hoffe es hilft trotzdem:
    https://www.dropbox.com/s/3kfxthp5wgasp4b/Aufgabe%203.zip?dl=0
  • 21. April 2015 15:58:07 CEST
    @Marvin: Mein Programm gibt bei l=2, k=2 auch genau 54540 Ergebnisse aus
    • 4 Beiträge
    21. April 2015 17:30:30 CEST
    [blockquote]Matthis Kruse said:dank LaTeX[/blockquote]

    LaTeX ist schon eine enorme Hilfe für so eine Dokumentation, bin da echt dankbar, dass es sowas gibt.
  • 21. April 2015 22:06:51 CEST
    Ok, hier auch mal meine Lösungen:
    (Programme und Dokumentation) https://drive.google.com/open?id=0B5TKzLyco-2lflZOQU1qQkhpSHIxRFhyVkJsb0FZWTE5NUMzTU5ENjh5eW9WMy00QnNpXzA&authuser=0
    Quellcode: https://github.com/Naalunth/Mississippi
    https://github.com/Naalunth/Seilschaften

    Ja, ich weiß, dass meine Dokumentationen schrecklich sind und ja, ich weiß, dass ich Aufgabe 1 viel zu billig gelöst habe. aber es funktioniert.

    edit: Aufgabe 1 funktioniert doch nicht.

    Meine Lösung für Aufgabe 3 ist mit E.Coli.100000 absolut unterfordert. Gib ein was du willst, es löst alles in höchstens 2 Sekunden. Sowas wie chr22.fa von hier (http://hgdownload.cse.ucsc.edu/goldenPath/hg38/chromosomes/) ist da schon angemessener (in 64 Bit).
    Dieser Beitrag wurde am 21. April 2015 22:30:07 CEST von nicht mehr angemeldetes Mitglied bearbeitet
  • 22. April 2015 00:16:48 CEST
    Aufgabe 1 hatte bei mir einen Fehler den erst jetzt bei euch bemerkte, da seilschaften2.txt ja eigentlich eine Lösung hat. (Was ich auch nach kurzem Nachdenken bemerken hätte können...). Ist auf Github gefixt.

    Auch bei mir kommt (immernoch) eine Lösung für seilschaften3.txt raus.
    Dieser Beitrag wurde am 22. April 2015 00:18:47 CEST von nicht mehr angemeldetes Mitglied bearbeitet
  • 22. April 2015 13:47:34 CEST
    @Kevin

    Super Laufzeit!

    Leider ist mir allerdings aufgefallen, dass dein Programm bei E.coli.100000.txt (mit k = 2 und l = 2) lediglich 54530 Ergebnisse ausgibt. Andere erhielten jedoch 54540 Ergebnisse. Ich habe daher mal nachgesehen, welches die zehn Ergebnisse sind, die dein Programm nicht fand, vielleicht hilft dir das ja weiter: AA, AC, CG, CT, GC, GG, GT, TA, TC, TT. Andere Ergebnisse mit zwei Basen hat dein Programm jedoch gefunden.

    Dank deiner Einsendung habe ich selbst bei meiner einen Fehler entdeckt.
    In Zeile 38 hätte ich den > operator verwenden müssen anstelle von >=.

    Gruß,
    Marvin
    Dieser Beitrag wurde am 22. April 2015 14:04:42 CEST von nicht mehr angemeldetes Mitglied bearbeitet
    • 2 Beiträge
    22. April 2015 20:45:58 CEST
    Ok, ich poste meine Lösung auch mal.

    Download:
    https://onedrive.live.com/?cid=86191c2d11aff8df&id=86191c2d11aff8df!2123&ithint=folder,zip&authkey=!AMjRLCWiey_3noI

    Aufgabe 1 hab ich mit einer Breitensuche gelöst, die Umsetzung hab ich so optimiert, dass quasi alle Daten als Bitfelder dargestellt werden, auf die ich mit Bit-Operatoren das meiste (Den Austausch von Personen/Steinen nach oben/unten, die Überprüfung ob irgendwo Personen sind etc.) in O(1) durchführen kann.

    Aufgabe 3 hab ich mit einem Suffix-Array gelöst, aus dem ich die Wiederholungen ablese und dann die nicht-maximalen rausfiltere.

    Laufzeiten: (mehr stehen in der Doku)
    Bei der 1)
    - 4ms für seilschaften4
    - 263ms für ein eigenes Bsp, bei dem ich seilschaften4 von 9 auf 14 Gewicht erweitert hab

    Bei der 3)
    - 162ms für die 100.000 (hab ebenfalls 54540 Wdh gefunden)
    - 2,6s für ein E.coli-Bsp mit 1.000.000 Basenpaaren (das ich irgendwo runtergeladen hab)
    Dieser Beitrag wurde am 22. April 2015 20:47:40 CEST von Vincent Bürgin bearbeitet
    • 5 Beiträge
    24. April 2015 14:55:18 CEST
    Ich habe mich etwas mit Aufgabe 2 beschäftigt (ich nehme am Wettbewerb nicht teil) und nach einigem Herumprobieren recht schnell entdeckt, dass man von einem festgelegtem Punkt auf der Gerade aus einen optimalen Winkel in polynomieller Zeit finden kann (ich sage "einen" da das Ergebnis uneindeutig ist). Ich habe den formellen Beweis sowie die benötigten Formeln auch in Tex gemacht, falls jemand daran Interesse hat.
    • 2 Beiträge
    25. April 2015 19:09:59 CEST
    @Matthis
    Danke :)


    [blockquote]Moritz Zuse said:
    Ich habe mich etwas mit Aufgabe 2 beschäftigt (ich nehme am Wettbewerb nicht teil) und nach einigem Herumprobieren recht schnell entdeckt, dass man von einem festgelegtem Punkt auf der Gerade aus einen optimalen Winkel in polynomieller Zeit finden kann (ich sage "einen" da das Ergebnis uneindeutig ist). Ich habe den formellen Beweis sowie die benötigten Formeln auch in Tex gemacht, falls jemand daran Interesse hat.[/blockquote]

    Also, ich hab zwar die 2 nicht bearbeitet und mir auch nur wenig Gedanken drüber gemacht, aber würd mich trotzdem interessieren