Knihovna pro stromy v C

Jan Kasprzak kas na fi.muni.cz
Úterý Září 11 13:58:43 CEST 2007


	Zdravim,

Kratka verze dotazu: vite o nejake dobre knihovne pro implementaci stromu v C?

Delsi verze:

Mam na vstupu nejaku cisla (24-bitova nebo mozna 32-bitova, rikejme jim klice),
potrebuju ty klice nacist a vratit ke kazdemu z nich pocet vyskytu ve vstupu,
nejlepe setrideny podle toho klice (ale asi je to jedno). Jednotlive
vstupy maji rekneme 100 - 1_000_000 polozek, pricemz jeste by se dalo vyuzit,
ze ten vstup obsahuje klice v usecich radove stovek klicu, kde klice
v ramci toho useku jsou vzestupne setridene.

No a ted je otazka, jak toto v C naprogramovat. Pro 24 bitu v zasade
staci mit pole delky 2^24, na zacatku naplnit nulami, pak pricitat
jednicky podle vstupu a na konci jednim pruchodem vypsat ty nenulove.
Bohuzel i tohle mi v profileru vylezlo nahoru jako nejvic narocne,
takze se to snazim zoptimalizovat (a zaroven umoznit i 32-bitove klice,
kde pole velikosti 2^32 * sizeof(int) uz se mi do pameti nevejde).

Podstatne taky muze byt, ze z datove struktury se nikdy nebudou rusit
jednotlive klice - vzdy az po vypoctu cela struktura.

Dalsi podstatne muze byt vyhledavani - tady vzdycky pujde o to, ze kdyz
uz neco neuspesne vyhledam, tak vzdycky na to misto chci tento nenalezeny
klic vlozit jako novy.

Podle me je hashovaci tabulka nepouzitelna - nevyuziva lokality dat
a ruznych klicu je fakt hodne. Asi spis bude treba pouzit nejake
stromy. Ale ted jake? Jedna moznost je red-black tree, druha asi
B-stromy s velikosti uzlu optimalizovanou na velikost cache line (64 bajtu)?

A posledni problem je - kdyz uz stromy, tak jakou implementaci? Libilo by se
mi neco co by umelo mit sva data zapouzdrena do uzivatelskych dat
(neco jako seznamy v kernelu Linuxu - struct list_head a container_of())
abych nemusel na kazdy uzel zvlast malloc()ovat 24 bitu na klic a nejakych
16 nebo 32 bitu na pocet vyskytu, a vedle by se mi jeste malloc()ovala
data pro rezii stromu.

	Co byste doporucili (krome: zkus si sam naimplementovat vice moznosti
a zprofiluj si to :-) ?

-Y.

-- 
| Jan "Yenya" Kasprzak  <kas at {fi.muni.cz - work | yenya.net - private}> |
| GPG: ID 1024/D3498839      Fingerprint 0D99A7FB206605D7 8B35FCDE05B18A5E |
| http://www.fi.muni.cz/~kas/    Journal: http://www.fi.muni.cz/~kas/blog/ |
**         Those who fail to understand communication protocols,          **
**         are doomed to repeat them over port 80.    -- from /.          **



Další informace o konferenci Linux