AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi "Überlappungen" zwischen zwei Strings
Thema durchsuchen
Ansicht
Themen-Optionen

"Überlappungen" zwischen zwei Strings

Ein Thema von Der schöne Günther · begonnen am 15. Jun 2020 · letzter Beitrag vom 15. Jun 2020
Antwort Antwort
Seite 1 von 2  1 2      
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

"Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 08:24
Mein Covfefe ☕ scheint heute noch nicht zu wirken.

Angenommen ich habe zwei Strings Eins Zwo Hallo Welt und Hallo Welt Guten Tag . Ich möchte die zwei Strings konkatenieren, allerdings "ohne das doppelte mittendrin":

Code:
Eins Zwo Hallo Welt
         Hallo Welt Guten Tag

=>

Eins Zwo Hallo Welt Guten Tag
Gibt es da einen trivialen Lösungsansatz? Schwere Geschütze mit Queues/Stacks oder regulären Ausdrücken wollte ich vermeiden.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#2

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 08:54
Ohne das doppelte mitten drin oder allgemein doppelte Wörter?
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:21
Auf Anhieb fällt mir nur das naive Vorgehen ein:
  • Suche das erste Zeichen des zweiten Strings im ersten Strings (also im Beispiel "H")
  • Überprüfe, ob ab dieser Stelle der Rest des ersten Strings mit dem Anfang des zweiten übereinstimmt
  • Falls nicht, suche das nächste Vorkommen des ersten Zeichens im zweiten Strings. (*)
  • Falls ja, hat man die Überlappung gefunden und kann die Strings zusammenbauen

(*) diese Stelle kann man ggf. beschleunigen, wenn man ähnliche Tricks anwendet wie bei Knuth-Morris-Pratt. Damit sollte man dann auf eine lineare Worst-Case-Laufzeit kommen, die so erstmal nicht garantiert ist.
The angels have the phone box.
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:34
Wie wäre es, wenn man die Strings übereinander legt und prüft, ob die überlappenden Buchstaben/Teilstring gleich sind. Wenn ja, hat man die Überschneidung. Wenn nein, verschiebt man den 2. String um eine Stelle und prüft wieder. Da böte sich vielleicht eine rekursive Lösung an.

Code:
Eins Zwo Hallo Welt
Hallo Welt Guten Tag

Eins Zwo Hallo Welt
 Hallo Welt Guten Tag

Eins Zwo Hallo Welt
  Hallo Welt Guten Tag

...

Eins Zwo Hallo Welt
         Hallo Welt Guten Tag
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#5

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:39
Vorab eine blöde Frage:

Kann auch folgendes vorkommen:

1. Eins Zwo Hallo Welt
2. Drei Hallo Guten Tag
= keine Überlappung.

Oder:

1. Eins Zwo Hallo Welt Drei
2. Hallo Welt Guten Tag
= Eins Zwo Hallo Welt Guten Tag Drei

Oder ist es immer so, das der Beginn der möglichen Überlappung am Anfang des zweiten Strings definiert ist?
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:42
Oder ist es immer so, dass der Beginn der möglichen Überlappung am Anfang des zweiten Strings definiert ist?
Ganz genau: Ende von 1 = Anfang 2
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.049 Beiträge
 
Delphi 2009 Professional
 
#7

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:49
Irgendwie so?
Delphi-Quellcode:
uses Math, StrUtils;

Length1 := Length(Text1); // man sollte LeftStr und RightStr unten ersetzen durch das wesentlich effizientere Copy, wofür man das hier braucht, dafür bin ich aber zu faul
for i := 1 to Min(Length(Text2), Length1) do
if RightStr(Text1, i) = LeftStr(Text2, i) then
Exit(Text1, Copy(Text2, i, High(Integer)));
raise Exception.Create('geht nicht');
Je nach Anforderung muss man die Schleife umdrehen.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 09:55
Dann würde ich erstmal die Methode von mir (bzw. die von Nersgatt, das ist ja identisch) nehmen. Kann man natürlich in der Hinsicht optimieren, dass das erste "Übereinanderlegen" so anfängt, dass der untere String rechtsbündig mit dem ersten ist. Vorher ergibt die Suche ja keinen Sinn.

Und wenn eine gute (d.h. lineare) Worst-Case-Laufzeit wichtig ist (Probleme machen bei solchen Ansätzen Strings wie "abababababaC"), dann schau dir Knuth-Morris-Pratt an und modifiere den etwas. Das "Muster" wäre dann der zweite String, und die Modifikation muss so sein, dass das Muster auch als "gefunden" gilt, wenn es nach rechts über den "Text" (also der String in dem gesucht wird) herausragt.

"Bruteforce" wäre natürlich eine Schleife mit AnsiStartStr und AnsiEndStr (oder vergleichbaren Ansätzen, siehe Beitrag von Redeemer). Bei kurzen Strings ist das aber sicherlich vertretbar, d.h. wenn die Programmierkosten hier relevanter sind als eine gute Laufzeit.
The angels have the phone box.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 10:07
schau dir Knuth-Morris-Pratt an
Vielen Dank an alle, das werde ich tun.

Vorher schaue ich aber ob ich nicht vielleicht doch um den Abgleich drum herum komme 😎
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
877 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: "Überlappungen" zwischen zwei Strings

  Alt 15. Jun 2020, 10:20
Vielen Dank an alle, das werde ich tun.
Vielleicht, um das klar zu stellen: KMP ist theoretisch interessant, in der Praxis ist das bei "normalen" Texten eher nicht so wichtig. Diesen Programmieraufwand kann man sich in der Regel sparen, da die problematischen Muster praktisch nie auftreten. Relevant wird das ggf., wenn deine Strings DNA-Sequenzen sind (und somit die Anzahl der verschiedenen Buchstaben sehr gering ist), aber sonst eher nicht.

Habe damals meine Diplomarbeit darüber geschrieben, daher reite ich da manchmal gerne drauf rum.
Ein kleines Animationsprogramm, was z.B. auch die Anzahl der Vergleiche bei verschiedenen Verfahren ausgibt, gibt es auf meiner Webseite.

Aber wenn ich das nochmal überdenke: Der Boyer-Moore-Ansatz könnte hier (wieder etwas modifiziert) auch funktionieren ... (und der ist leichter zu implementieren, imho).
The angels have the phone box.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz