AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Algotithmus für Permutationen?

Ein Thema von AtWork · begonnen am 30. Dez 2004 · letzter Beitrag vom 31. Dez 2004
Antwort Antwort
AtWork

Registriert seit: 30. Dez 2004
3 Beiträge
 
#1

Algotithmus für Permutationen?

  Alt 30. Dez 2004, 21:57
Hallo!
Ich habe das folgende Problem: Bin auf der Suche nach einem möglichst schnellen Algorithmus zur Berechnung von Permutationen.
Ein Beispiel: Sei die Reihe {1,4,5,8,6,7,9} gegeben.
Die Permutation 012 kommt 3-mal vor ({1,4,5},{4,5,8},{6,7,9}), die Permutation 021 kommt 1-mal vor ({5,8,6}) und 201 kommt 1-mal vor ({8,6,7}).
Der Algorithmus sollte mir die Anzahl der Permutationen einer Sorte ausgeben, wobei die Art der "Sorte" keine Rolle spielt. Als Output würde also (3,1,1) ausreichen.
Bisher habe ich alles mit IF-Schleifen gemacht. Wenn ich aber mehr als 3 Zahlen vergleichen will, muss ich ziemlich viel tippen. Das geht bestimmt auch eleganter. Weiss jemand wie?

Vielen Dank....
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Algotithmus für Permutationen?

  Alt 30. Dez 2004, 22:11
Das, was du als Permutation bezeichnest, ist keine.
Könntest du vielleicht mal an einem Beispiel kurz erklären, wodurch sich die 'Permutation 012' definiert?


{
Zitat:
IF-Schleifen // ????
}
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#3

Re: Algotithmus für Permutationen?

  Alt 30. Dez 2004, 22:23
//Sorry, falsch gedacht...

Dust Signs
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat
AtWork

Registriert seit: 30. Dez 2004
3 Beiträge
 
#4

Re: Algotithmus für Permutationen?

  Alt 30. Dez 2004, 22:51
Ich nenne die drei zu vergleichenden Zahlen mal (x0,x1,x2). Wenn gilt x1 < x2 < x0 nenne ich die Permutation 120. Deshalb müsste der ({5,8,6}) oben auch die 120 zugeordnet werden. Mein Fehler...
Bei z.B. x2 < x0 < x1 nenne ich sie 201.
Ok?
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Algotithmus für Permutationen?

  Alt 30. Dez 2004, 23:12
Von dieser Einteilung von Permutationen hab ich noch nie gehört, naja, wenn du sowas auch mit längeren Auschnitten machen willst, solltest du dir eine Funktion schreiben, die dir zurückgibt, welcher Art die übergebene Folge ist. (ich geh mal davon aus, dass es sich um natürlich Zahlen handelt)

Etwa so
Delphi-Quellcode:
type
tDynIntegerArray

Function SageMirDenTyp(list: tDynIntegerArray): tdynintegerArray;
var
cnt,i,j,max,wo: integer;
begin
cnt:= length(list);
setlength(result,cnt);

for i:= 0 to cnt-1 do
begin
 max:= list[0];
 wo:=0;
   for j:= 1 to cnt-1 do
   begin
     if list[j] > max then
     begin
     max:= list[j];
     wo:=j;
     list[j]:=0;
     end;
   end;
 result[i]:=wo;
end;
Das ist ein etwas abgewandelter Selection-Sort Algorhytmus der dir eigentlich den Typ deiner Reihe zurückgeben sollte.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
AtWork

Registriert seit: 30. Dez 2004
3 Beiträge
 
#6

Re: Algotithmus für Permutationen?

  Alt 31. Dez 2004, 10:54
@ Toxman: Vielen Dank für die Mühe!. Leider funktioniert Dein Algorithmus so nicht. Habs mal ausprobiert, aber er liefert nur (000), (120) oder (100). Verbessern konnte ich es aber bisher auch nicht. Hat irgendwas damit zu tun, dass die Werte in der zweiten FOR-Schleifen auf Null gesetzt werden...
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Algotithmus für Permutationen?

  Alt 31. Dez 2004, 13:58
Der Code war nur so als Ansatz gedacht. Die Idee dahinter ist die vom Selectionsort, da kannst du was in den Tutorials drüber nachlesen. Ich habe ihn selbst nicht getestet.

Ich glaube aber, dass ich einen wichtigen Fehler gesehen habe.
Es sollte so etwas besser gehen:

Delphi-Quellcode:
Function SageMirDenTyp(var list: tDynIntegerArray): tdynintegerArray;
var
cnt,i,j,max,wo: integer;
begin
cnt:= length(list);
setlength(result,cnt);

for i:= 0 to cnt-1 do
begin
max:= list[0];
wo:=0;
   for j:= 1 to cnt-1 do
   begin
     if list[j] > max then
     begin
     max:= list[j];
     wo:=j;
     // list[j]:=0; Eindeutig an der falschen Stelle
     end;
   end;
result[i]:=wo;
list[wo]:=0; // Jetzt erst ist sicher, dass dieser Wert nicht mehr benötigt wird.
end;
Natürlich besteht die übergebene List nachher nur noch aus Nullen, wenn dir das nicht gefällt, musst du noch eine Kopie erstellen.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Antwort Antwort


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:06 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