[ Príspevkov: 5 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
binarny strom

Registrovaný: 09.03.07
Prihlásený: 28.07.09
Príspevky: 39
Témy: 7 | 7
Bydlisko: Trnava
NapísalOffline : 24.02.2009 11:59 | binarny strom

zdravim

mam taky problemik, mam binarny strom v c++.
udaje tam vkladam tak, ze v lavom podstrome
mam vzdy mensie hodnoty ako v rodicovy a v
pravom podstrome vacsie.

Kód:
    5
  /  \
 3    6
 /\   /\
 1 4 2 8



chapeme sa.

teraz ide o to, ze to mozem cez inorder
vypisat podla velkosti.

v uzle ale uchovavam aj hodnotu, kolko tych
cisel je (napr. sestku som nacital 5 krat,
stvork tri razy atd).

teraz chcem vypisat ten strom od najvacieho
po najmensi pocet tych cisiel.

ale ako na to???

nemozem to zoradovat tak ako to nacitavam, pretoze
este neviem,ake cisla budem mat. (a uz vobec nie kolko)

napadlo ma, ze si zistim pocet uzlov, alokujem take pole,
dvoj rozmerne, kde prva zlozka bude cislo a druha ich pocet.

a toto zoradim podla toho poctu.

ale to je asi nosenie dreva do lesa. potom ten strom akosi straca zmysel.

dik

//edit
este ma napadlo, ze by som mohol prebehnut ten strom inorder, a vzdy precital pocet tych veci v uzle. a nasledne by som paralelne robil druhy strom s tym, ze by som usporaduval podla poctu veci v uzloch.

to je ok az na to, ze co sa stane, ked niektorych cisiel bude take iste mnozstvo ^^

//nabuduce pouzi edit. suchy


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 30.04.08
Prihlásený: 15.05.15
Príspevky: 884
Témy: 3 | 3
NapísalOffline : 24.02.2009 14:27 | binarny strom

Co ja viem, podla mna si si vybral zlu datovu strukturu, binarny strom sa na to moc nehodi. Netvrdim, ze by sa to nedalo, ale je mozne, ze by si mal vacsiu casovu zlozitost ako trebars pri pouziti pola. :rolleyes:


_________________
Empty your memory, with a free()… like a pointer!
If you cast a pointer to an integer,
it becomes the integer, if you cast a pointer to a struct, it becomes the struct…
The pointer can crash…, and can overflow…
Be a pointer my friend…
Offline

Skúsený užívateľ
Skúsený užívateľ
binarny strom

Registrovaný: 30.05.06
Prihlásený: 08.10.14
Príspevky: 1756
Témy: 35 | 35
Bydlisko: BA - WESTSIDE
NapísalOffline : 24.02.2009 20:16 | binarny strom

Povedal by som, že to záleží od toho, na čo ďalšie ešte ten strom používaš. Ak ho potrebuješ ešte na nejaké iné algoritmy, tak si pridaj pole, alebo spájaný zoznam a tie počty si pamätaj v tom. A ak ho nepotrebuješ, tak ho nahraď len tým poľom/zoznamom.

Výpis binárneho vyhľadávacieho stromu podľa satelitných dát a nie kľúčov je O(n^2) (v najhoršom prípade n-krát navštívime všetkých n vrcholov), efektívne usporiadanie a následný výpis poľa je O(n lg n), čo je teoreticky rýchlejšie, ale v praxi záleží na množstve a povahe tvojich dát a konkrétnych implementáciách algoritmov.

Alebo to môžeš ešte otočiť, udržiavať si binárnu haldu kde kľúčmi budú počty, udržiavať si pointer na nejaký zoznam a tam si pamätať satelitné dáta... Riešení je viac, ale nenapísal si, čo ďalej chceš robiť atď, takže ťažko sa háda "to najlepšie".


_________________
A. S. Tanenbaum píše:
The terms LF, MF, and HF refer to low, medium, and high frequency, respectively. Clearly, when the names were assigned, nobody expected to go above 10 MHz, so the higher bands were later named the Very, Ultra, Super, Extremely, and Tremendously High Frequency bands. Beyond that there are no names, but Incredibly, Astonishingly, and Prodigiously high frequency (IHF, AHF, and PHF) would sound nice.
Offline

Užívateľ
Užívateľ
binarny strom

Registrovaný: 09.03.07
Prihlásený: 28.07.09
Príspevky: 39
Témy: 7 | 7
Bydlisko: Trnava
Napísal autor témyOffline : 24.02.2009 22:32 | binarny strom

mam slovensky text zbaveny diakritiky a medzier. pismena su vsetky velke. ide o to najst frekvenciu pismen, dve pismena spolu, tri pismena spolu.

spravil som ten binarny strom, nezalezi na pocte pismen, ktore nacitam, cize j to univerzalne. v strome udrziavam vsetky vyskyty tych pismen ci skupin. cize napr. mam v koreny stromu "ra" a v lavom dietati "ab" a v pravom "za". a tak dalej. teraz ide o to, zistit pocetnost tej ktorej skupiny znakov. tj. pocet konkretnych dvojic deleno vsetkych dvojic. v node si udrziavam informaciu o pocte vyskytov jednotlivych dvojic (napr. ak nacitam druhy krat "za", tak nespravim dalsi nod, len premennu "count" v triede node zvysim o jedna). takto prebehnem cely text. potom zratam vsetky dvojice (inorder a pripocitavam "count") a takto prebehnem strom a pocty "count" vydelim poctom dvojic. a zistim tu relativnu pocetnost. ide ale o to, ze sice to mam v inorder podla abecedy, ale nemam to od najmensieho po najvacsie podla relativnosti vyskytu (cislo od 0-1).

ono napadlo ma, ze cele to je s tym stromom asi zbytocne. ale zasa, je to rychlejsie zatriedit. kebyze mam zoznam spajany, tak by som musel prebehnut vzdy vsetky prvky toho zoznamu a spytat sa, ci sa tam uz taka kombinacia znakov nenachadza, hmmm, alebo ani nemusel, stacilo by to to pole "delit stale dvoma" a pytal by som sa, ci to je vacsie alebo mensie. cize ta ista zlozitost ako pri strome.

a potom by som to podelil, a to by som zoradil podla tej relativnej pocetnosti.

fuuu no to je na dlho pisat nie este nakodit :)

no a teraz ma este napadlo :D ved ja nepotrebujem v tom spajanom zozname riesit, aby to bolo zoradnene podla abecedy. ved ja to chcem len podla toho vyskytu, takze mi je suma-fuk, ci to mam zoradene. zoradim to len vtedy, ked to idem vypisat. cize si jedno zoradenie usetrim. (a nemusim riesit, aby som vkladal prvky zoznamu od najmensieho po najvacsi (lexikograficky)


Offline

Užívateľ
Užívateľ
binarny strom

Registrovaný: 09.03.07
Prihlásený: 28.07.09
Príspevky: 39
Témy: 7 | 7
Bydlisko: Trnava
Napísal autor témyOffline : 25.02.2009 21:18 | binarny strom

spravil som to do spajaneho zoznamu

hlavna funkcia na pridavanie do zoznamu vyzera nasledovne

Kód:
void addItemToList(Node *&start_ptr, string _name) {

   Node *temp, *temp2, *temp3;

   temp = new Node(_name);
   bool vlozene = false;

   if (start_ptr == NULL) {  //ak je list prazdny, zvysime o jedna a priradime vkladane "meno" do prvej polozky
      ++(temp->count);
      start_ptr = temp;
   }
   else { //ak nie je list prazdny
      temp2 = start_ptr;
      do { //prebehni zoznam, ak najdes uzol, ktoreho meno sa rovna s vkladanym, zvys o jedna a skonci
         if (temp2->name == temp->name) {
            ++(temp2->count);
            vlozene = true; //nastav premennu "vlozene" na true
            break;
         }
         temp3 = temp2;
         temp2 = temp2->next;
      }
      while(temp2 != NULL);

      if (!vlozene) { //ak nie je vlozene, (sme na konci zoznamu), tak na konci vloz
         temp3->next = temp;
         temp3->next->count = 1;
      }
   }
}


este treba ale tento zoznam zoradit podla tej frekvencie vyskytu
frekvencia sa pocita ako som napisal v prispevku hore.

neviete niekto ako zoradit zlinkovany zoznam ? :)


 [ Príspevkov: 5 ] 


binarny strom



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

Strom z cesty

v PHP, ASP

1

351

05.02.2014 17:49

killer

V tomto fóre nie sú ďalšie neprečítané témy.

Binarniy vyhladavaci strom [C]

v Assembler, C, C++, Pascal, Java

1

561

28.10.2014 18:18

BX

V tomto fóre nie sú ďalšie neprečítané témy.

Slovnik pre lexikograficky strom.

v Assembler, C, C++, Pascal, Java

0

906

06.04.2008 10:25

danciwo

V tomto fóre nie sú ďalšie neprečítané témy.

Čo je to za strom? Na konároch má akoby klince...

v Voľný čas a hobby

1

510

06.06.2023 5:44

Max64



© 2005 - 2024 PCforum, edited by JanoF