Przejdź do dokumentu
To jest dokument premium. Niektóre dokumenty na Studocu są premium. Przejdź na wersję premium, aby odblokować.

Sdizo - sprawozdanie - proj1

1 project for half semester about Data structures
Kurs

Struktury danych i złoż. obl.1 (INEK00006Wcp)

6 Dokumenty
Studenci udostępnili 6 dokumentów w tym kursie
Rok akademicki: 2016/2017
Przesłane przez:
Anonimowy Student
Ten dokument został przesłany przez studenta, takiego jak Ty, który zażyczył sobie zachować anonimowość.
Politechnika Wroclawska

Komentarze

Aby publikować komentarze, zaloguj się lub zarejestruj się.

Przejrzyj tekst

Kajetan Parzyszek Struktury Danych i Złożoność Obliczeniowa Zadanie projektowe nr 1: Badanie efektywności operacji wstawiania, usuwania oraz wyszukiwania w podstawowych strukturach danych KP 04/04/2017 Spis treści 1. Wstęp teoretyczny .................................................................................................................................. 2 1. Tablica z realokacją pamięci ........................................................................................................... 2 1. Lista dwukierunkowa ...................................................................................................................... 4 1. Kopiec maksymalny ........................................................................................................................ 6 2. Plan eksperymentu.................................................................................................................................. 7 3. Wyniki/Wnioski ....................................................................................................................................... 8 3. 3.1. Wstawianie na początek ........................................................................................................ 8 3.1. Wstawianie na środek .......................................................................................................... 10 3.1. Wstawianie na koniec .......................................................................................................... 12 3.1. Usuwanie z początku ............................................................................................................ 14 3.1. Usuwanie z środka................................................................................................................ 16 3.1. Usuwanie z końca ................................................................................................................. 18 3.1. Wyszukiwanie klucza poza przedziałem ............................................................................... 20 3. Lista dwukierunkowa .................................................................................................................... 22 3.2. Wstawianie na początek ...................................................................................................... 22 3.2. Wstawianie na środek .......................................................................................................... 24 3.2. Wstawianie na koniec .......................................................................................................... 26 3.2. Usuwanie z początku ............................................................................................................ 28 3.2. Usuwanie z środka................................................................................................................ 30 3.2. Usuwanie z końca ................................................................................................................. 32 3.2. Wyszukiwanie klucza poza przedziałem ............................................................................... 34 3. 4. Tablica ............................................................................................................................................. 8 Kopiec maksymalny ...................................................................................................................... 36 3.3. Wstawianie ........................................................................................................................... 36 3.3. Usuwanie .............................................................................................................................. 38 3.3. Wyszukiwanie klucza poza przedziałem ............................................................................... 40 Podsumowanie ...................................................................................................................................... 42 Page 1 of 42 • Koniec tablicy W tym przypadku nie ma potrzeby przesuwania elementów tablicy, co skutkuje zmniejszenie czasu wykonywania operacji, jednak nadal niezbędna jest realokacja pamięci. Złożoność obliczeniowa w tym przypadku również pozostaje bez zmian w związku z niezmienną potrzebą realokacji całej tablicy, co zajmuje stosunkowo więcej czasu w zależności od ilości danych. Złożoność O(n). ▪ Usuwanie • Początek tablicy Usuwanie jest operacją podobną do wstawiania, z tą różnicą, że przy usuwaniu z początka tablicy, realokujemy pamięć o mniejszym rozmiarze o 1 i przesuwamy wszystkie klucze o jeden indeks w dół z pominięciem indeksu 0. Operacja ta jak i poprzednie ma złożoność czasową liniową ze względu na potrzebe przepisania wszystkich danych. Złożoność O(n). • Środek tablicy Różnica taka jak przy wstawianiu – mniej wartości do przesunięcia, co daje krótszy czas wykonywania. Złożoność bez zmian – nadal liniowa - O(n). • Koniec tablicy W tym przypadku również różnica jak przy wstawianiu. Czas wykonania krótszy ponieważ nie trzeba przesuwać wartości, jednak czas realokacji pozostaje bez zmian. Złożoność bez zmian – nadal liniowa – O(n). ▪ Wyszukiwanie • Przeszukiwanie całej tablicy Każdy kolejny klucz w tablicy porównywany jest z szukanym kluczem do momentu znalezienia szukanej wartości, czyli w najgorszym wypadku trzeba przeszukać całą tablicę gdy wartość klucza szukanego nie znajduje się w tablicy. Złożoność obliczeniowa w tym wypadku jest liniowa – im więcej elementów, tym więcej porównań – złożoność O(n). Page 3 of 42 1. Lista dwukierunkowa Lista dwukierunkowa jest strukturą danych składającą się z sekwenycjnie połączonych ze sobą elementów. Każdy z elementów zawiera przechowywany klucz oraz dwa pola wskazujące na element poprzedni oraz następny na liście. Lista dwukierunkowa zawiera pola wskazujące na element pierwszy oraz ostatni na liście, których odpowiednio poprzednikiem oraz następnikiem są pewnego rodzaju oznaczenia wskazujące na brak elementu poprzedniego lub następnego(np. wskaźnik na element pusty). ▪ Wstawianie • Początek listy W przypadku wstawiania na początek listy, nowy element staje się pierwszym elementem na liście a poprzedni pierwszy element zostaje elementem kolejnym. Operacja ta nie jest czasochłonna ze względu na to że jedyne co trzeba zrobić to przypisać nowego poprzednika do elementu pierwszego, a do elementu nowego adres elementu poprzednio pierwszego. Złożoność czasowa takiej operacji jest stała, niezależna od ilości elementów, zawsze musimy wykonać jedynie operacje opisane powyżej. Złożoność O(1). • Środek listy W przypadku kiedy chcemy wstawić nowy element w środek listy, musimy najpierw odnaleźć element który obecnie się tam znajduje, co jest tym bardziej czasochłonne im więcej elementów znajduję się w liście, ponieważ musimy przejść przez każdy poprzedni element. Następnie tworzymy nowe połączenia między nowym elementem, a jego rządanym następnikiem i poprzednikiem. Złożoność w tym wypadku nie jest już stała, jak miało to miejsce przy wstawianiu na początek listy, lecz jest liniowa, ze względu na interowanie poprzez elementy listy, do rządanego miejsca na liście. Złożoność O(n). • Koniec listy Przypadek podobny jak przy wstawianiu na środek listy z tą różnicą że musimy dotrzeć na koniec listy co zajmuję jeszcze więcej czasu niż to miało miejsce w przypadku poprzednim. Złożoność taka sama jak powyżej – O(n). Page 4 of 42 1. Kopiec maksymalny Kopiec jest strukturą danych przybierającą formę drzewiastą. W zależności od rodzaju kopca, minimalny lub maksymalny, gdzie odpowiednio każde dziecko jest większe lub mniejsze od swojego rodzica. W skutek tego otrzymujemy kopiec maksymalny lub minimalny gdzie odpowiednio w korzeniu przechowywana jest wartość największa lub najmniejsza. Kopiec jest jednym ze sposobów implementacji kolejki priorytetowej. Wysokość drzewa h = log2(n), gdzie n to ilość przechowywanych kluczy. Przy implementacji drzewa można wykorzystać tablicę lub listę. W tym przypadku zbadane zostało zastosowanie tablicy bez realokacji. ▪ Wstawianie W przypadku kopca operacja wstawiania nie jest rozdzielana na konkretne pozycje, wartość wstawiana jest zawsze na miejsce za ostatnim elementem kopca, a następnie krok po kroku nowa wartość jest przesuwana w górę drzewa, poprzez porównanie nowego elementu z jego rodzicem i ich zamiane miejscami, jeżeli własności kopca nie są zachowane. W najgorszym przypadku, gdy nowa wartość jest odpowiednio największa lub najmniejsza w kopcu, zależnie od rodzaju kopca, złożoność obliczeniowa operacji wstawiania to O(log2(n)), ponieważ tyle właśnie operacji zamiany elementów trzeba wykonać. Natomiast średnia złożoność obliczeniowa tej operacji to O(1) – czyli czas stały. ▪ Usuwanie W przypadku usuwania również nie wyróżnia się usuwania z konkretnych pozycji, lecz jedynie usuwanie elementu odpowiednio największego lub najmniejszego, w zależności od rodzaju kopca. W celu usunięcia korzenia, zamienia się wartościami korzeń z elementem ostatnim w drzewie, usuwa się ostatni element, który teraz ma wartość korzenia, a następnie przesuwa się nowy korzeń w dół drzewa, poprzez porównywanie go z jednym z jego dzieci, do momentu kiedy własności kopca będą zachowane. Operacja ta ma złożoność czasową logarytmiczną – O(log2(n)), ponieważ po zamianie korzenia z elementem ostatni, zazwyczaj trzeba przesunąć nową wartość korzenia na sam dół drzewa, czyli wykonać log2(n) operacji zamiany. ▪ Wyszukiwanie • Przeszukiwanie całego kopca Każdy kolejny klucz przechowywany w kopcu porównywany jest z szukanym kluczem do momentu znalezienia szukanej wartości, czyli w najgorszym wypadku trzeba przeszukać cały kopiec gdy wartość klucza szukanego nie znajduje się w kopcu. Złożoność obliczenia w tym przypadku jest liniowa – im więcej elementów tym więcej porównań – złożoność O(n). Page 6 of 42 2. Plan eksperymentu • • • • • • • • • Językiem programowania użytym w eksperymencie był C++ w standardzie ISO C++11 Badanie poszczególnych operacji zostało przeprowadzone na losowo generowanych zestawach danych zawierających klucze z przedziałów: [10,100], [~(INT_MAX/2)], [~INT_MAX] oraz [1,INT_MAX]. ~ - rozrzut rzędu 100000000 Losowe liczby z podanych przedziałów były generowane przy użyciu biblioteki random Badania przeprowadzano dla kolejnych rozmiarów struktur: 16, 32, 64, 128, ..., z ograniczeniem maksymalnej liczby danych, które w tym przypadku wynosiło 1GB/4B Ilość powtórzeń wykonania każdej operacji to od 2500000 do 3000000 zależnie od struktury i operacji, podzielone przez rozmiar struktury, z minimalną liczbą operacji również zależną od struktury i operacji w przedziale od 10 do 1000 Otrzymanym wynikiem jest zmierzony czas podzielony przez ilość wykonanych operacji Czas wykonania operacji mierzony był przy użyciu biblioteki chrono przy pomocy funkcji std::chrono::high_resolution_clock Tablica oraz tablica na której zbudowano kopiec są realokowane przy usuwaniu i dodawaniu elementów, jednak w pomiarach kopca czas realokacji został pominięty Do testowania sposobu implementacji oraz badania złożoności obliczeniowej użyto odpowiednio dwóch różnych wersji kopca Heap oraz HeapNoRealloc, gdzie w wersji bez realokacji pamięci, operacje inne niż testowane mają niezdefiniowane działanie Page 7 of 42 Wykres 1 Zależność między l. elementów a czasem wstawiania na początek tablicy dla konkretnych przedziałów wartości Wyniki przedstawione powyżej dla wstawiania na początek tablicy zgadzają się z teorią, która mówi o liniowej zależności czasu wykonywania operacji od liczby elementów znajdujących się w strukturze. Brak zauważalnego wpływu wartości kluczy na czas wykonania operacji. Page 9 of 42 3.1. Wstawianie na środek Wstawianie na środek: l. elementów [16,~maxMem] 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 czas operacji dla konkretnych przedziałów wartości kluczy [10,100] [~INT_MAX/2] [~INT_MAX] [1,INT_MAX] 355 446 518 355 486 486 492 486 768 755 755 755 1280 1280 1280 1279 2304 2303 2304 2354 4518 4482 4404 4610 8396 8808 8399 9237 16512 17214 17215 16804 34432 33609 32791 35273 73409 70501 70498 68836 142177 139190 141414 141559 289697 276250 276250 263197 579210 539289 565868 526394 1132157 1105000 1105789 1105368 2666333 2777444 2777222 2720888 5625750 5499000 5625750 5625750 11001500 10810000 11065000 11001000 22510000 22003000 22004000 22490000 44507000 44520000 43506000 42491000 88011000 89006000 90013000 89510000 176037000 177017000 176513000 180750000 348044000 349820000 330526000 351045000 704180000 707090000 704604000 716908000 1386857000 1381449000 1421711000 1382202000 Tabela 2 Czas[ns] wstawiania na środek tablicy w zależności od l. elementów i wartości kluczy Page 10 of 42 3.1. Wstawianie na koniec Wstawianie na koniec: l. elementów [16,~maxMem] 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 czas operacji dla konkretnych przedziałów wartości kluczy [10,100] [~INT_MAX/2] [~INT_MAX] [1,INT_MAX] 296 381 307 307 403 403 396 396 576 563 563 588 921 921 947 921 1485 1638 1588 1587 2767 2970 2927 2969 5121 5739 5533 5881 10894 11464 11472 11488 22954 22600 21339 21693 45885 45452 45232 47593 84894 88986 101940 98703 203973 184407 197407 203684 407736 381605 381657 406023 842315 842947 790368 789631 1999555 1999555 1944111 2071111 3936500 4004250 4127750 4250750 8004000 8636000 7365000 8325550 16495000 16497000 17494000 16498000 32001000 31005000 31504000 34011000 63295000 66003000 66011000 67610000 128502000 123010000 132510000 128004000 257028000 253011000 264526000 246170000 500787000 522147000 502415000 521287000 1041788000 1025185000 1056554000 1029408000 Tabela 3 Czas[ns] wstawiania na koniec tablicy w zależności od l. elementów i wartości kluczy Page 12 of 42 Wykres 3 Zależność między l. elementów a czasem wstawiania na koniec tablicy dla konkretnych przedziałów wartości Wyniki przedstawione powyżej dla wstawiania na koniec tablicy zgadzają się z teorią, która mówi o liniowej zależności czasu wykonywania operacji od liczby elementów znajdujących się w strukturze. Zgodnie z założeniami w części teoretycznej czas wstawiania na koniec jest krótszy od wstawiania na początek oraz wstawiania na środek tablicy. Brak zauważalnego wpływu wartości kluczy na czas wykonania operacji Page 13 of 42 Wykres 4 Zależność między l. elementów a czasem usuwania z początku tablicy dla konkretnych przedziałów wartości Wyniki przedstawione powyżej dla usuwania z początku tablicy zgadzają się z teorią, która mówi o liniowej zależności czasu wykonywania operacji od liczby elementów znajdujących się w strukturze. Brak zauważalnego wpływu wartości kluczy na czas wykonania operacji, odstępstwo dla wartości z przedziału [10,100] spowodowane prawdopodobnie niedokładnością pomiaru dla największej możliwej liczby elementów. Page 15 of 42 3.1. Usuwanie z środka Usuwanie z środka: l. elementów [16,~maxMem] 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 czas operacji dla konkretnych przedziałów wartości kluczy [10,100] [~INT_MAX/2] [~INT_MAX] [1,INT_MAX] 252 246 246 246 396 384 390 396 691 652 652 665 1229 1203 1177 1178 2253 2303 2253 2201 4609 4199 4404 4403 9008 8293 8792 9501 17209 17619 18030 17209 35239 34419 35273 34431 72118 70452 70478 68865 134881 141467 138177 141453 282842 269842 282934 269960 539552 552710 565868 565868 1185157 1210736 1157789 1211473 2778111 2890888 2779888 2721777 5749250 5375750 5750750 5749500 11001500 11251500 11748000 11255500 23721000 23510000 22988000 22996000 46521000 45999000 47021000 45959000 90924000 87149000 91505000 81049000 185517000 191666000 183023000 184032000 351108000 367772000 389494000 366317000 732585000 706831000 712832000 740140000 1483496000 1525666000 1454264000 1472598000 Tabela 5 Czas[ns] usuwania z środka tablicy w zależności od l. elementów i wartości kluczy Page 16 of 42 3.1. Usuwanie z końca Usuwanie z końca: l. elementów [16,~maxMem] 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864 134217728 czas operacji dla konkretnych przedziałów wartości kluczy [10,100] [~INT_MAX/2] [~INT_MAX] [1,INT_MAX] 214 201 294 211 313 294 288 294 499 473 492 486 793 793 820 819 1591 1640 1360 1587 2715 2970 2970 2973 5528 5528 5823 5938 11321 11488 11067 11477 23773 22954 23773 24604 45862 44222 45865 45862 88875 95506 95407 91269 185907 184934 199013 184250 415263 368315 355289 407763 868263 762894 816000 789578 2113000 2111222 1889222 2111444 4375500 4377500 4004250 3873750 7743500 8248500 8247500 8247500 16997000 17010000 16008000 17013000 33498000 32005000 33011000 33496000 68001000 68001000 68016000 64502000 134024000 132023000 128024000 128024000 268244000 266814000 251367000 266029000 512503000 535566000 530689000 539562000 1058854000 1102192000 1056951000 1074462000 Tabela 6 Czas[ns] usuwania z końca tablicy w zależności od l. elementów i wartości kluczy Page 18 of 42 Wykres 6 Zależność między l. elementów a czasem usuwania z końca tablicy dla konkretnych przedziałów wartości Wyniki przedstawione powyżej dla usuwania z końca tablicy zgadzają się z teorią, która mówi o liniowej zależności czasu wykonywania operacji od liczby elementów znajdujących się w strukturze. Zgodnie z założeniami w części teoretycznej czas usuwania z końca jest krótszy od czasu usuwania z początku oraz z środka tablicy. Brak zauważalnego wpływu wartości kluczy na czas wykonania operacji. Page 19 of 42

Czy ten dokument był pomocny?
To jest dokument premium. Niektóre dokumenty na Studocu są premium. Przejdź na wersję premium, aby odblokować.

Sdizo - sprawozdanie - proj1

Kurs: Struktury danych i złoż. obl.1 (INEK00006Wcp)

6 Dokumenty
Studenci udostępnili 6 dokumentów w tym kursie
Czy ten dokument był pomocny?

To jest podgląd

Chcesz uzyskać pełny dostęp? Wykup pakiet Premium i odblokuj wszystkie strony :43
  • Uzyskaj dostęp do wszystkich dokumentów

  • Zdobądź nieograniczoną ilość pobrań

  • Popraw swoje oceny

Prześlij

Udostępnij dokumenty, aby odblokować

Masz już pakiet Premium?
Kajetan Parzyszek
Struktury Danych i
Złożoność
Obliczeniowa
Zadanie projektowe nr 1: Badanie efektywności operacji wstawiania,
usuwania oraz wyszukiwania w podstawowych strukturach danych
K P
04/04/2017

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.

Dlaczego treść niniejszej strony jest nieostra?

To dokument dla subskrybentów wersji Premium. Zostań subskrybentem wersji Premium, aby przeczytać cały dokument.