» »

[c++][alg] pari, mape, paketi

[c++][alg] pari, mape, paketi

Vesoljc ::

da zadovoljimo nekatere bolj napredne uporabnike (a ne yeti? :p) iscem resitev za naslednji problem:
- imamo pare id, string
- ti pari so organizirani v pakete, recimo en paket vsebuje 100 takih parov
- pari se dinamicno ne bodo spreminjali, zato je za iskanje najbolj primeren kak map
- paketi se bodo dinamicno spreminjali, recimo enega umaknemo, drugega dodamo
- uporabnik, ki potrebuje string, ve samo za id, ne ve pa v katerem paketu se par dejansko nahaja, zato potrebujemo eno kombinirano mapo, ki vsebuje vse pare
- problem nastopi, ko moramo paket zbrisati, saj par potrebuje dodaten tag, ki mu pove v katerem paketu se nahaja, tako se pac moramo sprehoditi cez celotno mapo, zato da pare, ki niso vec potrebni, umaknemo

- ena resitev je, da vsak paket ima svoj map, vendar moras v najslabsem primeru, iti cez vse pakete/mape, to pa je po zacetnih izracunih, pocasneje od kombinirane mape z vsemi pari

alternative?
Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

se to, stevilo aktivnih (nalozenih) paketov bo precej nizko (10), medtem ko stevilo parov na paket bo v rangu nekaj tisoc
Abnormal behavior of abnormal brain makes me normal...

Genetic ::

Za vsak paket imej seznam id-jev od parov id,string, ki so v tem paketu. Pri odstranitvi paketa iz skupne mape odstranis vse pare, ki imajo id v seznamu paketa:
foreach (id in paket.idList) skupnaMapa.Remove(id);

- ne rabis se sprehoditi po celi mapi (O(n)), ampak samo m-krat odstranis par iz mape (O = m*O(1), kjer je m velikost seznama id-jev paketa)

Vesoljc ::

se pravi:
struct Packet
{
  id               PacketName;
  map<id, string>  mData;
}

struct MainData
{
  map<id, Packet>  mPacket;
  map<id, string>  mCombined;
}

void removepacket(id)
{
   packet = mPacket[id];
   for each packet.mData
     mCombined.remove( packet.mData[idx].id )
}


no itaq nisem mislil da bi se sprehajal rocno cez mapo O(n) pa delal compare po kljucu , ker to pac nima smisla... :)
Abnormal behavior of abnormal brain makes me normal...

Genetic ::

Se ena opcija: mapo parov id,string imej v vsakem paketu, zraven pa se imej eno mapo id,paket_id:
- brisanje vseh parov v paketu je enostavno - brises paket;
- dostop do stringa z id: preko mape id,paket_id dobis v katerem paketu se dolocen par id,string nahaja, potem pa iz tega paketa preberes ustrezen string.

Thomas ::

Jaz bi pakete ukinil, oziroma bi imel en samo paket.

Potem pa takole strukturo:

id1,address1,length1;id2,address2,length2;id3,address3,length3;id4,address4,length4;...string1;string2;string3;string4;...

S tem bi bilo potem dosti lažje delat. Ane?
Man muss immer generalisieren - Carl Jacobi

Vesoljc ::

@thomas
ne vem ce :)

sicer je header + data precej uporabna zadeva, ampak tuki res nekako ne vidim, zakaj bi bil to boljsi nacin. pakete rabim, saj nocem imeti vseh nalozenih naenkrat - potreba po modularnosti pac.
Abnormal behavior of abnormal brain makes me normal...

Gundolf ::

Pa žrtvuj par bitkov IDja para da z njimi označiš ID paketka.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Siol IPV6 in Mikrotik

Oddelek: Omrežja in internet
215145 (4689) Lonsarg
»

Siol TV STB - software

Oddelek: Omrežja in internet
4510304 (3076) Klemen Košir
»

[C#] izdelava tabele

Oddelek: Programiranje
71929 (1755) majoneza
»

Samba porti

Oddelek: Omrežja in internet
341645 (1341) hruske
»

Coding Style

Oddelek: Programiranje
433306 (2498) 64202

Več podobnih tem