eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJak poskładać rozsypane drzewko? › Re: Jak poskładać rozsypane drzewko?
  • Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.
    atman.pl!.POSTED!not-for-mail
    From: bartekltg <b...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Re: Jak poskładać rozsypane drzewko?
    Date: Tue, 17 May 2016 19:03:07 +0200
    Organization: ATMAN - ATM S.A.
    Lines: 92
    Message-ID: <nhfisc$382$1@node2.news.atman.pl>
    References: <nhf91a$pgp$1@node2.news.atman.pl>
    NNTP-Posting-Host: 89-73-81-145.dynamic.chello.pl
    Mime-Version: 1.0
    Content-Type: text/plain; charset=utf-8; format=flowed
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1463504588 3330 89.73.81.145 (17 May 2016 17:03:08 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Tue, 17 May 2016 17:03:08 +0000 (UTC)
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
    Thunderbird/38.6.0
    In-Reply-To: <nhf91a$pgp$1@node2.news.atman.pl>
    Xref: news-archive.icm.edu.pl pl.comp.programming:209411
    [ ukryj nagłówki ]

    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









Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: