Autor Beitrag
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Do 29.10.20 16:45 
Blöder Titel aber mir fällt nichts besseres ein.

Folgender Sachverhalt. Ich habe viele Arrays mit Integerwerten. Die einzelnen Werte sind jeweils nur einmal vorhanden, können aber in beliebiger Reihenfolge vorkommen.

Nun möchte ich prüfen ob es Arrays gibt die zwei bzw. zwei bis drei gleiche Zahlen beinhalten.

Die einfache Variante mit zwei Zahlen ist simpel. Ich mache mir hier im Prinzip die Binärzahlen zunutze und rechne die Werte des Arrays,wenn der Inhalt größer 0 ist, einfach zusammen in der Art 2^(A[1]-1) + 2^(A[2]-1) ... . Und zähle parallel dazu mit wie viele positive Werte das Array hatte. Danach muss ich nur noch die Resultate vergleichen und komme so ziemlich einfach zu meinen Treffern.

Mit drei Zahlen geht das auch, jedoch gibt es hier einen Spezialfall, denn es würden auch folgende Kombinationen gelten
ausblenden Quelltext
1:
2:
3:
Array1 = 2 3 4
Array2 = 2 3
Array3 =   3 4

Gibt es eine, wie auch immer geartete, "Bitmagie" um einfach zu erkennen, dass 14,6 und 12 zueinander gehören?

Keine Ahnung von was ich rede? Es geht um einen kleinen Solver für Str8ts und ich implementiere da jetzt sukzessive die verschiedenen deduktiven Methoden.

Aktuell bin ich gerade an der Str8ts: Nackte Gruppen Methode dran.

:oops: :oops: Die heissen wirklich so.

Moderiert von user profile iconTh69: Code-Tags hinzugefügt
Moderiert von user profile iconTh69: URL-Titel hinzugefügt.

_________________
mfg. Joel
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Do 29.10.20 23:36 
Hallo,

mit reiner "Bitmagie" wird das nicht gehen. Gehen würde mit DF="Deine Formel":

AnzahlEinsen(DF(Array1) AND DF(Array2));

Die Anzahl der gesetzten Bits entspricht ja der Anzahl der Übereinstimmungen in dem AND der beiden Arrays. Das Zählen der gesetzten Bits - meine Funktion AnzahlEinsen - wirst Du mit einer kleinen Schleife selbst programmieren müssen. Aber vielleicht hilft Datenbits effektiv zählen, wo ein als effektiv beschriebener Delphi-Code dargestellt ist.

Gruß GuaAck

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.
JoelH Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Fr 30.10.20 09:49 
Super,

das hat mich auf den richtigen Kurs gebracht. :zustimm:

Der Zusammenhang ist folgender, so wie ich die Ziffern binär codiere müssen die beiden kleineren Teile jeweils zwei Bit mit dem Dreierarray gemeinsam haben und untereinander mindestens 1 Bit.

_________________
mfg. Joel
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Sa 31.10.20 10:08 
Kannst du dafür evtl. ditrekt Hashsets nehmen?

Die haben eine schnelle Intersect Methode, damit kannst du Schnittmengen abfragen: docs.microsoft.com/e...ith?view=netcore-3.1
Blup
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 173
Erhaltene Danke: 43



BeitragVerfasst: Do 14.09.23 03:00 
Das ist völlig irreführend:
user profile iconJoelH hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe viele Arrays mit Integerwerten. Die einzelnen Werte sind jeweils nur einmal vorhanden, können aber in beliebiger Reihenfolge vorkommen.

- bis zu 4Mrd. Arrays ?
- jedes Array bis zu 4Mrd. Einträge ?
- jeder Eintrag kann einen aus 4Mrd. Zustände haben ?

Als Überschrift viel besser geeignet, wird hier das eigentliche Problem beschrieben:
user profile iconJoelH hat folgendes geschrieben Zum zitierten Posting springen:
Es geht um einen kleinen Solver für Str8ts

- tatsächlich nur ein Array mit 9x9 Feldern
- jedes Feld kann mit 9Bits für die (noch) möglichen Ziffern, 1Bit für Schwarz/Weis, optional 1Bit für ursprünglich vorbelegt ja/nein dargestellt werden

Im Prinzip kann man die selben Strategien wie beim Sodoku anwenden.
Die besondere 3. Bedingung ist ein bischen schwieriger zu implementieren.
Um eine vollständige Lösung für die schwersten Rätsel zu finden, müssen verschiedene Belegungen mit Rekursion ausprobiert werden.