Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.programming > #28594

Re: Jak poskładać rozsypane drzewko?

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>

Show all headers | View raw


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


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