• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

I gdzie tu jest ta szybkość drzew binarnych?

Object Storage Arubacloud
+1 głos
387 wizyt
pytanie zadane 10 lutego 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
Witam! Zastanawiam się gdzie tu jest szybkość drzew binarnych. Drzewa te podobno działają tak, że podczas przechodzenia przez nie, skraca się je o połowę. Ale co w przypadku haseł? Załóżmy, że mam sobie jakieś tam drzewo z rozszerzeniami plików (jest ich w 3.) i wartością jest rozszerzenie a wewnętrzną wartością (?) jest opis rozszerzenia. I gdzie tu teraz jest szybkość BTree? Skoro są to łańcuchy (te rozszerzenia), to nie można ich jakoś po numerować jako id, a podczas porównywania stringów nie można tego jakoś skracać o połowę... Wie ktoś może jak takie coś rozwiązać? Czy byłoby tu przydatne np. zrobić tablicę stringów z tymi rozszerzeniami i index odpowiada id. I na podstawie ID szukać w BTree? Jak by to można było rozwiązać, bo potrzebuję...
1
komentarz 10 lutego 2018 przez adrian17 Ekspert (344,860 p.)
edycja 10 lutego 2018 przez adrian17

Niestety, nie rozumiem pytania.

Zastanawiam się gdzie tu jest szybkość drzew binarnych

I gdzie tu teraz jest szybkość BTree?

No to BTree czy drzewo wyszukiwania binarnego? To są trochę różne rzeczy.

https://en.wikipedia.org/wiki/Binary_tree

https://en.wikipedia.org/wiki/B-tree

to nie można ich jakoś po numerować jako id

Zakładając że miałeś na myśli drzewa wyszukiwania binarnego: do takich drzew nie trzeba nic numerować, wystarczy relacja mniejsze-większe. Skąd te id wziąłeś?

1
komentarz 10 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
1. Sorry, ale kiedyś ktoś użył skrótu BTree jako skrót do Binary Tree i myślałem, że  to to samo.

2. ID stąd, że przerabiam książkę "C++. Przewodnik dla początkujących" i tam autor używał drzew, które skracały się poprzez ID węzła. Jakoś tak. Że bodajże lewa strona była większa od rodzica a prawa mniejsza i tak to jakoś szło.

3. Jak może być relacja większy mniejszy? I chodzi mi o to, że chciałbym napisać program, który podaje informacje o pliku, czyli: Nazwa, Wielkosc, INFORMACJE O ROZSZERZENIU, ...

 

I jako to ID byłoby rozszerzenie w postaci stringa i jako wartość byłaby informacja w postaci stringa (ale to mniej ważne). I umyśliłem sobie, że może być tablica stringow z tymi WSZYSTKIMI rozszerzeniami i index stringa z rozszerzeniem odpowiadalby int'owemu id w drzewie...

2 odpowiedzi

+1 głos
odpowiedź 10 lutego 2018 przez adrian17 Ekspert (344,860 p.)

I jako to ID byłoby rozszerzenie w postaci stringa i jako wartość byłaby informacja w postaci stringa (ale to mniej ważne). I umyśliłem sobie, że może być tablica stringow z tymi WSZYSTKIMI rozszerzeniami i index stringa z rozszerzeniem odpowiadalby int'owemu id w drzewie...

Nie potrzebujesz intów, żeby szukać rzeczy w drzewie. Kluczem jak najbardziej może być string.

Jeśli "zwykłe" drzewo i funkcja szukania wygląda tak:

struct Node {
	int key;
	Dane dane;
	Node *left, *right;
};
Node* search(int key, Node * node) {
	if (node == nullptr) return node;
	if (key == node->key) return node;
	return search(key, key < node->key ? node->left : node->right);
}

To dokładnie ten sam kod, tylko ze stringowymi kluczami, będzie też poprawnie działał:

struct Node {
	std::string key;
	Dane dane;
	Node *left, *right;
};
Node* search(const std::string &key, Node * node) {
	if (node == nullptr) return node;
	if (key == node->key) return node;
	return search(key, key < node->key ? node->left : node->right);
}

(BTW, mniej więcej tak w C++ie w bibliotece standardowej funkcjonują std::map<int, Dane> i std::map<std::string, Dane>)

A, jeszcze to:

Jak może być relacja większy mniejszy?

Że bodajże lewa strona była większa od rodzica a prawa mniejsza i tak to jakoś szło.

Sam sobie odpowiedziałeś ;)

komentarz 10 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
1. Nie rozumiem tych zapisów cos? cosinnego : jeszczecosinnego

2. Ale jak jeden string może być mniejszy od drugiego? Przecież to jest łańcuch znaków... Nie a tu liczb. Chyba, że by pozamieniać wszystkie znaki na index w ASCII i pododawać to wszystko, ale to by była katorga i niektóre wyniki byłyby takie same.
komentarz 10 lutego 2018 przez adrian17 Ekspert (344,860 p.)

1. Nie rozumiem tych zapisów cos? cosinnego : jeszczecosinnego

Wyrażenie warunkowe. Można to dłużej zapisać tak:

Node *next;
if (key < node->key)
	next = node->left;
else
	next = node->right;
return search(key, next);

Ale jak jeden string może być mniejszy od drugiego? 

Dokładnie tak samo, jak są posortowane w książce telefoniczniej, słownikach lub w spisie na końcu podręczników - alfabetycznie ;)

Sam możesz zobaczyć, że to działa, wpisując w programie:

std::string x = "kasia";
std::string y = "tomek";
bool b = x < y; // Kasia jest w ksiazce telefonicznej przed Tomkiem

 

komentarz 10 lutego 2018 przez Hiskiel Pasjonat (22,830 p.)
O kurde :O. Dziękuję! xD
0 głosów
odpowiedź 10 lutego 2018 przez mokrowski Mędrzec (155,460 p.)

No tak no to po kolei..

1. Klikamy na dokumentację std::string w bibliotece standardowej i widzimy:

http://en.cppreference.com/w/cpp/string/basic_string

2. Następnie zaglądamy do zaimplementowanych operatorów:

http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp

Jak widać są operatory operator==,!=,<,<=,>,>=(std::basic_string)

3. Wracamy do poprzedniej strony:

http://en.cppreference.com/w/cpp/string/basic_string

4. Jedziemy na koniec strony i klikamy w sekcję "Helper classes":

http://en.cppreference.com/w/cpp/string/basic_string/hash

Już widać że są implementacje funkcji skrótu dla std::string'a.

Dodatkowo warto zapoznać się z: http://scottmeyers.blogspot.de/2015/09/should-you-be-using-something-instead.html

Aby wyciągnąć jakieś wnioski o wydajności kontenerów. Oczywiście to nie jedyne źródła ... ale efekt 5 min szukania.

Podobne pytania

0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 1 maja 2019 w C i C++ przez Alucarddo Nowicjusz (210 p.)
0 głosów
0 odpowiedzi 92 wizyt
pytanie zadane 25 maja 2020 w C i C++ przez Daim123 Użytkownik (530 p.)
0 głosów
0 odpowiedzi 109 wizyt
pytanie zadane 1 lutego 2019 w C i C++ przez gorgonkowa Obywatel (1,810 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...