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.