Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > pl.comp.programming > #28594
| From | bartekltg <bartekltg@gmail.com> |
|---|---|
| Newsgroups | pl.comp.programming |
| Subject | Re: Jak poskładać rozsypane drzewko? |
| Date | 2016-05-17 19:03 +0200 |
| Organization | ATMAN - ATM S.A. |
| Message-ID | <nhfisc$382$1@node2.news.atman.pl> (permalink) |
| References | <nhf91a$pgp$1@node2.news.atman.pl> |
On 17.05.2016 16:15, Borneq wrote:
Uwaga językowa.
> CChainNode *elem = vecAllElems[j];
> CChainNode *parent = iter->second;
> CChainNode *parent = iter->second;
Nie używaj tak wskaźników.
Nie dość, że można sobie tym palca odstrzelić,
to jeszcze zmniejsza czytelność i _wydajność_!
W drugim i trzecim przypadku używasz parent tylko raz.
W ogole to nie ejst potrzebne.
> CChainNode *parent = iter->second;
> map[elem->strHashBlock] = elem;
> parent->Add(elem);
->
map[elem->strHashBlock] = elem;
iter->second->Add(elem);
Referencja... Lepiej, ale też nie jest jakimś szczegolnie dobrym
rozwiązaniem do wskazywania na obiekt typu vecAllElems[j].
Ja bym pisał vecAllElems[j]. Kompilator to sobie zoptymalizuje.
W ogolnym przypadku, jeśli jesteś pewien, że _nigdy_ w tym
fragmencie kodu nie zmodyfikujesz kontenera, dla większenia
kompaktowośći tekstu użyj (prosząc w komentarzu o wybaczenie) referencji.
Ale nie w tym przypadku:
> for (int j = 1; j < vecAllElems.size(); j++)
> {
> CChainNode *elem = vecAllElems[j];
Aż się prosi o
for (auto itelem = begin(vecAllElems); itelem!=end(vecAllElems); itelem)
{
Czytelniej, mniej zmiennych dla zmylenia porzeciwnika...
Albo wręcz (tylko nieśredniowieczne kompilatory):
for(auto&& elem: vecAllElems)
{
...
}
tu "elem" jest referencją do kolejnych elementów kontenera.
Problem polega na tym, zę liniowy problem rozwiązujesz kwadratowo!
(find dla każdego elementu).
>
> Jak zrobić? może tworzyć wiele (tysięcy nawet) osobnych niepowiązanych
> drzewek, a potem łączyć je w jedno?
> Problemem jest to, że często najpierw w pliku występuje child a potem
> parent.
Jajpierw wczytaj wszystkie (tak, abyś miał powiązanie klucz->obiekt).
Doraczałbym raczej <klucz, indeks> niż <klucz, wskaźnik>.
Przelatujesz vecAllElems, patrząc na każdym miejscu j na wartość
klucza K. Tworzysz sobie unordered_map klucz -> indeks w vecAllElems,
(od biedy wskaźnik, ale to odstrzli palucha) z elementami j->k
Przelatujesz drugi raz, tym razem patrząc na parent każdego obiekty.
Ale masz słownik, więc wiesz, pod króym indeksem jest parent.
Całość jest linioiowa, dwa przebiegi.
pzdr
bartekltg
Back to pl.comp.programming | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Jak poskładać rozsypane drzewko? Borneq <borneq@antyspam.hidden.pl> - 2016-05-17 16:15 +0200
Re: Jak poskładać rozsypane drzewko? Borneq <borneq@antyspam.hidden.pl> - 2016-05-17 17:54 +0200
Re: Jak poskładać rozsypane drzewko? bartekltg <bartekltg@gmail.com> - 2016-05-17 19:03 +0200
Re: Jak poskładać rozsypane drzewko? Borneq <borneq@antyspam.hidden.pl> - 2016-05-17 19:44 +0200
Re: Jak poskładać rozsypane drzewko? Borneq <borneq@antyspam.hidden.pl> - 2016-05-17 20:06 +0200
Re: Jak poskładać rozsypane drzewko? bartekltg <bartekltg@gmail.com> - 2016-05-17 20:14 +0200
Re: Jak poskładać rozsypane drzewko? "M.M." <mmarszik@gmail.com> - 2016-05-17 13:32 -0700
Re: Jak poskładać rozsypane drzewko? bartekltg <bartekltg@gmail.com> - 2016-05-17 22:43 +0200
Re: Jak poskładać rozsypane drzewko? bartekltg <bartekltg@gmail.com> - 2016-05-17 22:49 +0200
Re: Jak poskładać rozsypane drzewko? "M.M." <mmarszik@gmail.com> - 2016-05-18 04:59 -0700
Re: Jak poskładać rozsypane drzewko? bartekltg <bartekltg@gmail.com> - 2016-05-18 14:27 +0200
csiph-web