Kezdőoldal » Számítástechnika » Programozás » Bináris fa tárolása?

Bináris fa tárolása?

Figyelt kérdés

Biráris fa adatait szeretném eltárolni a lehető leggazdaságosabban, természetesen úgy, hogy a fa az állományból visszaállítható legyen.

A tárolandó adatok tipusa byte.


Előre is köszönöm.



2020. júl. 1. 20:07
1 2 3 4 5
 1/43 anonim ***** válasza:
24%

"Biráris fa adatait szeretném eltárolni a lehető leggazdaságosabban"

Csinálsz egy bináris fát, nem sok opció van benne...

Hol akadtál el? Vagy mi a kérdés?

2020. júl. 1. 20:17
Hasznos számodra ez a válasz?
 2/43 anonim ***** válasza:
50%

Olvasd át ezt az anyagot, szerintem választ ad a kérdésedre:

[link]

2020. júl. 1. 20:44
Hasznos számodra ez a válasz?
 3/43 anonim ***** válasza:
0%

Eltárolod az inorder és a preoder listáját a fának.

Visszafejtés: végigmész a preorder listán, megkeresed ezt az elemet az inorderben. Ilyenkor bal és jobb részre oszlik az inorder lista. A bal oldali elemek a preorderből kiválasztott csúcs bal, a jobb oldaliak a jobb oldalon fognak elhelyezkedni. Veszed a preoder következő elemét, szintén megkeresed az inroder listában, de a lista itt már csak az a szakasz, amelyikbe beleesett az előző keresés eredményeként. Ezt addig folytatod, amíg megkapod a triviális esetet: az inorderben megkapott elem a 3 elemű szakasz középső eleme (aminek a két oldala a két gyereke). Így rekurzívan, alulról építed a fát.

2020. júl. 1. 20:47
Hasznos számodra ez a válasz?
 4/43 anonim ***** válasza:

A csúszok száma * 2 byte az nagyon sok? Ha nem, akkor csak szépen mentsd le sorban a csomópontokat és a részfákat. A csomópontonkénti +1 byteban pedig megadhatod, hogy melyik részfa létezik, ez igazából csak 2 bit, szóval csomóponton * 10 bit is elég az egyszerű sorosításhoz, de ekkor bitekkel kell "bűvészkedni".


Szóval mennyire gazdaságos tárolás kell? Lehet tudni valamit a fáról? Pl teljes bináris fa? Mert ekkor elég csomópont * 1 byte is.


Tényleg ennyire gond a csomópont * 2 byte, amivel egy faék egyszerű mentést és visszaálltást lehet csinálni?

2020. júl. 1. 20:51
Hasznos számodra ez a válasz?
 5/43 anonim ***** válasza:

A #3-as valamit rohadtul túlkomplikál.


Simán a preorder bejárást ments le kiegészítve azzal, hogy van-e bal/jobb oldali érték. Nyilván ha a tárolandó érték nem vehet fel valamilyen értéket, pl 0-t vagy 255-őt, akkor ez jelentheti azt, hogy az adott oldali gyerek nem létezik. Ha nincs ilyen nem használt érték, akkor erre kell egy plusz 2 bit csúcsonként.

2020. júl. 1. 21:05
Hasznos számodra ez a válasz?
 6/43 A kérdező kommentje:

A fa valójában mint adatszerkezet jön szóba, a tartalma, felépítése esetenként változik, vagy legalábbis, változhat.


Nyilván az én hibám, de úgy vettem észre, hogy a legjobban a negyedik és az ötödik válaszadó értette meg, hogy mit szeretnék.


A 4. válaszoló írja a bitekkel való műveletvégzést, az nem gond, ami fontos, az a minél kisebb helyen való tárolhatóság.


Azt nem tudom, hogy ha eltárolom az első csúcs értékét, azt követően azt, hogy jobb, vagy bal, majd következik az egyik alábbi csúcs, majd ismét jobb, vagy bal, akkor ezt szekvenciálisan eltárolva, amit kapok, abból hogy lesz újra fa?

Szóval, nem vagyok képes magát a fa tartalmát byteok sorozataként vizualizálni.

2020. júl. 1. 22:08
 7/43 anonim ***** válasza:
Ezek szerint vagy nem nézted meg a linkemet vagy nem érted a láncolt listát, mint adatszerkezetet...
2020. júl. 1. 22:12
Hasznos számodra ez a válasz?
 8/43 A kérdező kommentje:
Hetes, de megnéztem a linkedet, a binfa lényegét is értem. Képes vagyok vele dolgozni, bejárni, keresést végezni, stb. vagy akár a tartalmát elmenteni, de csak jelentős redundanciával. Ezt a redundanciát szeretném csökkenteni a lehetséges minimumra.
2020. júl. 1. 22:17
 9/43 anonim ***** válasza:

Szöveges állományban akarod tárolni? Mert akkor én is azt javaslom, mint az 5-ös, preorder lista placeholderekkel.

Pl. ha 5 a root, nincs bal gyerek és 3 a jobb, akkor mondjuk "5,-,3"-ként tárolod.

2020. júl. 2. 07:03
Hasznos számodra ez a válasz?
 10/43 anonim ***** válasza:

#9: Ez működik bináris fájlban is úgy, ha van egy olyan érték amit használhatsz annak a jelzésére, hogy az adott érték nem létezik... mint fentebb írtam.


Ekkor ezek a byteok lesznek: 5,255,3


Visztont így csúcsok száma + (levelek száma *2) byte kell, ahol a levelek száma ideális esetben csúcsok száma +1.. tehát gyakorlatilag ez is 2*csúcsok száma byteot foglal, szóval ha ennyire számít, akkor a #4-es 10bit/csúcs megoldása jobb, bár nehézkesebb beolvasni.


Arra a kérdésre a válasz, hogy hogy olvasod be, pszeudókóddal:


treenode read_tree()

{

  gyoker = new treenode;

  gyoker.value = stream.read8;

  flag_left = stream.readbit;

  flag_right = stream.readbit;

  if (flag_left) gyoker.left = read_tree;

  if (flag_right) gyoker.right = read_tree;

  return gyoker;

}


Bár ez utóbbiban nem értem mi okoz nehézséget, pofonegyszerű kód attól eltekintve, hgoy biteket kell olvasni a streamből és így az adat byteok sem pont egész byteoknál lesznek mindig.

2020. júl. 2. 08:31
Hasznos számodra ez a válasz?
1 2 3 4 5

További kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!