zrównoważone drzewo binarne wyszukiwania przy użyciu sortedset

głosy
0

Proszę o pomoc Próbowałem wygenerować losowy binarne drzewo poszukiwań wielkości 1024 i elementów musi być losowy sortedset ... Jestem w stanie napisać kod, aby utworzyć przeszukiwania binarnego drzewa ręcznie dodając elementy ręcznie, ale I” m unablele yo napisać kod, który generuje losowy zrównoważony binarne drzewo o rozmiarze 1024 a następnie użyć spróbować znaleźć klucz w tym drzewie ... proszę, proszę i dziękuję u do przodu ....

Edycja dodany kod z komentarzami

ya to praca domowa ... a to jest to, co mam tak daleko jak kod:

using System; 
namespace bst { 
    public class Node { 
        public int value; 
        public Node Right = null; 
        public Node Left = null; 

        public Node(int value) 
        { 
            this.value = value; 
        } 
    } 

    public class BST { 
        public Node Root = null; 
        public BST() { }

        public void Add(int new_value) 
        { 
            if(Search(new_value)) 
            {
                Console.WriteLine(value ( + new_value + ) already);
            }
            else
            {
                AddNode(this.Root,new_value);
            }
        }
    }
}
Utwórz 21/01/2011 o 00:53
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
2

Używaj rekursji. Każdy oddział generuje nowy oddział, wybierz pozycję środkową w zestawie niesegregowanych, mediany. Umieścić go w bieżącej pozycji w drzewie. Skopiować wszystkie elementy poniżej mediany do innej tablicy, wysłać tę nową tablicę do wywołania tej samej metody. Kopiuj wszystkie elementy większe od mediany do innej tablicy, wysłać tę nową tablicę do wywołania tej samej metody. \

Wyważone drzew mieć nieparzystą liczbę elementów, chyba że główny węzeł nadrzędny nie jest wypełnione. Musisz zdecydować, czy są dwie wartości, które są Median, czy duplikat należy na dolnej lub górnej gałęzi branży. Włożyłem duplikaty na górnej gałęzi w moim przykładzie.

Mediana będzie liczba gdy równą ilość numerów mniej niż i więcej niż numeru. 1,2,3,3,4,18,29,105,123 W tym przypadku mediana wynosi 4, mimo że średnia (lub średnia) jest znacznie wyższa.

Nie zawierają kod, który określa medianę.

BuildTreeItem(TreeItem Item, Array Set)  
{
  Array Smalls;
  Array Larges;
  Median = DetermineMedian(Set);
  Item.Value = Median;
  if(Set.Count() == 1)
    return;  
  for (int i = 0; int i < Set.Count(); i++)
  {
    if(Set[i] < Median)
    {
      Smalls.new(Set[i]);
    }
    else
    {
      Larges.new(Set[i]);
    }
  }
  Item.Lower = new TreeItem;
  Item.Upper = new TreeItem;
  BuildTreeItem(TreeItem.Lower, Smalls);
  BuildTreeItem(TreeItem.Upper, Larges);
}
Odpowiedział 21/01/2011 o 01:13
źródło użytkownik

głosy
0

O ile nie jest to praca domowa najprostszym rozwiązaniem byłoby, aby posortować dane, a potem zbudować drzewo za pomocą środkowego elementu jako root i zstępujących w dół każdą połówkę. Metoda zaproponowana przez Xaade jest podobny , ale znacznie wolniej z powodu DetermineMedian złożoności .

Inną opcją jest rzeczywiście spojrzeć na algorytmach, które budują wyważonych drzew (jak http://en.wikipedia.org/wiki/Red-black_tree ), aby sprawdzić, czy pasuje do Twoich wymagań.

EDIT: usuwanie nieprawidłowe oświadczenia o szybkości algorytmu Xaade - to jest rzeczywiście tak szybko, jak szybko sort (n log n - sprawdzić każdy element na każdym poziomie rekurencji z dziennika n poziomów rekursji), nie wiem dlaczego oceniłem to wolniej.

Odpowiedział 21/01/2011 o 02:42
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more