<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Große Listen durchsuchen - Levenshtein distanz]]></title><description><![CDATA[<p>Guten Morgen,</p>
<p>Gleich am Anfang: Dieser Post könnte etwas länger werden - daher bin ich jedem dankbar, der sich diesem Programmierproblem animmt - Ich brauche keine code-lösungen o.ä. sondern nur Hinweise <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich arbeite im Moment an einen code-editor für verschiedene Programmiersprachen (u.a. C). Dieser Code-Editor soll natürlich die Möglichkeit des Autovervollständigen haben. Hier beginnt für mich ein großes Problem.</p>
<p>Bei einer durchschnittsgröße der Code-Projekte von mehreren 10.000 zeilen kann es sehr schnell vorkommen, das beim Parsing Vorgang mehrere tausend Objekte (präprozessoren, funktionsdefinitionen usw.) erstellt werden.<br />
Diese speicher ich im Moment alle in mehreren Listen des typs boost::bimap&lt; NAME_DES_OBJEKTES, SET_OF&lt; POINTER DES OBJEKTES &gt;; (für jeden Typ wie: Datentypen, Variablen, Funktionen usw. eine Liste).<br />
Problematisch wird es nun bei der Geschwindigkeit der Auto-Complete-Vorschläge.</p>
<p>Jetzige Lösung: Der User gibt zum Beispiel &quot;ifd&quot; ein. Intern wird die Liste der 10.000 Objekte durchsucht und mit hilfe der Levenshtein distanz berechnet wie ähnlich der Name des Objektes zu dem Input ist. Bei ausreichend niedriger Distanz wird das Objekt der Auto-Complete liste hinzugefügt.</p>
<p>Das große Problem ist, dass dies einfach zu langsam ist. Bei ca. 10.000 (und das ist leider noch niedrig gegriffen) Objekten einen Levenshtein Algorithmus durchzuführen ist einfach zu viel verlangt für einen coder der 5 Zeichen in der Sekunde eingeben kann.</p>
<p>Daher hier meine eigentliche Frage: Wie würdet ihr das machen? Die Daten &quot;anders&quot; (wenn ja - wie?) speichern? Andere Algorithmen zur Ähnlichkeitsprüfung benutzen? Externe Tabellenlibraries benutzen (SQLITE o.ä.) für SELECT Abfragen?</p>
<p>Davon abgesehen: was würdet ihr machen, wenn der User z.B. erst ein &quot;b&quot; eingeben hat? Nach Levenshtein distanz ergibt hier jeder zweite Objekt natürlich einen Treffer. Nur welche der 5.000 Ergebnisobjekte sollte man anzeigen in der Auto-Complete liste?</p>
<p>Vielen Dank für das lesen und für jeden Ratschlag,<br />
mit freundlichen Grüßen,<br />
Timo Stark</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263724/große-listen-durchsuchen-levenshtein-distanz</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 14:32:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263724.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Mar 2010 10:49:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 10:52:39 GMT]]></title><description><![CDATA[<p>Guten Morgen,</p>
<p>Gleich am Anfang: Dieser Post könnte etwas länger werden - daher bin ich jedem dankbar, der sich diesem Programmierproblem animmt - Ich brauche keine code-lösungen o.ä. sondern nur Hinweise <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich arbeite im Moment an einen code-editor für verschiedene Programmiersprachen (u.a. C). Dieser Code-Editor soll natürlich die Möglichkeit des Autovervollständigen haben. Hier beginnt für mich ein großes Problem.</p>
<p>Bei einer durchschnittsgröße der Code-Projekte von mehreren 10.000 zeilen kann es sehr schnell vorkommen, das beim Parsing Vorgang mehrere tausend Objekte (präprozessoren, funktionsdefinitionen usw.) erstellt werden.<br />
Diese speicher ich im Moment alle in mehreren Listen des typs boost::bimap&lt; NAME_DES_OBJEKTES, SET_OF&lt; POINTER DES OBJEKTES &gt;; (für jeden Typ wie: Datentypen, Variablen, Funktionen usw. eine Liste).<br />
Problematisch wird es nun bei der Geschwindigkeit der Auto-Complete-Vorschläge.</p>
<p>Jetzige Lösung: Der User gibt zum Beispiel &quot;ifd&quot; ein. Intern wird die Liste der 10.000 Objekte durchsucht und mit hilfe der Levenshtein distanz berechnet wie ähnlich der Name des Objektes zu dem Input ist. Bei ausreichend niedriger Distanz wird das Objekt der Auto-Complete liste hinzugefügt.</p>
<p>Das große Problem ist, dass dies einfach zu langsam ist. Bei ca. 10.000 (und das ist leider noch niedrig gegriffen) Objekten einen Levenshtein Algorithmus durchzuführen ist einfach zu viel verlangt für einen coder der 5 Zeichen in der Sekunde eingeben kann.</p>
<p>Daher hier meine eigentliche Frage: Wie würdet ihr das machen? Die Daten &quot;anders&quot; (wenn ja - wie?) speichern? Andere Algorithmen zur Ähnlichkeitsprüfung benutzen? Externe Tabellenlibraries benutzen (SQLITE o.ä.) für SELECT Abfragen?</p>
<p>Davon abgesehen: was würdet ihr machen, wenn der User z.B. erst ein &quot;b&quot; eingeben hat? Nach Levenshtein distanz ergibt hier jeder zweite Objekt natürlich einen Treffer. Nur welche der 5.000 Ergebnisobjekte sollte man anzeigen in der Auto-Complete liste?</p>
<p>Vielen Dank für das lesen und für jeden Ratschlag,<br />
mit freundlichen Grüßen,<br />
Timo Stark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873716</guid><dc:creator><![CDATA[Timo.Stark]]></dc:creator><pubDate>Thu, 25 Mar 2010 10:52:39 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 11:12:54 GMT]]></title><description><![CDATA[<p>Noble Absichten aber ich persönlich mag eine Autovervollständigung die nur nach den ersten x Zeichen sucht, was natürlich wesentlich performanter zu implementieren ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873725</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Thu, 25 Mar 2010 11:12:54 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 11:13:32 GMT]]></title><description><![CDATA[<p>ein paar Ideen:</p>
<p>Auto-Vervollständigung erst anzeigen, wenn man eine bestimmte Anzahl (z.b.) 3 Zeichen hintereinander eingegeben hat. Ansnsonsten kann man bei kurzen Eingaben ja nur die Dinge anzeigen, die mit dem getippten anfangen.</p>
<p>Vielleicht ist die Levenstein-Distanz auch etwas overpowered? Du könntest zb nur Zeichenketten anzeigen, die das eingetippte genau enthalten. Oder du verwendest noch Abkürzungen für Bezeichner:</p>
<p>IchBinCamelCase könnte bspw. alse ibcc eingegeben und vorgeschlagen werden. oder ich_bin_mit_unterstrichen als ibmu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873727</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Thu, 25 Mar 2010 11:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 11:50:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Erstmal vielen Dank für die beiden Antworten.<br />
Die Levenshtein distance ist an sich eine sehr genaue Möglichkeit um viele verschiedene mögliche Tippfehler abzufangen.<br />
Vielleicht ist das auch nicht zu 100% richtig rüber gekommen. Im Moment wird bei weniger als 3 eingegebenen Zeichen nicht mit der Levenshtein Distanz Methode gearbeitet.</p>
<p>Eine Frage habe ich an euch beide: In wie weit stellt ihr euch vor, dass die Überprüfung bei längeren Strings schneller ist? Beispiel:</p>
<p>Bei weniger als 6 Buchstaben wird nur ein fehler akzeptiert, ab 6 zwei Fehler<br />
Eingabe: HetOpem, Ausgabe: --- ( GetOpenFilename wird nicht angezeigt, da zwei fehler)<br />
Eingabe: HetOpemFileN, Ausgabe: GetOpenFileName</p>
<p>Da es diese Abstufungen mit Anzahl der Buchstaben m. M. geben muss (desto mehr eingegeben wird desto mehr Fehler sind erlaubt), muss so mehrmals der name aller 10.000 objekte auf einen längeren String überprüft werden. Ist das performanter als bei kurzen Strings? (ich speicher bei kurzen strings natürlich auch nicht alle 5000 ergebnisse sondern nur die ersten 15).</p>
<p>Daher bitte ich um weitere Anregungen, wie ich so große listen performant nach String-Distanzen (ich bin hier auch weiterhin natürlich für andere Vorschläge offen) durchsuchen kann? (Und welche speicherform die liste hier am besten haben sollte).</p>
<p>Es gibt in SQLLITE im SELECT Befehl SOUNDEX ( SELECT * FROM _objects_ INTO .. WHERE SOUNDEX(object_name) = SOUNDEX(input) ) - Hat hiermit jemand Erfahrungen (bezgl. Performance?</p>
<p>Vielen dank schon mal für die Antworten,<br />
Timo Stark</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873742</guid><dc:creator><![CDATA[Timo.Stark]]></dc:creator><pubDate>Thu, 25 Mar 2010 11:50:45 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 13:03:10 GMT]]></title><description><![CDATA[<p>Hast du den Wikipedia-Artikel gelesen, insbesondere moegliche Verbesserungen?</p>
<blockquote>
<p>* We can adapt the algorithm to use less space, O(m) ...<br />
* If we are only interested in the distance if it is smaller than a threshold k ...<br />
* By examining diagonals instead of rows, and by using lazy evaluation, we can find the Levenshtein distance in O(m (1 + d)) time ...</p>
</blockquote>
<p>Hast du soetwas wie early out in Betracht gezogen unter Verwendung von oberer und unterer Schranke?</p>
<blockquote>
<p>* It is always at least the difference of the sizes of the two strings.</p>
</blockquote>
<p>D.h. ist dein String 4 Zeichen lang und dein Threshold 5, dann brauchst du alle Strings laenger als 9 in deiner Map gar nicht erst betrachten.</p>
<p>Schon ueber Parallelisierung nachgedacht? Die Rechnung String a1 zu String b1 kann unabhaengig von der Berechnung String a1 zu String b2 durchgefuehrt werden.</p>
<blockquote>
<p>Da es diese Abstufungen mit Anzahl der Buchstaben m. M. geben muss</p>
</blockquote>
<p>Das wuerde ich erst machen, wenn alle anderen Optionen ausgereizt sind. Alternativ kannst du dir auch den Smith-Waterman-Algorithmus fuer Sequenzalignment ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873769</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 25 Mar 2010 13:03:10 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 14:42:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Early-Out ist bereits implementiert. Ich bin mir allerdings ganz und gar nicht sicher warum ich noch nicht auf sowas wie OpenMP gekommen bin - das eignet sich ja geradezu perfekt dazu.</p>
<p>Werde hier mal einige Speed-Tests machen.</p>
<p>Vielen Dank für den Hinweis,<br />
Ich melde mich bei späteren Fragen zu diesem Thema,<br />
Grüße,<br />
Timo Stark</p>
<p>PS: Meinst Smith-Waterman-Algorithmus ist tatsächlich performanter? Die Komplexität &amp; Speicherverbrauch sind gleich / ähnlich. Nur die Implementation sieht recht komplex aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873814</guid><dc:creator><![CDATA[Timo.Stark]]></dc:creator><pubDate>Thu, 25 Mar 2010 14:42:17 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 15:03:42 GMT]]></title><description><![CDATA[<p>Timo.Stark schrieb:</p>
<blockquote>
<p>Meinst Smith-Waterman-Algorithmus ist tatsächlich performanter? Die Komplexität &amp; Speicherverbrauch sind gleich / ähnlich. Nur die Implementation sieht recht komplex aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Keine Ahnung, aber beim Sequenzalignment in der Bioinformatik, wenn man mehrere Terrabyte an Daten vergleichen muss, sollte es schon recht fix gehen. Ich verstehe auch nicht, warum es bei dir unzureichend lange braucht. Ist deine Implementation eher schlecht? Wie lange dauert es denn, die Distanz von &quot;idf&quot; (oder was auch immer) mit 10.000 anderen Strings zu berechnen (ohne early-out)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873816</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 25 Mar 2010 15:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 16:43:40 GMT]]></title><description><![CDATA[<p>manchmal ist es möglich die vergleiche vorzuberechnen. soundex zB passt hier zwar nicht so wirklich, aber es würde die 10.000 vergleichsobjekte vorberechnen können um somit die realtime vergleiche beim tippen enorm zu reduzieren.</p>
<p>gerade bei vervollständigungen kann man davon ausgehen dass die ersten x zeichen korrekt sind: dh, zB wenn das erste Zeichen nicht identisch ist, kann man gleich den vergleich abbrechen. oder aber andere primitivere tests laufen lassen, die ungenau aber eben schnell sind. und nur wenn der ungenaue test gemachtet hat, dann den teuren test laufen lassen.</p>
<p>uU macht es auch sinn das charset zu verringern. zB d und t gleichzubehandeln um so die komplexität der vergleiche zu reduzieren (auf kosten der treffer qualität natürlich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873863</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 25 Mar 2010 16:43:40 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 16:46:59 GMT]]></title><description><![CDATA[<p>das teil das du suchst heißt trixy <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
<a href="http://de.wikipedia.org/wiki/Trie" rel="nofollow">http://de.wikipedia.org/wiki/Trie</a></p>
<p>lg lolo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873865</guid><dc:creator><![CDATA[noobLolo]]></dc:creator><pubDate>Thu, 25 Mar 2010 16:46:59 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Thu, 25 Mar 2010 20:08:44 GMT]]></title><description><![CDATA[<p>noobLolo schrieb:</p>
<blockquote>
<p>das teil das du suchst heißt trixy <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
<a href="http://de.wikipedia.org/wiki/Trie" rel="nofollow">http://de.wikipedia.org/wiki/Trie</a></p>
</blockquote>
<p>Mehr Details bitte.<br />
trixy?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873934</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 25 Mar 2010 20:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Große Listen durchsuchen - Levenshtein distanz on Fri, 26 Mar 2010 08:27:11 GMT]]></title><description><![CDATA[<p>Okay ich werde mich dann heute abend an die Implementierung machen.<br />
Mein großes Vorbild bei der Sache ist eigentlich immer Visual Assist X ( <a href="http://www.wholetomato.com/products/features/suggestion.asp" rel="nofollow">http://www.wholetomato.com/products/features/suggestion.asp</a> ).</p>
<p>Ich werde das mit den Parallel-Programming versuchen &amp; denke ich wie ShadeOfMind vorgeschlagen hat davon ausgehen das bei weniger als ~4 eingegebenen Zeichen, die ersten Buchstaben für globale Objekte korrekt sind. (Für lokale (in der Umgebung definierte) Objekte wird diese einschränkung nicht gelten, da höhere Priroität ist).</p>
<p>Ich bedanke mich vielmals für die gute Hilfe hier in diesem Forum <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Viele Grüße,<br />
Timo</p>
<p>PS: Wegen Trixy: Das habe ich mir gerade mal angeschaut - sieht von der Basis her nicht schlecht aus, hat aber leider die falsche Lizenz für mich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874043</guid><dc:creator><![CDATA[Timo.Stark]]></dc:creator><pubDate>Fri, 26 Mar 2010 08:27:11 GMT</pubDate></item></channel></rss>