Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe: wer kennt Matrizenoperationen?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
23.04.2009, 17:23 Uhr
~Manfred-BW
Gast


Hallo Kest,

so einfach ist es nun auch wieder nicht.
Du solltest das erste Posting richtig lesen.

Da geht nichts mit berechnen.

Im kleinen Beispiel ist die Kombination 1-2-3 drei mal enthalten,
die Kombination 3-17-24 nur einmal und die Kombination 1-2-4
viermal.

Bitte rechne mir das doch bitte mal an dem Beispiel mit den 10 Zahlenreihen
zu je 6 Zahlen aus und zeige alle verschiedene enthaltene Tripel in einer Liste mit ihrer
Anzahl des vorhandenseins!

Wie berechnest Du, daß 3-17-27 vorkommt und wie berechnest Du die Häufigkeit
für 3-17-27?

Gruß, Manfred-BW


----

Wenn man auf ein Posting antwortet, sollte man es auch richtig gelesen haben !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
23.04.2009, 17:51 Uhr
0xdeadbeef
Gott
(Operator)


Ich dachte, es geht darum, herauszufinden, in welchen Ziehungen wie viele der vorgegebenen Tripel vorkommen?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
23.04.2009, 23:13 Uhr
Kest
saint


Meinste alle diese Zahlenreihen als eine zu betrachten? Halt dann aus 60 Zahlen die Tripel rauszufischen???
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 23.04.2009 um 23:16 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
24.04.2009, 19:31 Uhr
Manfred-BW



Hallo,

also nochmal, es geht darum, daß man irgend welche
Reihen mit 6 Zahlen hat.

Im Programmbeispiel werden dazu etwa 4 Mio Zahlenreihen
erzeugt.

Jede Zahlenreihe hat 20 verschiedene Tripel. Da nun viele
Zahlenreihen identische Tripel zu anderen Zahlenreihen enthalten,
ergeben sich für die im Beispielprogramm speziellen 4 Mio
Zahlenreihen nur 2960 verschiedene Tripel.

Das Programm soll zählen, wie oft jedes einzelne der 2960
verschiedenen Tripel vorkommt und soll innerhalb 5 Sekunden
die verschiedenen Tripel und deren Anzahl feststellen und speichern.

Gruß, Manfred-BW
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
24.04.2009, 20:51 Uhr
0xdeadbeef
Gott
(Operator)


Wie lange das am Ende genau dauert, hängt von der Host-Maschine ab. Wie dem auch sei, das ganze ist mit der 3D-Tabelle ohne weiteres in O(n) implementierbar. Wichtig ist, dass die Ziehungen in sortierter Form vorliegen, also etwa (1, 2, 3, 4, 5, 6) statt (3, 1, 4, 5, 2, 6), damit die ausgewählten Tupel auch sortiert sind und nicht überprüft werden muss, ob ein äquivalentes Tupel bereits gefunden wurde (beispielsweise (1, 3, 5) und (3, 1, 5)). Dann halt stumpf durch die Ziehungen durchlaufen und die Tripel daraus in die 3D-Tabelle eintragen.

Auf meiner etwas altersschwachen Maschine krieg ich auf die Art eine Million zufällig generierte Ziehungen in knapp unter drei Sekunden gecruncht, vier Millionen dauerten (wegen der O(n)-Skalierung) dementsprechend etwa 10-12. Allerdings ist das Vorhaben deswegen etwas albern, weil mit sehr hoher Wahrscheinlichkeit bereits nach einigen Tausend Ziehungen alle 18424 möglichen Tripel abgedeckt sein werden - in meinem Sample nach 8261 Ziehungen (Dass dies im Beispielprogramm nicht passiert, liegt an der äußerst unglücklichen Ziehungsauswahl).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
25.04.2009, 21:40 Uhr
Manfred-BW



Hallo Oxdeadbeef,

fünf Sekunden sind natürlich nur eine Größenordnung.

Ich ließ gerade mein uncompiliertes Basic Programm für 4 Mio Zeilen laufen, einschließlich zählen
der vorhandenen Tripel, und nach 9 Stunden (!) war es immer noch nicht fertig.
(2,53 GHz Celeron Prozessor).
Jetzt änderte ich die Abfragebedingung auf 3 gleiche Zahlen mit "And" und die
compilierte EXE Datei braucht hochgerechnet ca. 2,5 Stunden

Deshalb interessieren mich deine Schleifendurchläufe sehr.

Mit geänderten Abfragen kann man doch einiges erreichen.
Jemand behauptete, sein VB Programm brauchte nur 20 Sekunden.
Ist in Deinem Programm bereits das zählen enthalten?

Warum mein Vorhaben nicht albern ist::

Ich suche KEINE nicht abgedeckten Tripel, mit der Hoffnung die müßten doch bald mal gezogen werden!

Sondern:
Bei optimierten Zahlensystemen mit optimierter Zeilenverteilung innerhalb der
14 Mio möglichen Zeilen im 6 aus 49 Lotto reichen genau 12 Zeilen aus, um
3.018.193 Zeilen mit garantiert 3 richtigen abzudecken, wenn die 6 gezogenen Zahlen
innerhalb dieser (verteilten) 3 Mio Zeilen vorkommen:

1 3 10 36 41 47
2 17 20 30 35 43
4 9 11 18 25 34
4 13 27 28 37 42
5 7 16 24 29 46
6 12 13 14 15 34
6 23 25 26 28 48
7 22 39 40 45 47
8 21 31 32 33 44
9 15 19 26 37 49
11 14 38 42 48 49
12 18 19 23 27 38

Wenn es aber 3 Mio aufeinanderfolgende Zeilen sind, reichen 12 Zeilen nicht mehr aus
um garantiert 3 richtige zu haben, man braucht einige mehr wegen zwangsläufig
autretenden Redundanzen bei den zu spielenden Zahlen.

Für eine Lottoziehung möchte ich, ausgehend von der Position der letzten gezogenen
Zahlen, mir einen Zahlenblock heraussuchen, von welchem ich vermute, daß in diesem
Zahlenblock die nächsten gezogenen 6 Zahlen sein könnten. Dieser Zahlenblock
kann 3 bis 5 Mio aufeinanderfolgende Zeilen enthalten und wird nach Beobachtung der
- sagen wir - letzten 10 Ziehungen ausgewählt ( welcher Bereich wäre wohl nun fällig? )

Aus diesem Zahlenblock möchte ich alle verschiedenen Dreierkombinationen mit deren
Häufigkeit wissen und dann aus diesen Dreierkombinationen mit einer gewissen Methode
wieder ca. 20 6er Reihen erzeugen, so daß garantiert 3 richtige Zahlen in den 20 gespielten
Tipps sind, egal welche Reihe aus den 3 bis 5 Mio Reihen die Ziehungszahlen enthält.
Mein Programm funktioniert bereits und ist für ein Zahlensystem z.B. 6 aus 20 innerhalb einiger
Minuten fertig.

Bei großen Zahlenbereichen (6 aus 49) dauert das ermitteln der zu spielenden Zahlen länger
als bis zur nächsten Ziehung, weil eben das feststellen und zählen der vorhandenen Tripel
zu lange dauert.

Ich würde mir dein Programm gerne anschauen, welche schnellere Abfrageroutine Du
verwendest als ich (sendest Du es mir zu, eventuell kommentiert ?)

Gruß, Manfred-BW

was heißt auf deutsch:

Παντον χρηµατων µετρον εστιν αντηροοποσ, τον µεν οντον οσ εστιν, τον δε ουκ ο ντον οσ ουκ εστιν.
-- Πρωταγόρας
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
26.04.2009, 10:37 Uhr
Manfred-BW



Hallo 0xdeadbeef,

meine Hochrechnung auf 2,5 Stunden Laufzeit war zu optimistisch.
Mit anwachsender Länge der Tripeltabelle erhöht sich die Abfragezeit
exponentiell. Mein EXE-Programm lief die ganze Nacht und jetzt ist die Abfrage
von 4 Mio Zeilen bei Zeile 1.800.000 angelangt. Deshalb denke ich,
daß eine Abfrage im Sekundenbereich nur mit Vektoren oder Zeigern
möglich ist.

Ein C-Programm mit Abfrageschleifen sollte nur etwa doppelt so schnell sein
wie ein compiliertes GFA 32bit-Basic.

Die Abfrage und Erfassung ALLER Tripel (20 X 4.000.000, mit Wiederholungen)
erfolgt bei mir auch innerhalb einiger Sekunden, jedoch führt das zum Programmabsturz
weil der Speicher vorher voll ist. Ein Feld mit 50.000.000 Zeilen und 4 Spalten wird dabei
innerhalb weniger Sekunden gefüllt

Zeitaufwendig wird die Abfrage, ob das momentan zu prüfende Tripel schon vorhanden ist.
Hierfür suche ich eine schnelle Lösung.

Gruß, Manfred-BW

Dieser Post wurde am 26.04.2009 um 11:06 Uhr von Manfred-BW editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
26.04.2009, 11:31 Uhr
0xdeadbeef
Gott
(Operator)


Mir ist unklar, was du mit "optimiertem Zahlensystem" und "optimierter Zeilenverteilung" meinst. Mit einer Ziehung deckst du höchstens 20 neue Tripel ab, und es gibt 18424 (49 über 3) mögliche davon. Um alle abzudecken, sind also mindestens 922 Ziehungen notwendig (ob eine solche Kombination von 922 Ziehungen existiert, habe ich nicht nachgeprüft), mit 12 kriegst du höchstens 240 abgedeckt.

Davon ganz abgesehen handelt es sich aber beim Lotto um eine rein zufällige Auswahl. Egal, was du ausrechnest, die Wahrscheinlichkeit, dass sie gezogen wird, ist genau so hoch wie die jeder anderen Kombination. Eine Kombination wird nicht dadurch unwahrscheinlicher, dass sie schon einmal gezogen wurde.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
26.04.2009, 14:06 Uhr
Manfred-BW



Hallo Oxdeadbeef

Erklärung optimiertes Zahlensystem am Beispiel aufeinanderfolgender Zahlen:

Für die Zahlenfolge 1-2-3-4-5-6 gibt es in genau 260624 verschiedenen Zeilen
(mindestens) einen der 20 Tripel und wenn eine dieser 260624 Zeilen zufällig
gezogen wird hat man (mindestens) 3 richtige Treffer.
Zu 1-2-3-4-5-6 möchte man noch einen zweiten Tip abgeben. der soll aber in Verbindung
mit dem ersten Tip möglichst viele neue Zeilen abdecken, damit sich die Gewinnwahrscheinlichkeit
für 3 richtige erhöht.
Wenn man nun 1-2-3-4-5-6-7 tippen würde, würden die zwei Zeilen zusammen insgesamt nur
375424 Zeilen abdecken, weil in der zweiten Zeile viele Tripel aus der ersten Zeile sich wiederholen.
Besser ist, für die zweite Zeile 7-8-9-10-11-12 zu tippen weil damit weitere 260624 Zeilen
erfaßt werden und man deckt jetzt 520848 Zeilen ab. Das ist eine Optimierung.
Das selbe gilt für alle weiteren zusätzlich auszuwählenden Tippreihen. Ab einer bestimmten Anzahl
Tippreihen läßt es sich aber nicht mehr vermeiden, daß weniger als 260624 Zeilen mit einer
zusätzlichen Tippreihe abgedeckt werden.

Erklärung für optimierte Zeilenverteilung:

Am Beispiel oben ist leicht zu sehen, daß in einer optimalen Zeilenverteilung kein
zusammenhängender Zeilenblock für die maximale Abdeckung möglich ist, oder der Zeilenblock
so groß gewählt werden muß, daß man zusätzliche Tippreihen zum abdecken braucht
Spätestens ab den Zeilen mit den Zahlen 1-2-7-8-13-14 haben wir Tripel in einem
Zahlenblock mit aufeinanderfolgenden Zahlen, welche mit unseren beiden Tippzeilen nicht
abgedeckt werden. Die mit unseren beiden Tippreihen abgedeckten Zeilen sind innerhalb der
14 Mio Zeilen verteilt, mit Lücken dazwischen. Also keine zusammenhängende Zeilenblöcke wie ich
sie aussuche.

Es geht mir nicht darum wieviele Tripel ich abdecke, sondern darum wieviel 6er Zeilen ich abdecke
die wenigstens einen meiner 20 Tripel enthalten und das sind wie bereits erwähnt, bis zu
maximal 260624 Zeilen.


Sicher, jeder Ziehung ist absolut zufällig und jeder Tipp den ich abgebe unterliegt diesem Zufall.
Man kann dafür überhaupt nichts berechnen.
Aber man kann über die Ziehungen statistische Untersuchungen anstellen und danach geplant
spielen, unabhängig davon ob das sinnvoller ist als Tippzahlen über einen Zufallsgenerator
erzeugen zu lassen. Am Ende sind beide Methoden wahrscheinlich gleich erfolgreich.
Mir macht das planvolle Spielen und dafür Programme zu schreiben aber mehr Spaß.


Gruß, Manfred-BW
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
03.05.2009, 11:58 Uhr
Manfred-BW



Hallo Oxdeadbeef,

Deine Antworten haben mir etwas weitergeholfen.
Leider wurden nicht alle Fragen bezüglich C++ beantwortet:

was bedeutet im Beispielprogramm nr[y1]=1 und wofür wird das benötigt?


Zitat:

...das ganze ist mit der 3D-Tabelle ohne weiteres in O(n) implementierbar...



Wie macht man das?


Das Beispielprogramm kann übrigens nicht funktionieren wegen der Zeile


Zitat:

if(m2[m[i][z1]][m[i][z2]][m[i][z3]]!=0) cont1=100;



Sobald eines der 20 Tripel bereits markiert ist wird cont1=100 und damit
wird die folgende Routine zum markieren vorhandener Tripel übersprungen.

Zum Beispiel ist die erste Zeile 2-3-4-5-6-7.
Alle 20 Tripel werden markiert.

Wenn nun die Zeile 2-3-4-8-9-10 ist, dann ist das Tripel 2-3-4 bereits markiert und das Tripel 8-9-10 wird nicht als vorhanden markiert, weil die Routine zum markieren durch cont1=100 übersprungen wird.

Es gibt nicht nur 2960 verschiedene Tripel im C++ Beispiel, sondern 17296 verschiedene, wie mein Basic Programm zählte.

Gruß, Manfred-BW


An alle Leser:

Gibt es hier im Forum eventuell noch andere Leute, die bereit sind mir weiterzuhelfen,
oder ist das Wissenspotential bzw. Hilfepotential hier bereits erschöpft?

Inzwischen bin ich so weit, daß ich verstanden habe, daß der Geschwindigkeitsgewinn
beim Tripel zählen darauf beruht, daß vorhandene Tripel aus einer zweidimensionalen Tabelle
mit Kombinationen von jeweils 6 Zahlen in einem dreidimensionalen Feld als vorhanden
markiert werden. Jede Position in diesem dreidimensionalen Feld kann man sich als einen kleinen Würfel vorstellen. Die Würfel selber stellen ein Tripel dar. Der Inhalt der Würfel ist
beim initialisieren null. Für jedes vorhandene Tripel aus 6 Zahlen wird dessen Inhalt im dreidimensionalen Feld um 1 erhöht.

Die Würfelanordnung im dreidimensionalen Tripelfeld m2 kann man sich so vorstellen:

Achse senkrecht nach unten: Skala für m[i][z1]

Achse waagrecht nach rechts: Skala für m[i][z2]

Achse nach hinten in die Tiefe: Skala für m[i][z3]


Ich bin gerade dabei, das dreidimensionale Feld in GFA-Basic 32 aufzubauen
und ich versuche dann die Tripel zu markieren.
(Der Geschwindigkeitsvorteil liegt meiner Meinung nach nicht nur am C++ Programm, sondern hauptsächlich am dreidimensionalen Feld welches verwendet wird. Ich denke da werden automatisch Zeiger verwendet, ohne daß man diese deklarieren muß)

Anschließend brauche ich eine Routine um die Tripel mit ihrer Häufigkeit auszulesen
und in eine zweidimensionale Tabelle einzutragen.

Die Frage ist für mich noch, ob ich erst alle verschiedenen Tripel mit 1 kennzeichnen muß und in einem zweiten Programm anschließend alle mit dem Inhalt 1 in ihrer Häufigkeit zähle, oder ob ich bei jedem neuen erscheinen eines Tripel dieses hochzählen kann, oder ob jedes Tripel - auch identische -(durch verschiedene i-Indexe) einen eigenen Namen hat, so daß nicht sofort hochgezählt werden kann (was ich vermute).

Wenn ich eine funktionierende C++ Vorlage hätte, könnte ich das schneller fertig kriegen.

Es nützt mir nichts wenn jemand sagt, daß er es in C++ hinbekommen hat und sich dann
nicht mehr meldet. Oder geht es in diesem Forum nur darum, Geld mit Programmierung verdienen zu wollen? Nach dem Motto "Ich weiß etwas was Du nicht weißt, und wenn ich es dir sagen soll, dann mußt Du zahlen"? Die erste Antwort von Hans auf meine Frage war ja bereits in diesem Stil verfaßt.

Gruß, Manfred-BW
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: