eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingCiekawy problem iteracyjnego zwalniania głębokiego drzewaRe: Ciekawy problem iteracyjnego zwalniania głębokiego drzewa
  • X-Received: by 10.31.54.206 with SMTP id d197mr64vka.26.1502844738242; Tue, 15 Aug
    2017 17:52:18 -0700 (PDT)
    X-Received: by 10.31.54.206 with SMTP id d197mr64vka.26.1502844738242; Tue, 15 Aug
    2017 17:52:18 -0700 (PDT)
    Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit
    0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.
    iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!w51no33
    45qtc.0!news-out.google.com!i9ni15qte.0!nntp.google.com!w51no3342qtc.0!postnews
    .google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
    Newsgroups: pl.comp.programming
    Date: Tue, 15 Aug 2017 17:52:17 -0700 (PDT)
    In-Reply-To: <oms9l6$db4$1@node2.news.atman.pl>
    Complaints-To: g...@g...com
    Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=89.70.120.200;
    posting-account=CvUQzQoAAABvVQmR58QmR6N4Cev1qhAS
    NNTP-Posting-Host: 89.70.120.200
    References: <oms9l6$db4$1@node2.news.atman.pl>
    User-Agent: G2/1.0
    MIME-Version: 1.0
    Message-ID: <f...@g...com>
    Subject: Re: Ciekawy problem iteracyjnego zwalniania głębokiego drzewa
    From: bartekltg <b...@g...com>
    Injection-Date: Wed, 16 Aug 2017 00:52:18 +0000
    Content-Type: text/plain; charset="UTF-8"
    Content-Transfer-Encoding: quoted-printable
    Lines: 143
    Xref: news-archive.icm.edu.pl pl.comp.programming:211110
    [ ukryj nagłówki ]

    On Monday, August 14, 2017 at 3:47:20 PM UTC+2, Borneq wrote:
    > Nie patrząc już na shared_ptr i na listy,grafy cykliczne, mamy drzewko.
    > Zwalniamy obiektowo tak że zwalniamy korzeń, wołany jest destructor dla
    > korzenia, potem jego dzieci itd.
    > Ale co gdy drzewo zdegeneruje się niemal do listy, tak że będziemy
    > musieli rekurencyjnie zwalniać listę głębokości 100 tys i więcej?
    > Samą listę można zwalniać iteracyjnie od korzenia lub końca. Ale co gdy
    > zamiast listy mamy zdegenerowane głębokie drzewo, od którego co ileś
    > odchodzą krótkie rozgałęzienia np. długości 20. Ewentualnie jest dwie
    > czy trzy gałęzi długie rzędu 100 tys.
    > Oto ciekawy problem.


    Facet tu mówi o tym:
    https://www.youtube.com/watch?v=JfmTagWcqoE
    Ok 16 minuty zaczyna się właściwa cześć, wcześniej konstruuje
    drzewo na mądrych wskaźnikach.

    Dośc pobieżnie, i jestem niemal pewien, ze kod, który pokazuje
    jest n^2 a nie nlogn ;-) Jeśli mamy wskaźnik na parent to łatwo
    naprawić.

    Pomysł, by zwalniać w pętli jeśli jest jeden potomek,
    rekurencyjnie, gdy więcej, nie sprawdzi się:
    /\
    /\
    /\
    /\
    /\
    /\
    /\
    /\

    To drzewo też ma głębokość O(n), a zwalniasz je rekurencyjnie.
    (do naprawienia, jeśli masz głęgokość poddrzewa, ale to bardzo
    szczegolny przypadek).

    @pomysł M.M. by przerzucić wierzchołki do innego kontenera i tam je
    skasować (pomysł wspominany i w filmiku) nie wymaga tak dużego stosu.

    Przesuń usuwany wierzchołek do kontenera.
    Teraz całe drzewo tam siedzi, zaczepione pod ten element;-)
    Niech indeks pokazuje na ten (jedyny na razie) element. int i=0; :)

    Teraz w pętli:
    Wszystkie dzieci wierzchołka spod 'i' przerzuć do kontenera,
    i++
    Pętle konczysz, gdy i =size.

    Działająca przykąłdowa implementacja (wystarczy c++11, ale make_unique
    aż się  prosi gdziniegdzie:) poniżej.

    pzdr
    bartekltg


    #include <iostream>
    #include <vector>
    #include <memory>
    #include <algorithm>
    #include <iterator>
    using namespace std;

    struct Node {
    vector<unique_ptr<Node>> children;
    int data;
    Node(int x):data(x){}
    ~Node() { cout << "destruktor "<<data<<endl;}

    };
    class Tree {
    unique_ptr<Node> root;
    public:

    ~Tree(){
    vector <unique_ptr<Node>> vec;
    vec.push_back(move(root));
    unsigned int i=0;

    while (i<vec.size()) {
    move(vec[i]->children.begin(),vec[i]->children.end()
    , std::back_inserter(vec) );
    cout<<"przenosiny dzieci "<<i<<": "<<vec[i]->data<<endl;
    i++;
    }
    }
    void push(int x){
    if (root.get()==nullptr){
    root = unique_ptr<Node>(new Node(x));
    }else{
    Node *n=root.get();
    while( n->children.size()>0 )
    n = (n->children[0].get());
    n->children.push_back(unique_ptr<Node>(new Node(x)));
    }

    }

    /*...*/
    };



    int main(int argc, char *argv[])
    {
    int c;

    {
    Tree tree;
    for (int k=1000;k<1004;k++)
    tree.push(k);
    }

    cout<<"bla"<<endl;

    return 0;
    }



    OUT:
    przenosiny dzieci 0: 1000
    przenosiny dzieci 1: 1001
    przenosiny dzieci 2: 1002
    przenosiny dzieci 3: 1003
    destruktor 1000
    destruktor 1001
    destruktor 1002
    destruktor 1003

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: