Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Array vergleichen


MungoPower - Do 01.10.09 18:54
Titel: Array vergleichen
Moin moin.
Ich weiß, dass es bereits einige Beiträge zu diesem Thema gibt, aber so ganz verstehen tu ich es noch nicht -.-

- Ich habe einen array[1..12] of string mit jeweils einem Buchstaben, z.B. array[1] := 'J';
- In einem weiteren Feld kann der Benutzer ein Wort eingeben, dass kürzer ist, als 12 Buchstaben
- Ich möchte nun wissen, ob dieses Wort mit den Buchstaben aus dem ersten Array gelegt wurde

Mein Ansatz:
- Zweites Wort in einem Array verwandeln
- arrays vergleichen, wenn also z.B. array1[1] = array2[4] ist, dann macht er weiter, wenn nicht, nicht
Wie gehtn das möglichst schonend? Ich könnte das nur mit 12 if-anweisungen in ner for schleifen...

Moderiert von user profile iconNarses: 2. Frage entfernt.

Viele Grüße
MungoPower
Moderiert von user profile iconNarses: Titel geändert.


platzwart - Do 01.10.09 19:35

user profile iconMungoPower hat folgendes geschrieben Zum zitierten Posting springen:
Moin moin.
2tes Problem:
Ich möchte den array1 zufällig sortieren, nicht alphabetisch oder so wie immer in den tutorials...


Wenn ich mich nicht täusche, dann ist "zufälliges Sortieren" = nicht sortiert?!?

Zum ersten Teil: Müssen die 12 Buchstaben in einem Array sein, oder darf man die auch als Zeichenkette aneinander hängen?


Kha - Do 01.10.09 20:35

Du willst also überprüfen, ob ein Array B eine Permutation eines anderen Arrays A ist. Am einfachsten, allerdings nur in O(n²), funktioniert das so:


MungoPower - Do 01.10.09 21:49

Zitat:
Wenn ich mich nicht täusche, dann ist "zufälliges Sortieren" = nicht sortiert?!?

Ähm ja, ich meine eigentlich die Buchstaben einfach willkürlich vertauschen, so dass da statt ANGSBUDE eben BUNDESTAG steht.

Zu 1.
Es ist ja keine richtige Permutation, weil das 2te Wort kürzer ist als das erste. Ich will also z.B. prüfen, ob "TAG" in "BUNDESTAG" enthalten ist.


Kha - Do 01.10.09 22:02

user profile iconMungoPower hat folgendes geschrieben Zum zitierten Posting springen:
Es ist ja keine richtige Permutation, weil das 2te Wort kürzer ist als das erste.
Achso, quasi die Permutation einer Kombination. Wenn du das kleinere Array als A nimmst, C auf die Größe von B setzt und den letzten Schritt weg lässt, sollte mein Algorithmus trotzdem passen.


MungoPower - Do 01.10.09 22:13

Danke für eure Mühen, ich hab eindlich eine Lösung gefunden..
Ich poste gleich, wie ichs gemeint hab, mom


Jann1k - Do 01.10.09 23:32

Andere Idee:

Ich sortiere beide Arrays (geht denke ich mit maximal O(n log n)) und vergleiche dann beide bis zum Ende vom kürzeren, sind die beiden Arrays bis zum Abbruch gleich ist die Eingabe okay.


Kha - Fr 02.10.09 00:18

[B;C] und [A;B;C] sind sortiert, sie haben trotzdem nicht den gleichen Anfang ;) .

Edit: Wenn du das allerdings weiter denkst, kommst du zu dem linearen Algorithmus, den ich im Kopf und auch schonmal implementiert habe: Beide Arrays werden jeweils nach gleichen Elementen gruppiert und die Größen der Gruppen festgehalten. Aus [A;B;B;C;B;A] würde beispielsweise [(A,2);(B,3);(C,1)]. Dann muss nur noch überprüft werden, ob die Größe jeder Gruppe im kleineren Array A kleiner als die der entsprechenden Gruppe in B ist. Sortieren ist nicht nötig, deswegen geht auch O(n).


MungoPower - Fr 02.10.09 18:23

Also, hab einfach so gemacht:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.BtTauschenClick(Sender: TObject);
var zufallszahl1, zufallszahl2, d : Integer;
    hilfsstring, wort, wort2 : string;
begin
for d := 1 to 4 do
 begin
 zufallszahl1 := (random(Length(EdAnzeige.Text))+1); //EdAnzeige.Text soll umsortiert werden
 zufallszahl2 := (random(Length(EdAnzeige.Text))+1);
 wort := EdAnzeige.Text;
 wort2 := EdAnzeige.Text;
 hilfsstring := EdAnzeige.Text[zufallszahl1];
 wort[zufallszahl1] := wort[zufallszahl2];
 wort[zufallszahl2] := wort2[zufallszahl1];
 EdAnzeige.Text := wort;
 end;
end;



Das ist zwar ein bissel unschön, aber ich fands einfach :D

Lg,
MungoPower