Zistovanie poctu vyskytov v retazci

Programovacie jazyky, rady, poradňa...
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Zistovanie poctu vyskytov v retazci

Príspevok od používateľa metthal »

Zdravim,

nerad to sem pisem lebo potom vyzeram ako naozaj nejaky amater, aj ten nazov je amatersky, ale tak neda mi to sa nespytat.

Ide o to ze mam textovy subor kde na kazdom riadku je nejake cislo. Cisla su oddelene LF-kom a je ich tam dost dost vela. Proste nejedna sa o ziadne 10 prvkove zistovania poctu vyskytov.

No ale co ja vlastne teda potrebujem. Ako z nazvu temy mozte vycitat, ja by som potreboval zistit, ze kolkokrat sa tam dane cislo nachadza, pretoze to potrebujem pre buduce spracovanie a ked toto nespravim, zvysim tak dost casovu narocnost. Robim to v C++ a ukladam to do

Kód: Vybrať všetko

std::vector<std::pair<int,int>>
Najprv som pouzival list, ale koli neskorsiemu spracovaniu som zvolil vector. Prva hodnota z paru je dane cislo a druha hodnota je pocet vyskytov. Cize ja len potrebujem nejaky cyklus, ktorym to budem nacitavat a nasledne porovnavat ci uz tam take hodnota je. Ak je, tak len u nej zvysit druhy clen z paru a ak nie je tak push_back-nut novu hodnotu.

Tu vsak nastava problem. Ako som spomenul. Prvkov je strasne strasne vela, cize je prakticky nemyslitelne, aby som teraz robil vzdy pri kazdom novonacitanom prvku iteracie celym vectorom a porovnaval. Najprv som to skusil, po tom co po minute to vsak este nedokoncil, vykaslal som sa na to a rozhodol som sa sem napisat.

Neziadam vas o teraz aby ste mi napisali cyklus, ale skor aby ste ma nakopli ako inak by sa to dalo riesit a ake ine moznosti by som mohol vyuzit.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Zistovanie poctu vyskytov v retazci

Príspevok od používateľa audiotrack »

tak bez nejakého väčšieho rozmýšlania mi napadá použiť hashovanie. Spraviť si viacero vektorov, do každého ukladať čísla ktoré majú modulo nejaké prvočíslo rovnaké. Prvočíslo musíš vhodne zvoliť podľa charakteru tých čísel, aby si dostal čo najlepšiu distribúciu. Potom si vyrátaš modulo čísla, a vieš v ktorom vektore hľadať. Ten už prehľadaš sekvenčne. Namiesto sekvenčného prehľadávania celého vektoru všetkých čísel teda budeš prehľadávať podstatne menšiu časť, povedzme jednu desatinu (ak si prvočíslo zvolíš za 11).

ďalšia možnosť je uchovávať si použité čísla v rozsahoch. BOla by to mierne zložitejšia štruktúra, a nové pridanie čísla by vyžadovalo zložitejšie operácie, ale pre zapamätanie si čísel od 25 do 375 ti stačí ukladať tieto dve krajné hodnoty a nemusíš ukladať všetky medzi nimi.

a posledná najprimitívnejšia a najmenej efektívna možnosť je ukladať si tie čísla zoradené, vyhľadávanie v takýchto zoznamoch je potom veľmi rýchle, pomocou rôznych vyhľadávacích algoritmov (napr. binárne hladanie)
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: Zistovanie poctu vyskytov v retazci

Príspevok od používateľa metthal »

No ono ta prva verzia by aj bola fajn, lenze ide o to ze ja to potom prezeniem cez jednu funkciu, ktora mi vrati zase ine cislo a nasledne tieto cisla usporiadavam. Cize ak mam viac vektorov, musel by som potom este pouzit dalsi vektor a to uz si prakticky mozem ratat, ze som zdvojnasobil vyuzitu pamat potrebnu pre uskladnenie vo vektoroch.

Druha moznost to iste, viac vektorov -> vysledne budem potrebovat dalsi vektor

Tretia moznost v tomto pripade prichadza asi najviac do uvahy, len budem musiet pouvazovat ako na nu, kedze nepride mi moc efektivne zoradovat, ked aj tak to potom vysledne prezeniem cez funkciu, ktora mi vrati ine cisla a budem tie zase zoradovat.

Ked si napisal tieto 3, asi uz potom neexistuje nic mudrejsie a schopnejsie, ja skusim do toho programu nejak implementovat tu posledny moznost. Uvidime ako na tom bude pamatova narocnost.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: Zistovanie poctu vyskytov v retazci

Príspevok od používateľa audiotrack »

určite existuje niečo múdrejšie, mňa neber ako programovacieho guru :) Toto som hodil prvé veci čo mi prešli hlavou. A keby som vedel čo presne potrebuješ (aká je tá druhá funkcia čo ich upravuje) tak by sa to dalo možno ešte lepšie (možno ju vôbec nepotrebuješ ale vieš si to rátať priebežne alebo podobná finta).
metthal
Guru wannabe
Guru wannabe
Používateľov profilový obrázok
Príspevky: 2475
Registrovaný: 26 jan 2006, 18:32
Bydlisko: Nitra / Brno

Re: Zistovanie poctu vyskytov v retazci

Príspevok od používateľa metthal »

Nie, praveze ono to potrebuje prebehnut tou funkciou :) Keby mozem tak si to ratam aj sam ale tu funkciu citam z DLL kniznice a nedokazem sa k nej dostat. A kedze ta DLL kniznica patri priamo k tomu cviceniu a vracia to vystupy podla neviem akych vypoctov tak netusim co ta funkcia robi.
Napísať odpoveď