Ein String im String suchen.

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein String im String suchen.

Beitrag von Xin » Sa Jul 16, 2011 6:36 pm

fat-lobyte hat geschrieben:Nachtrag: wann ist denn die Deadline für diesen Spaß?
Hatte ich nicht mehr gesehen.

Bisher gibt es noch keine Konkurrenz. ;-)

Hier gibt's keine dringende Deadline, wer was hat, kann es einreichen. Irgendwann werde ich den Thread natürlich schließen, aber wer am Wettbewerb teilnehmen will, kann erstmal den Artikel schreiben. Ich schätze mal so drei Monate werde ich hier eingereichte Programme testen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Panke
Beiträge: 70
Registriert: So Nov 14, 2010 10:47 am

Re: Ein String im String suchen.

Beitrag von Panke » So Jul 17, 2011 12:17 pm

Ich werd irgendwann was einreichen.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Ein String im String suchen.

Beitrag von fat-lobyte » So Jul 17, 2011 2:22 pm

Tag.

Ich möchte hiermit meine Kleine Experiment und Auswertungsklasse veröffentlichen. Das tue ich aus 2 Gründen:
1) Ich möchte den Wettbewerb etwas anregen, indem ich auch leuten mit weniger Zeit ermögliche ihre Algorithmen vernünftig zu testen
2) Ich hoffe auf Feedback und Vorschläge für die Klasse, damit auch ich mehr davon Profitieren kann.

Wie man sie verwendet ist eigentlich ganz einfach

Code: Alles auswählen

#include "experiment.hpp"
#include "search_fatlobyte.hpp" 
// oder eure Klasse!

int main(int argc, char **argv)
{
    // experimentobjekt anlegen, als Templateargument eure Klasse eintragen!
    Experiment<SearchFatLobyte> experiment(
        {// erstes argument ist ein vector aus paaren von ID's und Dateinamen
            {"Shakespeare - Macbeth", "txt/en-macbeth.txt"},
            {"Kafka - Die Verwandlung", "txt/ger-dieverwandlung.txt"},
            {"Goethe - Faust", "txt/ger-faust.txt"},
            {"Goethe - Iphigenie auf Tauris", "txt/ger-iphigenie.txt"},
            {"Hegel - Wissenschaft der Logik", "txt/ger-logik.txt"}
        },
        { // zweites argument ist eine map mit der ausgabedateinamen als schlüssel, und den Mustern in einem vector
            {"test_output1.txt", {"Hallo", "Welt" } },
            {"test_output2.txt", {"Hello", "World"} }
        }
    );

    // Experiment bitte 30 mal ausführen!
    experiment.conductExperiment(30);

    // Statistiken abholen
    ExperimentStatistics stats(experiment.getStatistics());

    // Statistiken anzeigen
    stats.display();

    return 0;
}
Aussehen tut das Ganze dann so:

Code: Alles auswählen

[alexander@desktop-fedora proggen_searchwords]$ ./searchwords_std-strstr 
Experiment with N = 30:
	Average: 160 milliseconds.
	Standard deviation: 27.7 milliseconds.
	Relat. standard deviation: 17.3%
Dazu gibt es ein kleines Makefile. Ihr könnt eure Variante einfach der Variable "VARIANTS" hinzufügen, dann wird die Variante automatisch gebaut.
Bei Fragen und Anregungen bitte melden.

mfg, fat-lobyte

Edit: Ach ja, die Datei:
proggen_searchwords.tar.gz
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Haters gonna hate, potatoes gonna potate.

Panke
Beiträge: 70
Registriert: So Nov 14, 2010 10:47 am

Re: Ein String im String suchen.

Beitrag von Panke » So Jul 17, 2011 4:02 pm

Wär gut, wenn wir eine Standardimplementierung hätten, damit wir die Zeiten unserer Algorithmen normalisieren können und unabhängig von unterschiedlich starken Rechnern Vergleichsmöglichkeiten haben.

Also (meine Laufzeit) / (Laufzeit Stanard) als Maß für die Güte der Algorithmen. Setzt auch eine Testsuite voraus. Wie werden Pattern gewählt und wie die Texte?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein String im String suchen.

Beitrag von Xin » Fr Jul 22, 2011 4:57 pm

fat-lobyte hat geschrieben:So, hab jetzt ne kleine Referenzimplementierung, läuft allerdings nur auf Linux.

Features: Datei Laden, Zeit messen, Suchen.

Das Suchen funktioniert mit der Bibliotheksfunktion strstr() die es anscheinend zu schlagen gilt.

DIES IST NOCH NICHT MEIN FERTIGER ALGORITHMUS!! Ich wollte hier allen Unix benutzern nur mal ein kleines Framework zum coden bereitstellen. Viel spaß damit:
proggen_searchwords.zip
Ich habe meine Suchmaschine heute nochmal überarbeitet.

Gestartet ist meine Laufzweit bei 33m39.413s. Mit der Überarbeitung letzte Woche ging die Laufzeit runter auf 10m47.911s. Die heutige Überarbeitung bringt die Suche runter auf 1m2.108s. Damit kann ich schon langsam brauchbar leben, das Ganze ist weiterhin SingleCore.

Damit ist der Proof-Of-Concept-Algorithmus 30x schnell geworden, was mir schon ganz gut gefällt.
Um mal einen Vergleich zu haben, habe ich Deine Demoversion von Dir mit reingehängt und gratuliere zu einer Laufzeit von
real 0m0.009s

Ich habe die Texte ja zur Verfügung gestellt und suche derzeit nach den Begriffen "Mann" und "ist", die beide vorkommen müssen, um einen Text in der Datei zu vermerken.

Die Demo-Version gibt folgende Datei aus:

Code: Alles auswählen

xin@trinity:/data/home/xin/workspace/gsys/trunk/apps/search$ cat result/1.txt 
en-armsandtheman-helden.txt
ger-faust.txt
ger-iphigenie.txt
ger-macbeth.txt
ger-werther.txt
en-macbeth.txt
ger-flametti.txt
ger-kritikvernunft.txt
ger-wintermaerchen.txt
ger-dieverwandlung.txt
ger-helden.txt
ger-logik.txt
ger-mord.txt
ger-tanteMarthastraenenreicherAbschied.txt
ger-wurmlochrosa.txt
Meine Suche meldet, dass "Mann" und "ist" in der Datei "en-macbeth.txt" und "en-armsandtheman-helden.txt", wie auch "ger-mord.txt" nicht enthalten sind.

Ich habe mal "Mann" per grep gesucht, dieser meldet bei "ger-mord.txt", dass das Wort "Manne" enthalten ist. In den Englischen Texten ist definitiv nichts "Mann"-Artiges.

Hier hakt also noch was.


Das Testprogramm entspricht meinem, ich tauschte lediglich die Klasse aus:

Code: Alles auswählen

#include <de/xsd/type/string.h>
#include <de/xsd/io/file.h>
#include <de/xsd/util/seperator.h>
#include <de/xsd/util/list.h>

#include <de/xsd/search/search.h>

#include <org/proggen/string/demo/search_fatlobyte.hpp>

using namespace XSD::Type;
using XSD::Util::List;
using XSD::Util::GarbageCollectedList;
using XSD::Util::Seperator;
using XSD::IO::File;
using XSD::Search::Search;



#if 1
char const * dir = "txt/";
char const * files[] = {
                         "en-armsandtheman-helden.txt",
                         "ger-faust.txt",
                         "ger-iphigenie.txt",
                         "ger-macbeth.txt",
                         "ger-werther.txt",
                         "en-macbeth.txt",
                         "ger-flametti.txt",
                         "ger-kritikvernunft.txt",
                         "ger-wintermaerchen.txt",
                         "ger-dieverwandlung.txt",
                         "ger-helden.txt",
                         "ger-logik.txt",

                         "ger-mord.txt",
                         "ger-tanteMarthastraenenreicherAbschied.txt",
                         "ger-wurmlochrosa.txt",
                         NULL };
#else
char const * dir = "short/";
char const * files[] = { "test.txt",
                         NULL, "fritz.txt",
                         NULL };
#endif



int main( void )
{
//  char const ** texts;

  unsigned int filesCount = sizeof( files ) / sizeof( char const * );
  char ** buffer = new char * [ filesCount ];

  /* Dateien laden */
  for( unsigned int i = 0; i < filesCount && files[i]; i++ )
  {
    String name = String( dir ) + files[ i ];
//    printf( "Lese %s\n", name.AsCString() );
    if(!File( name ).Load( buffer[i] ))
      printf( "Konnte %s nicht laden\n", name.AsCString() );
  }

//  Search search;

  SearchFatLobyte search;

  for( unsigned int i = 0; i < filesCount && files[i]; i++ )
    if( buffer[i] ) search.addText( files[i], buffer[i] );

/* Testfall: Wörter mehrfach eingeben */

//  xin.addPattern( "weiblich" );
  search.addPattern( "ist" );
  search.addPattern( "Mann" );
  int found = search.seek( "result/1.txt" );

  search.clearPatterns();
  search.addPattern( "violinbogenartig" );
  int found2 = search.seek( "result/2.txt" );

  printf( "1: %d\n", found );
  printf( "2: %d\n", found2 );


  for( unsigned int i = 0; i < filesCount; i++ )
    delete [] buffer[i];

  delete [] buffer;

  return 0;
}
Die zweite Suche ist erfolgreich und korrekt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein String im String suchen.

Beitrag von Xin » Fr Jul 22, 2011 6:06 pm

Panke hat geschrieben:Wär gut, wenn wir eine Standardimplementierung hätten, damit wir die Zeiten unserer Algorithmen normalisieren können und unabhängig von unterschiedlich starken Rechnern Vergleichsmöglichkeiten haben.

Also (meine Laufzeit) / (Laufzeit Stanard) als Maß für die Güte der Algorithmen. Setzt auch eine Testsuite voraus. Wie werden Pattern gewählt und wie die Texte?
Ist alles hier im Thread schon bequatscht. Beispieltexte, die ich hier zum Vergleich verwende finden sich auf http:/www.proggen.org/download/texte.zip

Maßgebend ist mein Rechner, auf dem alle Klassen gegeneinander antreten werden.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein String im String suchen.

Beitrag von Xin » Fr Aug 19, 2011 9:15 pm

So, willkommen in der Sommerpause.

Da meine Wenigkeit vor der Sommerpause in den Urlaub gefahren ist, sitze ich nun hier und wärme alte Threads auf und ärgere mich darüber, dass MacOS Lion die Rechtschreibkorrektur vom iPhone nun auch auf den Mac übertragen hat und Theras jetzt automatisch Theras heißen, was soviel wie Threads heißen soll. Wenn ich in den nächsten Monaten also gelegentlich kompletten Unsinn schreibe, nicht wundern, ich habe einen Mac, da ist das jetzt modern.

Diesen Thread möchte ich nicht so einfach sterben lassen, zumal fat-lobyte schon eine Herausforderung angenommen hat. :-)

Von daher ein Push!, dass ich zumindest diesen Thread weiterbearbeiten werde. :-)
Sonst noch wer im Rennen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Ein String im String suchen.

Beitrag von nufan » Fr Aug 19, 2011 9:20 pm

Xin hat geschrieben:Sonst noch wer im Rennen?
Ich hab kleine Compiler-technische Probleme, aber prinzipiell bin ich noch dabei.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ein String im String suchen.

Beitrag von Xin » Fr Aug 19, 2011 9:31 pm

Und Du verstehst nicht, was Dein Compiler Dir sagen will?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Ein String im String suchen.

Beitrag von nufan » Fr Aug 19, 2011 9:40 pm

Xin hat geschrieben:Und Du verstehst nicht, was Dein Compiler Dir sagen will?
Naja ich verstehe was die Meldung bedeutet, aber nicht warum ich sie angezeigt bekomme:
QCLProgram::createKernel( test ): "CL_INVALID_KERNEL_NAME"
EDIT: Ok, das wird euch ohne Code noch viel weniger sagen als mir ^^

Antworten