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 <
020
03.05.2009, 14:47 Uhr
0xdeadbeef
Gott
(Operator)


Denn Sinn von nr kann ich aus dem Beispielcode nicht ersehen, das habe ich dir auch ganz zu Anfang schon mal geschrieben. Eine Laufzeitkomplexität von O(n) ergibt sich daraus, dass ein dreidimensionales Array sich in konstanter Zeit adressieren lässt, sich dementsprechend jede Ziehung in konstanter Zeit verarbeiten lässt, und dementsprechend die Laufzeit des Programms linear mit der Anzahl der Ziehungen skaliert. Das gilt allerdings nur für das Rausfummeln der gezogenen Tripel, das Raussuchen von Ziehungen, die alle Tripel abdecken, dürfte ungleich komplizierter sein.

Dass ich den Code hier nicht reingestellt habe, lag vor allem daran, dass ich die Vermutung hatte, dass es sich bei der ganzen Kiste um eine Hausaufgabe handelt, und ein Hausaufgabenservice sind wir hier nicht. Inzwischen dürfte dafür aber wohl zu viel Zeit vergangen sein, also:

C++:
#include <cstddef>
#include <fstream>
#include <iostream>
#include <list>
#include <ostream>

struct tripel {
  int x, y, z;

  tripel(int x, int y, int z)
    : x(x), y(y), z(z) { }
};

std::ostream &operator<<(std::ostream &out, tripel const &t) {
  return out << '(' << t.x << ',' << t.y << ',' << t.z << ')';
}

typedef unsigned ziehung_t[6];
typedef unsigned pruefraum_t[50][50][50];
typedef std::list<tripel> buchfuehrung_t;

void check_tripels(pruefraum_t pr, ziehung_t zg, buchfuehrung_t &bf) {
  int x, y, z;

  for(x =     0; x < 4; ++x) {
    for(y = x + 1; y < 5; ++y) {
      for(z = y + 1; z < 6; ++z) {
        if(++pr[zg[x]][zg[y]][zg[z]] == 1) {
          bf.push_back(tripel(zg[x], zg[y], zg[z]));
        }    
      }
    }
  }
}

int main() {
  pruefraum_t zaehler = { { { 0 } } };
  ziehung_t z;
  buchfuehrung_t bf;

  // muss sortierte Ziehungen enthalten!
  std::ifstream in("ziehungen.txt");

  while(in >> z[0] >> z[1] >> z[2] >> z[3] >> z[4] >> z[5]) {
    check_tripels(zaehler, z, bf);
  }

  for(buchfuehrung_t::const_iterator i = bf.begin(); i != bf.end(); ++i) {
    std::cout << *i << ": " << zaehler[i->x][i->y][i->z] << std::endl;
  }
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 03.05.2009 um 14:49 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
03.05.2009, 18:33 Uhr
Manfred-BW



Oxdeadbeef,

danke für den Code.

Da ich dem Rentenalter nahe bin (jedoch noch lernfähig),
geht es nicht um irgendwelche Hausaufgaben, sondern um mein Hobby.

Mein Basicprogramm funktioniert schon teilweise und zwar rasend schnell
(unabhängig von Deinem Beispielcode).

18424 verschiedene Tripel werden in einigen Sekunden gefunden, durch erzeugen und auslesen
des dreidimensionalen Feldes.

Jetzt geht es noch darum, nur die speziellen gesuchten Tripel auszufiltern
und zu prüfen ob das Programm wirklich das macht was ich wollte.

Gruß, Manfred-BW
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
11.09.2010, 17:24 Uhr
labman



Hello Manfred-BW , I know this is an old subject, but i just thought of a linear solution:
this solves a general dreiertable in an general matrix.
the approach is to hash the dreiertable then just linear scan for pattern.
fun problem !

HTH labman

' matrix problem, different approach, by lb / labman
' not optimized for clarity
' written in gfabasic32, see http://sites.google.com/site/gfabasic322/

Global dreiermaks = 8 'highest number in dreiertable
Local mx = 20 'matrix width
Local my = 20 'matrix height
Local matrixmaks = 15 'highest number in matrix ( must be bigger than mx!)

matrixmaks = Max(mx, matrixmaks)

Global Dim entry(dreiermaks ^ 3) As Boolean 'this holds all used kombinations of the dreiertable
Global Dim matr(mx, my)

Randomize 100

dreier(dreiermaks)
matrixgen(mx, my, matrixmaks) ' width, height to pattern search

Print "# of matches:"; findpattern(mx, my)


Proc dreier(dmaks)
Local a, b, c, slotindex

For a = 1 To dmaks
For b = a + 1 To dmaks
For c = b + 1 To dmaks
Print a; b; c
slotindex = a * dreiermaks * dreiermaks + b * dreiermaks + c
entry(slotindex) = True
Next c
Next b
Next a


Proc matrixgen(mx, my, mmaks)
Dim picktable(mmaks)
Local x, y, mark, num
For y = 1 To my
' produce some uniqe numbers for each row
' mark mx * tableentries by random
mark = 1
Repeat
num = Random(mmaks) + 1
If picktable(num) = 0
picktable(num) = 1
Inc mark
EndIf
Until mark > mx
Debug mark
' fill matrix row with sorted numbers
x = 0
For mark = 1 To mmaks
If picktable(mark)
Inc x
matr(x, y) = mark
Print AT(10 + x * 3, y); mark
EndIf
Next mark
Debug x;
ArrayFill picktable(), 0

Next y
EndProc

Function findpattern(mx, my)
Local x, y, key, found
For y = 1 To my
For x = 1 To mx - 4
If matr(x, y) < dreiermaks And matr(x + 1, y) < dreiermaks And matr(x + 2, y) < dreiermaks
key = matr(x, y) * 36 + matr(x + 1, y) * 6 + matr(x + 2, y)

If entry(key)
Inc found
EndIf

EndIf
Next x
Next y
Return found
EndFunc
 
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: