eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJaki algorytm do komponentu drzewka?
Ilość wypowiedzi w tym wątku: 9

  • 1. Data: 2015-03-21 18:36:10
    Temat: Jaki algorytm do komponentu drzewka?
    Od: Borneq <b...@a...hidden.pl>

    Zamierzam napisać od podstaw prosty komponent drzewka, język i
    środowisko nie gra roli.
    Z punktu użytkownika będzie to struktura, gdzie mamy listę (a raczej
    wektor, bo nie będzie to lista linkowana a rozszerzana tablica) węzłów
    pierwszego poziomu. Każdy z nich (jeśli ma dzieci) będzie miał wektor
    swoich węzłów i tak dalej.
    Każdy z tych węzłów może mieć właściwość expanded lub nie, więc węzeł
    który jest expanded lub nie, może mieć dzieci z których jedne są
    expanded lub nie.
    Jak mam jedną listę, która przechodzi przez wszystkie te listy, to
    wyświetlanie tego już jest łatwe.
    A co mi chodzi - mam drzewko:
    a
    b
    d
    e
    c
    f
    g
    wcięcia są ważne
    Fizycznie elementy są w kilku listach:
    root-> a, g
    a->b,c
    b->d,e
    c->f
    Podczas gdy mamy jedną listę do wyświetlenia:
    a b d e c f g ("pozycją wizualną" nazwę a=0,b=1,d=2 etc)

    Są dwa problemy:
    1. znaleźć pozycję wizualną dla węzła
    2. znaleźć węzeł dla zadanej pozycji wizualnej
    Punkt 2 jest łatwy, jeśli istnieje lista węzłów jak a b d e c f g, przez
    chwilę myślałem że to rozwiązanie.
    Dla operacji expand/collapse musimy przemieścić blok i wstawić lub
    usunąć, co jest dopuszczalne.
    Punkt 1 nadal trudny.
    Poza tyym, co gorsze - jeśli dodajemy węzeł, musimy zlokalizować go
    przez punkt 1, a poza tym dodanie jednego wymaga rozsunięcia, więc gdy
    dodamy wiele, mamy Move wiele razy co jest zbyt wolne.

    Drugie rozwiązanie (kiedyś go użyłem dla drzewka, ale było to
    rozwiązanie bardzo skomplikowane, może da się prościej):
    Węzeł (czy lista wezłów - nie ma tu wielkiej różnicy) ma pole
    VisibleCount oznaczające wielkość całej rozwiniętej częściowo podgałęzi.
    Tutaj dodawanie tak nie spowalnia, bo trzeba updatować jedynie
    VisibleCount parenta, parenta->parenta, aż do korzenia.
    Ale punkty 1 i 2 pozostają trudne.

    Czy jest jakiś wydajny algorytm na to?


  • 2. Data: 2015-03-22 07:55:47
    Temat: Re: Jaki algorytm do komponentu drzewka?
    Od: Borneq <b...@a...hidden.pl>

    W dniu 2015-03-21 o 18:36, Borneq pisze:
    > Zamierzam napisać od podstaw prosty komponent drzewka, język i
    > środowisko nie gra roli.

    Jak to jest w bibliotekach Javy czy C# gdzie mamy zastosowanie wzorca
    Model-View-Controller (MVC) ?


  • 3. Data: 2015-03-22 09:29:00
    Temat: Re: Jaki algorytm do komponentu drzewka?
    Od: Dariusz Jakubowski <c...@g...com>

    On 2015-03-22 06:55:47 +0000, Borneq said:

    > W dniu 2015-03-21 o 18:36, Borneq pisze:
    >> Zamierzam napisać od podstaw prosty komponent drzewka, język i
    >> środowisko nie gra roli.
    >
    > Jak to jest w bibliotekach Javy czy C# gdzie mamy zastosowanie wzorca
    > Model-View-Controller (MVC) ?

    Mogłbym Ci pomóc (ale nie napisać za Ciebie pracę zaliczeniową w
    całości) napisać taki algorytm w JS z reprezentacją wizualną w DOM.
    Chcesz?


  • 4. Data: 2015-03-22 09:39:04
    Temat: Re: Jaki algorytm do komponentu drzewka?
    Od: Borneq <b...@a...hidden.pl>

    W dniu 2015-03-22 o 09:29, Dariusz Jakubowski pisze:
    > Mogłbym Ci pomóc (ale nie napisać za Ciebie pracę zaliczeniową w
    > całości) napisać taki algorytm w JS z reprezentacją wizualną w DOM. Chcesz?

    Dzięki za zainteresowanie.
    Nie pytam się o gotowca, język też nie jest ważny. Tylko jestem ciekawy
    algorytmu pomiędzy Modelem a Widokiem, jakich struktur, pól warto użyć.
    Bo np. odrzucam listę wizualnych z powodu tego , że trzeba ją updatować
    przy dodawaniu elementów a tych może być 100 tysięcy.
    Czy trzymanie VisibleCount jest jedynym dobrym rozwiązaniem? Kiedyś
    pisałem właśnie komponent drzewka oparty o to, ale wyszedł bardzo
    skomplikowany. Teraz chciałem napisać prosty, elegancki, z mniejszą
    ilością kodu a co najważniejsze, łatwiejszy do zrozumienia.

    Pozdrawiam



  • 5. Data: 2015-03-22 10:05:38
    Temat: Re: Jaki algorytm do komponentu drzewka?
    Od: Dariusz Jakubowski <c...@g...com>

    On 2015-03-22 08:39:04 +0000, Borneq said:

    > W dniu 2015-03-22 o 09:29, Dariusz Jakubowski pisze:
    >> Mogłbym Ci pomóc (ale nie napisać za Ciebie pracę zaliczeniową w
    >> całości) napisać taki algorytm w JS z reprezentacją wizualną w DOM. Chcesz?
    >
    > Dzięki za zainteresowanie.
    > Nie pytam się o gotowca, język też nie jest ważny. Tylko jestem ciekawy
    > algorytmu pomiędzy Modelem a Widokiem, jakich struktur, pól warto użyć.
    > Bo np. odrzucam listę wizualnych z powodu tego , że trzeba ją updatować
    > przy dodawaniu elementów a tych może być 100 tysięcy.
    > Czy trzymanie VisibleCount jest jedynym dobrym rozwiązaniem? Kiedyś
    > pisałem właśnie komponent drzewka oparty o to, ale wyszedł bardzo
    > skomplikowany. Teraz chciałem napisać prosty, elegancki, z mniejszą
    > ilością kodu a co najważniejsze, łatwiejszy do zrozumienia.
    >
    > Pozdrawiam

    Chyba rozumiem. Model powinien wyglądać tak:
    Item {expanded, Bool, hasMany: Item as children, belongsTo: Item as parent}
    Rekordy są wszystkie w jednej tablicy na tym samym poziomie i mają
    swoje pole id (to konieczne). Ręcznie tworzysz pierwszy rekord o id 0
    i nazywasz go Root albo / (albo w ładniejszej wersji wyszukujesz
    wszystkie które nie mają parent, wtedy możesz mieć kilka rootów). Zeby
    znaleźć lokalizacje jakiegokolwiek modelu robisz:
    var item = <przekazany rekord>
    var position = []; do {
    position.push(item.id);
    item = item.parent;
    } while (item)
    position = position.reverse().join(' => ');
    print(position);
    Punkt 2 mowisz ze wiesz to nie bede tlumaczyl. Liczenie rozwinietych
    pozycji nie moze byc trzymane w jakiejś właściwosci, najwyzej cachowane
    az do kolejnej zmiany. Mozesz sobie napisac funkcje getVisibleCount:
    <sprawdzasz czy model mial aktualizacje, jak tak to kontunuujesz a jak
    nie to zwracasz ostatni wynik>
    var item = <przekazany rekord albo root>
    var visible = 0;
    if (item.expanded && item.children) {
    visible += 1; // dodajemy aktualny wezem do visible;
    // mapujemy ilosc visible podwezlow i sumujemy wszystkie. To rekurencja
    visible += item.children.map(function (node) {
    return getVisibleCount(node);
    }).sum();
    } do

    return visible;


    Wydaje mi się że to w miare rozsądny algorytm. Zawsze możesz podejrzeć
    jak to robi jakiś inny framework i zgapić.


  • 6. Data: 2015-03-22 10:22:52
    Temat: Re: Jaki algorytm do komponentu drzewka?
    Od: Borneq <b...@a...hidden.pl>

    W dniu 2015-03-22 o 10:05, Dariusz Jakubowski pisze:
    > Chyba rozumiem. Model powinien wyglądać tak:
    > Item {expanded, Bool, hasMany: Item as children, belongsTo: Item as
    > parent}
    > Rekordy są wszystkie w jednej tablicy na tym samym poziomie i mają swoje
    > pole id (to konieczne).

    Wielkie dzięki! Spróbuję zrozumieć.
    Czy będzie tak, że dla
    a
    b
    d
    e
    c
    f
    g
    będzie
    root, id=0
    a, id=1, parent=0
    b, id=2, parent=1
    d, id=3, parent=2
    e, id=4, parent=2
    c, id=5, parent=1
    f, id=6, parent=5
    g , id=7, parent=0
    ?
    Nie bardzo rozumiem "hasMany: Item as children"


  • 7. Data: 2015-03-22 10:26:50
    Temat: Re: Jaki algorytm do komponentu drzewka?
    Od: Dariusz Jakubowski <c...@g...com>

    On 2015-03-22 09:22:52 +0000, Borneq said:

    > W dniu 2015-03-22 o 10:05, Dariusz Jakubowski pisze:
    >> Chyba rozumiem. Model powinien wyglądać tak:
    >> Item {expanded, Bool, hasMany: Item as children, belongsTo: Item as
    >> parent}
    >> Rekordy są wszystkie w jednej tablicy na tym samym poziomie i mają swoje
    >> pole id (to konieczne).
    >
    > Wielkie dzięki! Spróbuję zrozumieć.
    > Czy będzie tak, że dla
    > a
    > b
    > d
    > e
    > c
    > f
    > g
    > będzie
    > root, id=0
    > a, id=1, parent=0
    > b, id=2, parent=1
    > d, id=3, parent=2
    > e, id=4, parent=2
    > c, id=5, parent=1
    > f, id=6, parent=5
    > g , id=7, parent=0
    > ?
    > Nie bardzo rozumiem "hasMany: Item as children"

    children to dzieci czyli:
    > root, id=0, children= 1,7
    > a, id=1, parent=0, children= 2,5
    > b, id=2, parent=1, children= 3,4
    > d, id=3, parent=2
    > e, id=4, parent=2
    > c, id=5, parent=1 , children=6
    > f, id=6, parent=5
    > g , id=7, parent=0
    Dane się teoretycznie powielają ale to mocno ułatwi i przyspieszy algorytm


  • 8. Data: 2015-03-22 10:47:42
    Temat: Re: Jaki algorytm do komponentu drzewka?
    Od: Borneq <b...@a...hidden.pl>

    W dniu 2015-03-22 o 10:26, Dariusz Jakubowski pisze:
    > children to dzieci czyli:
    >> root, id=0, children= 1,7
    >> a, id=1, parent=0, children= 2,5
    >> b, id=2, parent=1, children= 3,4
    >> d, id=3, parent=2
    >> e, id=4, parent=2
    >> c, id=5, parent=1 , children=6
    >> f, id=6, parent=5
    >> g , id=7, parent=0
    > Dane się teoretycznie powielają ale to mocno ułatwi i przyspieszy algorytm
    >
    Czyli oprócz listy głównej, każdy nie element nie liść będzie miał listę.
    Jak do b wstawiamy trzeci element?


  • 9. Data: 2015-03-22 19:33:26
    Temat: Re: Jaki algorytm do komponentu drzewka?
    Od: Dariusz Jakubowski <c...@g...com>

    On 2015-03-22 09:47:42 +0000, Borneq said:

    > W dniu 2015-03-22 o 10:26, Dariusz Jakubowski pisze:
    >> children to dzieci czyli:
    >>> root, id=0, children= 1,7
    >>> a, id=1, parent=0, children= 2,5
    >>> b, id=2, parent=1, children= 3,4
    >>> d, id=3, parent=2
    >>> e, id=4, parent=2
    >>> c, id=5, parent=1 , children=6
    >>> f, id=6, parent=5
    >>> g , id=7, parent=0
    >> Dane się teoretycznie powielają ale to mocno ułatwi i przyspieszy algorytm
    >>
    > Czyli oprócz listy głównej, każdy nie element nie liść będzie miał listę.
    > Jak do b wstawiamy trzeci element?

    Tak. A jak chcesz dodac gdzies element to tworzysz nowy Item, ustawiasz
    mu parent a parentowi dodajesz do children id tego Itema

strony : [ 1 ]


Szukaj w grupach

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: