Ahoj,
potřebuji napsat objekt, který se bude chovat takhle:
Mějme 2D pole objektů:
Řekněme matice 3x3 pro jednoduchost, ve skutečnosti pole 65 535 * 65 535.
A1__B1__C1
A2__B2__C2
A3__B3__C3
Objekt A může posílat jen do B, B může posílat jen do C.
Objekt A nemůže posílat do jiného A, B do jiného B, C do jiného C.
Data jdou z vrstvy do vrstvy, nikdy jinak.
...
Spíš na okraj: v jakém jazyce to chcete psát? V jakém umíte?
Obecně:
Máte-li "matici" nějakých prvků, a potřebujete držet data o každém z nich, nebo o většině z nich, může být základem "2D pole o statických rozměrech" = alokovat jedním vrzem úplné pole objektů.
Sáhnout na objekt na konkrétních souřadnicích v matici pak víceméně znamená, vynásobit číslo sloupce délkou sloupce, připočíst adresu ve sloupci, to celé třeba ještě vynásobit alokační velikostí pointeru (64b systém = 8 bajtů) a připočíst bázovou adresu celého pole. Je to poměrně jednoduchá adresní aritmetika s pevným počtem kroků na tuto operaci.
Pokud ve skutečnosti potřebujete držet data jenom o nějaké podmnožině té "matice", tzn. matice je "řídká", dává smysl kvůli úspoře RAM (popř. také místa na disku) postavit tu matici pomocí "dynamických datových struktur" z prvků jako je pointer, seznam, seznam pointerů, kombinovaná obousměrná uspořádání typu "A ukazuje na právě jeden B, ale B potřebuje držet seznam pointerů na několik A", setříděný seznam, key->value asociativní pole, strom, partial mesh s jednosměrnými nebo obousměrnými vazbami...
Třeba řídké pole X*Y by se dalo postavit jako asociativní pole vnořené do asociativního pole, a konečným prvkem by mohly být objekty (held by value) nebo pointery/reference na ně...
Nebo dva vnořené spojové seznamy :-)
Spojový seznam má tu potenciální nevýhodu, že je třeba ho procházet stylem "předchozí/následující" (sledovat pointery). Takže operace "nalézt prvek číslo 2307" je otrava. Operaci vyhledání mají naopak rychlou asociativní kontejnery (indexy) založené na binárních stromech nebo hash tabulkách.
Můžeme mluvit o pointerech v low-level smyslu = adresa v paměťovém prostoru procesoru. Vzhledem k rozměru dat a vzhledem k letopočtu ty adresy budou 64bitové. Každý pointer uložený v paměti zabere 64 bitů = 8 bajtů.
Nebo vzhledem k tomu, že máte tabulku těsně pod 4 Giga objektů, můžete se odkazovat na pořadové číslo objektu, které bude 32bitové, nebo na dvě souřadnice každou 16b, nebo pokud víte, že odkazy jsou vždy zásadně do dalšího sloupce, tak vlastně stačí "svislá souřadnice" = 16b číslo (a který sloupec je následující může být dáno implicitně)...
Mimochodem pokud tu matici uděláte 65536 x 65536, můžete v části adresní aritmetiky pro rozklad na řádek/sloupec používat operace maskování a posuvu (bit-banging) namísto násobení a dělení... tedy pokud pro takovou operaci najdete ve svých algoritmech uplatnění...
Vlastně jsem ale mířil k ponaučení, že i "dynamické datové struktury" mají svou režii, a tedy se vyplatí až od určité "míry prořídnutí matice".
Jestli jsem trochu pochopil zadání, možná budete potřebovat nějaký hybridní přístup: pole o pevných rozměrech [X;Y] a možná nikoli řídké, kde v každé "buňce" bude nějaký "objekt" (C struct, C++ instance třídy apod.) který bude držet hrst proměnných, odkazů a může z něj rašit nějaký dynamický seznam nebo stromek apod.
A dále jak psal @speculatius... pokud algoritmus běží mezi dvěma-třemi řádky po sobě jdoucími, a nemáte dost RAM na celou datovou sadu, možná by se dal úplný soubor dat držet na disku a natáhnout do RAM vždycky jenom nějakou "podmnožinu", potřebnou ke zpracování... (několik sloupců po sobě jdoucích)
Ta data natékají do matice kontinuálně / iterativně do levého sloupce, a postupně probublávají doprava?
A je to tak, že dodáte vstup do levého sloupce, pak se spočítá celá matice, zahodí se mezivýsledky a všechno znova?
A říkáte, že v každé buňce potřebujete kompletní cestu přes všechny předchozí sloupce?
Podle "algoritmu agregace" se může jednat o seznam (délka = číslo sloupce), nebo strom (hloubka = číslo sloupce).
V každé "iteraci zpracování" se "dosavadní cesta" v aktuální buňce matice odhákne, a "předá se příslušné buňce o sloupec vpravo, ke vhodnému zaagregování do výsledné cesty pro tuto iteraci" (seznam/strom o patro naroste).
Mimochodem taková úplná "cesta" bude žrát dost paměti i pokud se bude jednat o prostou sekvenci (seznam), nedejbože strom. Předpokládám, že si v tomto bodě vysvětluji zadání špatně, protože to začíná připomínat ten vtipný čínský příběh se šachovnicí a zrnky rýže...
Potřebujete tu cestu uchovávat během výpočtu pro všechna políčka v tabulce, nebo jenom pro políčka v aktuálně počítaném sloupci?
Potřebujete během výpočtu uchovávat (alokovat) základní hodnoty pro celou matici, nebo vlastně stačí jenom pro aktuální sloupec? (nebo dva nebo tři)
Poslední dva dotazy míří na paměťovou náročnost.