Dyskusja:Binarne drzewo poszukiwań

message: === Załatwione ===
Takie uwagi:
* Wydaje mi się, że 3. własność jest redundantna w stosunku do dwóch pierwszych. Rozumiem, że to własności, które definiują drzewo, a nie ogólne własności, których jest dużo więcej, więc chyba można by ją usunąć.
** nie jest redundantna. Drzewo, które spełnia dwa pierwsze a nie spełnia trzeciego nie jest BST;> Matek M (dyskusja) 21:13, 19 wrz 2010 (CEST)
*** Jakiś przykład takiego drzewa? :) royas (dyskusja) 22:12, 19 wrz 2010 (CEST)
**** jasne:
            10
         5      17
       2   3   23 30
W powyższym drzewie za "dowolny węzeł" bierzemy sobie 10. Teraz jego lewe poddrzewo ma wszystkie węzły mniejsze niż 10 a prawe wszystkie węzły większe niż 10. Nie jest to jednak BST, ponieważ lewe poddrzewo nie spełnia już tych własności. Matek M (dyskusja) 22:21, 19 wrz 2010 (CEST)
***** Dowolny znaczy każdy. Nie możesz sobie ustalić "dowolnego" elementu. royas (dyskusja) 22:30, 19 wrz 2010 (CEST)
***** To jeszcze dodam, żeby zakończyć wątek, że gdyby można było to:
       10
     2    8
    1 3  7 9
jest BST: za dowolny wybierzmy 2 i wszystkie trzy warunki pasują. To co mamy to pomieszanie dwóch definicji rekurencyjnej i nierekurencyjnej:
(1) na lewo od korzenia mniejsze, na prawo większe i oba poddrzewa też BST. (2) dla każdego węzła na lewo mniejsze, na prawo większe. royas (dyskusja) 00:23, 20 wrz 2010 (CEST)
** zmieniłem "dowolny" na "każdy", żeby nie było wątpliwości - teraz trzecie zdanie można usunąć. Matek M (dyskusja) 06:21, 20 wrz 2010 (CEST)
* Z tego powodu często zamiast drzewa BST stosuje się drzewa, które dzięki nakładaniu dodatkowych warunków gwarantują, że drzewo będzie zrównoważone, przez co pesymistyczny czas wykonywania operacji będzie wynosił O(h). - Generalnie to jest prawda, ale bez sensu to oszacowanie.
** dlaczego bez sensu? Matek M (dyskusja) 21:13, 19 wrz 2010 (CEST) Oj, dopiero zobaczyłem w czym rzecz;) Matek M (dyskusja) 21:17, 19 wrz 2010 (CEST)
* Znajdywanie następnika i poprzednika - algorytmy z błędami, opis też (co gdy węzeł odniesienia nie ma prawego poddrzewa i jest po prostu lewym synem?)
** Chciałem zlikwidować mającym lewego syna, który także jest przodkiem danego węzła, Cormen wyjaśnia, że w tym przypadku należy przyjąć, że węzeł jest swoim własnym przodkiem, konstrukcja nieco nieintuicyjna. Myślę, że ogólny opis przed kodem jest w encyklopedii lepszą kolejnością. Poprawiłem dla następnika. I tu pytam jeszcze raz - czy nie wystarczy napisać że poprzednik robimy analogicznie? To jest całkowicie symetryczna sytuacja, niepotrzebne rozdmuchiwanie treści. royas (dyskusja) 09:18, 20 wrz 2010 (CEST)
*** w sumie po przemyśleniu to masz racje. Usuwaj, jeżeli chcesz Matek M (dyskusja) 12:05, 21 wrz 2010 (CEST)
* Nie wiem czy ma sens dublowania pełnych opisów dla symetrycznych operacji
* Wstawianie: RootNode = InsertNode wymaga chyba jakiegoś wyjaśnienia,
** Załatwione royas (dyskusja) 09:19, 20 wrz 2010 (CEST)
* Usuwanie: czy relacja bycia następnikiem jest przechodnia? Wtedy znajdowanie następnika powinno nazywać się znajdowanie pierwszego następnika. Tu by się przydał też kod.
* Załatwione. Po prostu następnik nie ma lewego syna. royas (dyskusja) 15:50, 21 wrz 2010 (CEST)
* możemy użyć pseudokodów bezpośrednio z książki? Podlegają one PA? (Chodzi mi konkretnie o konwencje zastosowane w danej książce)Matek M (dyskusja) 08:57, 20 wrz 2010 (CEST)
** Jeśli treści kodów i konwencja będą z tej samej książki, to nawet jeśli nie będzie to NPA to będzie głupio wyglądało. Może niech już zostanie ten pseudo-pythono-c. Jedynie co to zmieniłbym NULLe na pythonowski None lub teoretyczny NIL royas (dyskusja) 09:38, 20 wrz 2010 (CEST)
*** te pseudo pseudokody miały być tu tylko tymczasowo - docelowo chce to przekonwertować na jakiś standardowy format. Ten stosowany w Cormenie jest bardzo czytelny - jednak nie chciałem go stosować bo to źle wygląda - art oparty na książce, z kodami źródłowymi z tej książki: śmierdzi NPA na odległość... Trzeba będzie coś wykąbinować
****Proponowałbym nie oddalać się za bardzo od języków obsługiwanych przez GeSHi, żeby kolorowanie było w miarę ok. Nb. na stronie rozszerzenia zalecane jest stosowanie tagu <syntaxhighlight lang="cpp"> zamiast <source> royas (dyskusja) 14:06, 22 wrz 2010 (CEST)
* Na początku artykułu dodałbym jakąś sekcję z przedstawieniem problemu, ponieważ obecnie artykuł zaczyna się trochę "z grubej rury" :). Może się ona nazywać po prostu Problem i zawierać omówienie typu "W algorytmice często rozważane jest zagadnienie szybkiego wykonywania XXX. Przykładowo blablabla. Inne techniki nie umożliwiają nam zrobienia XXX, dlatego stosuje się BST, które pozwalają na ZZZ dzięki temu, że AAA." :). Uporządkowałbym też grafiki ilustrujące usuwanie, ponieważ robi się tam strasznie duża przerwa w tekście - spróbujmy może ułożyć je poziomo, albo wykorzystać jakiś szablonik do robienia galerii, byleby zająć nimi całą szerokość strony. --Zyx (dyskusja) 22:29, 19 wrz 2010 (CEST)
** myślę, że informacja o tym, że stosuje je się do implementacji szybkich algorytmów sortowania i wyszukiwania jest wystarczająca na potrzeby DA;) Matek M (dyskusja) 14:13, 29 wrz 2010 (CEST)
*** Myślę, że Zyx ma rację. Tzn. teraz wstęp jest taki, że jak ktoś nie wie o co chodzi to się z niego nie dowie. Bo mamy po kolei, że: (1) jakaś struktura danych - ok; (2) o pewnych właściwościach/ograniczeniach - ok; (3) podstawowe operacje - nie wiadomo do czego jest to BST, nie wiadomo jakie są te podstawowe operacje, a już mówimy o kosztach i to w jakimś szczególnym przypadku. (4) 1 gałąź - Kolejny szczególny przypadek (5) O(h) dalej o kosztach ale nie wiadomo czego; (6) in-order - mało istotna w tym miejscu inforamcja. Dodatkowo od razu i bez wyjaśnień opisany jest model z kluczami, bez opisu po co to i co to w ogóle ten klucz i że nie muszą to być klucze, tylko potrzebny jest porządek albo na węzłach albo na elementach przechowywanych w drzewie. royas (dyskusja) 14:37, 29 wrz 2010 (CEST)
**** ale jakieś konkretne propozycje rozwiązania tego (przykład innego wstępu?) - imo jest dobrze, więc jeżeli ktoś ma zarzuty, powinien poprawić;> Matek M (dyskusja) 15:04, 29 wrz 2010 (CEST)
* na małych rozdzielczościach ilustracje niszczą układ strony - są za szerokie. Jest jakiś sposób umieszczenia ich w dwóch rzędach po dwie kolumny stosując jedną galerie? Matek M (dyskusja) 08:31, 24 wrz 2010 (CEST)
** Nie wiem czy dalej się rozjeżdża ale ilość w rzędzie to atrybut perrow="X"  royas (dyskusja) 09:29, 24 wrz 2010 (CEST)
*** ok, imo jest już dobrze Matek M (dyskusja) 14:22, 29 wrz 2010 (CEST)
=== Dyskusja ===
* W ogóle w jakim języku są przykładowe kody?
*Wyważone drzewo można łatwo zbudować na bazie posortowanej tablicy, algorytmem analogicznym do wyszukiwania binarnego jak?
replies: text: :Poniżej kod Pi * drzwi. Nie wstawiałem tego w żadnej postaci, bo uznałem, że nie ma dużego znaczenia. Wojciech Muła (dyskusja) 16:02, 20 wrz 2010 (CEST)
class Node:
    def __init__(x):
        self.x = x
        self.left = None
        self.right = None
def make_tree(tbl, a, b):
    if a > b:
       return None # pusty przedział
    elif a == b:
       return Node(tbl[a]) # tylko jeden element
    else:
       c = (a + b)/2
       root = Node(tbl[c])
       root.left = make_tree(tbl, a, c-1)
       root.right = make_tree(tbl, c+1, b)
       return root
# budowanie drzewa
root = make_tree(tbl, 0, len(tbl)-1)
* Odniesienie do Knutha bez przypisu
* Przydałoby się parę słów uzasadniających oszacowanie złożoności.
** co masz na myśli pod uzasadnieniem? Nie wystarczy ref do Cormena? Matek M (dyskusja) 21:13, 19 wrz 2010 (CEST)
*** Ref nic nie wnosi do treści artykułu. Jakieś dwa zdania, że te operacje generalnie idą po pionowej ścieżce, a nie łażą po całym drzewie. royas (dyskusja) 22:12, 19 wrz 2010 (CEST)
* Może coś o historii?
royas (dyskusja) 20:51, 19 wrz 2010 (CEST)
*Wydaje mi się, że wstęp do sekcji Wyważanie jest napisany od tyłu. Ciąg powinien być taki: jeśli operacje zależą od h to należy zadbać, żeby h były krótkie, jest tak gdy drzewo jest dobrze rozgałęzione, wyznacznikami krzeczastości mogą być różne zrównoważenia, wtedy h=O(log n).
**We wstępie podano, iż w BST określa się złożoność od h. Wojciech Muła (dyskusja) 17:34, 1 lis 2010 (CET)
***Tak, w podręcznikach jako początek analizy złożoności. royas (dyskusja) 14:25, 3 lis 2010 (CET)
thread_title:  DA 

message: Takie uwagi:
* Wydaje mi się, że 3. własność jest redundantna w stosunku do dwóch pierwszych. Rozumiem, że to własności, które definiują drzewo, a nie ogólne własności, których jest dużo więcej, więc chyba można by ją usunąć.
** nie jest redundantna. Drzewo, które spełnia dwa pierwsze a nie spełnia trzeciego nie jest BST;> Matek M (dyskusja) 21:13, 19 wrz 2010 (CEST)
*** Jakiś przykład takiego drzewa? :) royas (dyskusja) 22:12, 19 wrz 2010 (CEST)
**** jasne:
            10
         5      17
       2   3   23 30
W powyższym drzewie za "dowolny węzeł" bierzemy sobie 10. Teraz jego lewe poddrzewo ma wszystkie węzły mniejsze niż 10 a prawe wszystkie węzły większe niż 10. Nie jest to jednak BST, ponieważ lewe poddrzewo nie spełnia już tych własności. Matek M (dyskusja) 22:21, 19 wrz 2010 (CEST)
***** Dowolny znaczy każdy. Nie możesz sobie ustalić "dowolnego" elementu. royas (dyskusja) 22:30, 19 wrz 2010 (CEST)
***** To jeszcze dodam, żeby zakończyć wątek, że gdyby można było to:
       10
     2    8
    1 3  7 9
jest BST: za dowolny wybierzmy 2 i wszystkie trzy warunki pasują. To co mamy to pomieszanie dwóch definicji rekurencyjnej i nierekurencyjnej:
(1) na lewo od korzenia mniejsze, na prawo większe i oba poddrzewa też BST. (2) dla każdego węzła na lewo mniejsze, na prawo większe. royas (dyskusja) 00:23, 20 wrz 2010 (CEST)
** zmieniłem "dowolny" na "każdy", żeby nie było wątpliwości - teraz trzecie zdanie można usunąć. Matek M (dyskusja) 06:21, 20 wrz 2010 (CEST)
* Z tego powodu często zamiast drzewa BST stosuje się drzewa, które dzięki nakładaniu dodatkowych warunków gwarantują, że drzewo będzie zrównoważone, przez co pesymistyczny czas wykonywania operacji będzie wynosił O(h). - Generalnie to jest prawda, ale bez sensu to oszacowanie.
** dlaczego bez sensu? Matek M (dyskusja) 21:13, 19 wrz 2010 (CEST) Oj, dopiero zobaczyłem w czym rzecz;) Matek M (dyskusja) 21:17, 19 wrz 2010 (CEST)
* Znajdywanie następnika i poprzednika - algorytmy z błędami, opis też (co gdy węzeł odniesienia nie ma prawego poddrzewa i jest po prostu lewym synem?)
** Chciałem zlikwidować mającym lewego syna, który także jest przodkiem danego węzła, Cormen wyjaśnia, że w tym przypadku należy przyjąć, że węzeł jest swoim własnym przodkiem, konstrukcja nieco nieintuicyjna. Myślę, że ogólny opis przed kodem jest w encyklopedii lepszą kolejnością. Poprawiłem dla następnika. I tu pytam jeszcze raz - czy nie wystarczy napisać że poprzednik robimy analogicznie? To jest całkowicie symetryczna sytuacja, niepotrzebne rozdmuchiwanie treści. royas (dyskusja) 09:18, 20 wrz 2010 (CEST)
*** w sumie po przemyśleniu to masz racje. Usuwaj, jeżeli chcesz Matek M (dyskusja) 12:05, 21 wrz 2010 (CEST)
* Nie wiem czy ma sens dublowania pełnych opisów dla symetrycznych operacji
* Wstawianie: RootNode = InsertNode wymaga chyba jakiegoś wyjaśnienia,
** Załatwione royas (dyskusja) 09:19, 20 wrz 2010 (CEST)
* Usuwanie: czy relacja bycia następnikiem jest przechodnia? Wtedy znajdowanie następnika powinno nazywać się znajdowanie pierwszego następnika. Tu by się przydał też kod.
* Załatwione. Po prostu następnik nie ma lewego syna. royas (dyskusja) 15:50, 21 wrz 2010 (CEST)
* możemy użyć pseudokodów bezpośrednio z książki? Podlegają one PA? (Chodzi mi konkretnie o konwencje zastosowane w danej książce)Matek M (dyskusja) 08:57, 20 wrz 2010 (CEST)
** Jeśli treści kodów i konwencja będą z tej samej książki, to nawet jeśli nie będzie to NPA to będzie głupio wyglądało. Może niech już zostanie ten pseudo-pythono-c. Jedynie co to zmieniłbym NULLe na pythonowski None lub teoretyczny NIL royas (dyskusja) 09:38, 20 wrz 2010 (CEST)
*** te pseudo pseudokody miały być tu tylko tymczasowo - docelowo chce to przekonwertować na jakiś standardowy format. Ten stosowany w Cormenie jest bardzo czytelny - jednak nie chciałem go stosować bo to źle wygląda - art oparty na książce, z kodami źródłowymi z tej książki: śmierdzi NPA na odległość... Trzeba będzie coś wykąbinować
****Proponowałbym nie oddalać się za bardzo od języków obsługiwanych przez GeSHi, żeby kolorowanie było w miarę ok. Nb. na stronie rozszerzenia zalecane jest stosowanie tagu <syntaxhighlight lang="cpp"> zamiast <source> royas (dyskusja) 14:06, 22 wrz 2010 (CEST)
* Na początku artykułu dodałbym jakąś sekcję z przedstawieniem problemu, ponieważ obecnie artykuł zaczyna się trochę "z grubej rury" :). Może się ona nazywać po prostu Problem i zawierać omówienie typu "W algorytmice często rozważane jest zagadnienie szybkiego wykonywania XXX. Przykładowo blablabla. Inne techniki nie umożliwiają nam zrobienia XXX, dlatego stosuje się BST, które pozwalają na ZZZ dzięki temu, że AAA." :). Uporządkowałbym też grafiki ilustrujące usuwanie, ponieważ robi się tam strasznie duża przerwa w tekście - spróbujmy może ułożyć je poziomo, albo wykorzystać jakiś szablonik do robienia galerii, byleby zająć nimi całą szerokość strony. --Zyx (dyskusja) 22:29, 19 wrz 2010 (CEST)
** myślę, że informacja o tym, że stosuje je się do implementacji szybkich algorytmów sortowania i wyszukiwania jest wystarczająca na potrzeby DA;) Matek M (dyskusja) 14:13, 29 wrz 2010 (CEST)
*** Myślę, że Zyx ma rację. Tzn. teraz wstęp jest taki, że jak ktoś nie wie o co chodzi to się z niego nie dowie. Bo mamy po kolei, że: (1) jakaś struktura danych - ok; (2) o pewnych właściwościach/ograniczeniach - ok; (3) podstawowe operacje - nie wiadomo do czego jest to BST, nie wiadomo jakie są te podstawowe operacje, a już mówimy o kosztach i to w jakimś szczególnym przypadku. (4) 1 gałąź - Kolejny szczególny przypadek (5) O(h) dalej o kosztach ale nie wiadomo czego; (6) in-order - mało istotna w tym miejscu inforamcja. Dodatkowo od razu i bez wyjaśnień opisany jest model z kluczami, bez opisu po co to i co to w ogóle ten klucz i że nie muszą to być klucze, tylko potrzebny jest porządek albo na węzłach albo na elementach przechowywanych w drzewie. royas (dyskusja) 14:37, 29 wrz 2010 (CEST)
**** ale jakieś konkretne propozycje rozwiązania tego (przykład innego wstępu?) - imo jest dobrze, więc jeżeli ktoś ma zarzuty, powinien poprawić;> Matek M (dyskusja) 15:04, 29 wrz 2010 (CEST)
* na małych rozdzielczościach ilustracje niszczą układ strony - są za szerokie. Jest jakiś sposób umieszczenia ich w dwóch rzędach po dwie kolumny stosując jedną galerie? Matek M (dyskusja) 08:31, 24 wrz 2010 (CEST)
** Nie wiem czy dalej się rozjeżdża ale ilość w rzędzie to atrybut perrow="X"  royas (dyskusja) 09:29, 24 wrz 2010 (CEST)
*** ok, imo jest już dobrze Matek M (dyskusja) 14:22, 29 wrz 2010 (CEST)
thread_title:  Załatwione 

message: * W ogóle w jakim języku są przykładowe kody?
*Wyważone drzewo można łatwo zbudować na bazie posortowanej tablicy, algorytmem analogicznym do wyszukiwania binarnego jak?
replies: text: :Poniżej kod Pi * drzwi. Nie wstawiałem tego w żadnej postaci, bo uznałem, że nie ma dużego znaczenia. Wojciech Muła (dyskusja) 16:02, 20 wrz 2010 (CEST)
class Node:
    def __init__(x):
        self.x = x
        self.left = None
        self.right = None
def make_tree(tbl, a, b):
    if a > b:
       return None # pusty przedział
    elif a == b:
       return Node(tbl[a]) # tylko jeden element
    else:
       c = (a + b)/2
       root = Node(tbl[c])
       root.left = make_tree(tbl, a, c-1)
       root.right = make_tree(tbl, c+1, b)
       return root
# budowanie drzewa
root = make_tree(tbl, 0, len(tbl)-1)
* Odniesienie do Knutha bez przypisu
* Przydałoby się parę słów uzasadniających oszacowanie złożoności.
** co masz na myśli pod uzasadnieniem? Nie wystarczy ref do Cormena? Matek M (dyskusja) 21:13, 19 wrz 2010 (CEST)
*** Ref nic nie wnosi do treści artykułu. Jakieś dwa zdania, że te operacje generalnie idą po pionowej ścieżce, a nie łażą po całym drzewie. royas (dyskusja) 22:12, 19 wrz 2010 (CEST)
* Może coś o historii?
royas (dyskusja) 20:51, 19 wrz 2010 (CEST)
*Wydaje mi się, że wstęp do sekcji Wyważanie jest napisany od tyłu. Ciąg powinien być taki: jeśli operacje zależą od h to należy zadbać, żeby h były krótkie, jest tak gdy drzewo jest dobrze rozgałęzione, wyznacznikami krzeczastości mogą być różne zrównoważenia, wtedy h=O(log n).
**We wstępie podano, iż w BST określa się złożoność od h. Wojciech Muła (dyskusja) 17:34, 1 lis 2010 (CET)
***Tak, w podręcznikach jako początek analizy złożoności. royas (dyskusja) 14:25, 3 lis 2010 (CET)
thread_title:  Dyskusja 

message: witam, w/g mnie dawanie wersji iteracyjnych zaciemnia obraz. lepiej zostawic tylko wersje rekurencyjną, a nawet obecne wersje iteracyjne (np. wyszukiwanie wartosci najmniejszej), zastapic wersja rekurencyjną.
--149.156.82.207 (dyskusja) 18:50, 10 gru 2010 (CET)
thread_title:  wersje iteracyjne.