AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein "ABCD" in allen möglichen Kombinationen
Thema durchsuchen
Ansicht
Themen-Optionen

"ABCD" in allen möglichen Kombinationen

Ein Thema von -lx- · begonnen am 4. Okt 2006 · letzter Beitrag vom 9. Okt 2006
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#21

Re: "ABCD" in allen möglichen Kombinationen

  Alt 7. Okt 2006, 11:16
Ich würde mal sagen, ein solcher Algorithmus sollte schon generisch sein.

Und im allgemeinen kann man sagen: Schneller als von Hagen gehts ned.

@Cöster: Ja, ich weiß. Das hab ich ja gleich gesagt. Aber die Aussage, ein String könne nur 255 Zeichen lang sein, stimmt auch nicht. Jedenfalls nur für ShortStrings, also diese alten Dinger.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#22

Re: "ABCD" in allen möglichen Kombinationen

  Alt 7. Okt 2006, 11:31
Zitat von 3_of_8:
Aber die Aussage, ein String könne nur 255 Zeichen lang sein, stimmt auch nicht.
Hab ich das gesagt?

Zitat von Cöster:
Das Wort kann aus bis zu 255 Zeichen bestehen.
Code:
if Ein String = Das Wort then
  ich hab gelogen
else
  hab ich auch nie gesagt
@ Dino: Bei mir ist meine Variante ca. doppelt so schnell wie deine. Aber bei 7 Zeichen ist die Geschwindigkeit ja sowieso nicht so wichtig.

Fliegt der Code von Hagen hier auch irgendwo im Forum rum? Würd mich mal interessieren. Können normal Sterbliche den überhaupt verstehen?
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#23

Re: "ABCD" in allen möglichen Kombinationen

  Alt 7. Okt 2006, 13:33
also, schneller gehts immer, es gibt immer andere Programmierer die noch mehr drauf haben als man selber drauf hat. Ich verwehre mich also hiermit ausdrücklich das meine Codes die schnellsten sein müssen. Allerdings bin ich schon ein Freak der den Ehrgeiz hat den bestmöglichen Algorithmus zu finden, und dabei natürlich ne Menge lernen möchte. Das impliziert aber eben nicht das meine Codes die schnellsten sein müssen. Auf Alzaimar, Olliver oder NicoDE und auf die viele Anderen hier würde die gleiche Aussage auch zutreffen.

http://www.delphipraxis.net/internal...561&highlight=

Es findet sich hier in der DP aber auch eine Lösung von Alzaimar die ich persönlich als sehr elegant empfinde und die mindestens genauso effizient sein muß wie die meinige. Einfach mal suchen.

Zitat:
Können normal Sterbliche den überhaupt verstehen?
Nöö, natürlich nicht, ich bin ja anscheinend unsterblich. Nur merke ich die letzten 2 Wochen davon nichts, sonst würde ich nicht auf Grund meiner derzeitgen Bronchitis nicht ständig am Husten sein (Raucher) Klar wirst du ihn verstehen du musst dich halt nur intensiv damit beschäftigen wollen.

Gruß Hagen
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#24

Re: "ABCD" in allen möglichen Kombinationen

  Alt 7. Okt 2006, 14:18
Um mal meinen Senf dazuzugeben, hier die kurze Version. Ich find sie auch elegant, vor allen Dingen, weil Sie als Abfallprodukt eines anderen Problems enstanden ist. Davor habe ich mich mit Inversen und Graycodes beschäftigt, um Permutationen zu erzeugen, aber das ist ein anderes Thema.

Delphi-Quellcode:
Type
  TCharSet = Set Of Char;

Procedure TForm1.Permutation(Const aString, aResult : String; anIndex : Integer; aUsedChars : TCharSet);
Var
  i : Integer;

Begin
  For i:=1 to Length (aString) do
    if not (aString[i] in aUsedChars) then
      If anIndex = Length (aString) Then
        Memo1.lines.add(aResult+aString[i])
      Else
        Permutation (aString, aResult + aString[i], anIndex + 1, aUsedChars + [aString[i]]);
End;
Aufruf mit
Permutation (edit1.Text, '',1, []) Der Algorithmus versagt allerdings, wenn ein in einem Wort ein Zeichen doppelt vorkommt, aber das sind dann klassisch gesehen keine Permutationen, denn die basieren ja auf einer Menge von Zeichen. Und in einer Menge gibts keine doppelten Elemente (gott-sei-dank).

Ein Wort noch zu der Performance. Bei diesem Minimalalgorithmus habe ich bewusst darauf verzichtet, den Flaschenhals "Stringkonkatenation" wegzuoptimieren. Das Problem ist ja der rekursive Aufruf, in dem eine Konkatenation steht.
Ein winziger Test bestätigt allerdings, das der Geschwindigkeitszuwachs marginal ist. Erst bei Wortlängen>7 ist überhaupt eine Verzögerung spürbar und dann geht der Performancegewinn schon gegen 0.

Viel wichtiger ist der Container, der die Permutationen aufnehmen soll. Eine Stringliste wie hier (womöglich noch als visuelles Element) ist sowieso die größte Bremse. Besser ist ein dynamisches Array, das vorher auf die korrekte Länge (N!) gesetzt wird.

Ich kann mir allerdings keinen Fall vorstellen, bei dem man zunächst alle Permutationen erzeugt, um sie dann -wie auch immer- zu verarbeiten. Normalerweise lässt sich ein solches Problem viel eleganter (und damit meist auch performanter) lösen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
-lx-
(Gast)

n/a Beiträge
 
#25

Re: "ABCD" in allen möglichen Kombinationen

  Alt 9. Okt 2006, 23:26
Hallo.


Nach langem informieren, überlegen und ein wneig lunzen auf andere Codes hab ich nun etwas zu stande gebarcht bzw. zu "Papier".

Ich will euch dne Code nicht vorenthalten, jedoch läuft er noch nicht einbahnfrei. Sprich: Er gibt was aus aber noch das falsche.

Da mir die Lösung erst um 12 Uhr (24 Uhr Ortszeit) eingefallen ist, hab ich nun nicht mehr die Kraft alles durhc zu spinnen und zu überlegen wo der Haken liegt.

Wer mag kann sich diesen NOCH FEHLERHAFTEN Code anschaun und vll. auch mal kurze Hilfestellung geben


Delphi-Quellcode:
procedure Permutation(n: Integer; const Text: String) ;
    var i: Integer ;
        CopyText, Neu: String ;
        begin
          CopyText:= Text ;
          For i:= n To length(CopyText) Do
              begin
                If length(CopyText) >= 1 Then
                    begin
                      showmessage('hallo');
                      Neu:= Neu + CopyText[i] ;
                      Delete(CopyText, i, 1) ;
                    end
                Else
                    begin
                      Neu:= Neu + CopyText[i] ;
                      Memo1.Lines.Add(Neu) ;
                    end;
                If n < length(CopyText) Then Permutation(n+1, Text) ;
                Memo1.Lines.Add(Neu) ;
              end;

        end;

Gute Nacht alle miteinder


//Edit: Ich merke, da ist noch einiges an Verbesserung nötig ...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 14:48 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