Przykładowe sprawozdanie. Jan Pustelnik

Podobne dokumenty
Wprowadzenie do złożoności obliczeniowej

Matematyczne Podstawy Informatyki

Sprawozdanie do 5. Projektu z Algorytmów i struktur danych 1

Projektowanie i Analiza Algorytmów

Analiza algorytmów zadania podstawowe

INFORMATYKA SORTOWANIE DANYCH.

Algorytmy i Struktury Danych.

Technologie Informacyjne

Wstęp do programowania

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Informatyka 1. Złożoność obliczeniowa

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Wykład 1 Wprowadzenie do algorytmów. Zawartość wykładu 1. Wstęp do algorytmów i struktur danych 2. Algorytmy z rozgałęzieniami.

Algorytmy i Struktury Danych, 2. ćwiczenia

. Podstawy Programowania 1. Sortowanie tablic jednowymiarowych. Arkadiusz Chrobot. 16 listopada 2016

Sortowanie przez wstawianie Insertion Sort

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Podstawy Programowania 1 Sortowanie tablic jednowymiarowych. Plan. Sortowanie. Sortowanie Rodzaje sortowania. Notatki. Notatki. Notatki.

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Podstawy Programowania. Złożoność obliczeniowa

Po wstawieniu tabeli (i zawsze wtedy, gdy w tabeli jest kursor) pojawia się na wstążce nowa grupa zakładek o nazwie Narzędzia tabel.

1. Analiza algorytmów przypomnienie

Sortowanie - wybrane algorytmy

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

PODSTAWY INFORMATYKI wykład 5.

Laboratorium nr 7 Sortowanie

Algorytmy i Struktury Danych. (c) Marcin Sydow. Sortowanie Selection Sort Insertion Sort Merge Sort. Sortowanie 1. Listy dowiązaniowe.

Sterowanie wielkością zamówienia w Excelu - cz. 3

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Struktury Danych i Złożoność Obliczeniowa

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

Algorytmy i struktury danych

AiSD zadanie trzecie

1. Znajdowanie miejsca zerowego funkcji metodą bisekcji.

Porównanie Heap Sort, Counting Sort, Shell Sort, Bubble Sort. Porównanie sortowao: HS, CS, Shs, BS

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Podstawy Programowania

Instytut Fizyki Politechniki Łódzkiej Laboratorium Metod Analizy Danych Doświadczalnych Ćwiczenie 3 Generator liczb losowych o rozkładzie Rayleigha.

Podstawy Informatyki. Sprawność algorytmów

Algorytm selekcji Hoare a. Łukasz Miemus

Wstęp. do języka C na procesor (kompilator RC51)

Algorytmy Komunikacyjne dla Trójwymiarowych Sieci Opartych na Plastrze Miodu. Ireneusz Szcześniak. Politechnika Śląska 20 czerwca 2002 r.

Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie)

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Sprawozdanie do zadania numer 2

Podstawy Programowania. Złożoność obliczeniowa

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

Programowanie Proceduralne

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Wstęp do programowania

Szablony funkcji i szablony klas

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Algorytmy sortujące. sortowanie kubełkowe, sortowanie grzebieniowe

Sortowanie przez wstawianie

Zaliczenie. Egzamin. lub. Wykład. Zaliczenie. Ćwiczenie. 3 zadania. Projekty. Ocena. Na ocenę

Zasady analizy algorytmów

Zadanie projektowe 1: Struktury danych i złożoność obliczeniowa

Algorytm i złożoność obliczeniowa algorytmu

Algorytmy równoległe: ocena efektywności prostych algorytmów dla systemów wielokomputerowych

Szablony funkcji i klas (templates)

Raport Hurtownie Danych

Struktury danych i złozoność obliczeniowa. Prof. dr hab. inż. Jan Magott

Języki i techniki programowania Ćwiczenia 2

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Algorytmy sortujące. Sortowanie bąbelkowe

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Wprowadzenie do szablonów szablony funkcji

Skalowalność obliczeń równoległych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Podstawy Programowania

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Analiza algorytmów zadania podstawowe

Wprowadzenie do szablonów szablony funkcji

Strategia "dziel i zwyciężaj"

Zadanie 2: Arytmetyka symboli


Równoległy algorytm wyznaczania bloków dla cyklicznego problemu przepływowego z przezbrojeniami

Część I. Uwaga: Akceptowane są wszystkie odpowiedzi merytorycznie poprawne i spełniające warunki zadania. Zadanie 1.1. (0 3)

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie

KONSPEKT ZAJĘĆ KOŁA INFORMATYCZNEGO LUB MATEMATYCZNEGO W KLASIE III GIMNAZJUM LUB I LICEUM ( 2 GODZ.)

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Maciej Piotr Jankowski

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Tworzenie oprogramowania

Algorytmy i Struktury Danych.

Jeszcze o algorytmach

Podstawy programowania. Podstawy C# Przykłady algorytmów

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

B3.5 Koncentracja. Raport pochodzi z portalu

Sortowanie w czasie liniowym

Algorytmy i struktury danych Matematyka III sem.

Algorytmy sortujące i wyszukujące

Spis treści. Rozdział 1. Aplikacje konsoli w stylu ANSI C i podstawowe operacje w Visual C

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI

QEMU działa na procesorach procesorach: emuluje procesory: dostępne dla s.o. hosta:

Sposoby wykrywania i usuwania błędów. Tomasz Borzyszkowski

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

Transkrypt:

Przykładowe sprawozdanie Jan Pustelnik 30 marca 2007

Rozdział 1 Sformułowanie problemu Tematem pracy jest porównanie wydajności trzech tradycyjnych metod sortowania: InsertionSort, SelectionSort i BubbleSort. Dla uproszczenia zakładamy tradycyjny model kosztu obliczeniowego, w którym dana jest maszyna o stałym czasie wykonywania operacji dodawania liczb całkowitych dowolnej długości. Parametrem zmiennym będzie liczba elementów tablicy wejściowej, oznaczana dalej literą n. Wszystkie trzy porównywane algorytmy charakteryzują się we wspomnianym powyżej modelu przeciętną złożonością obliczeniową O(n 2 ), przy czym stały współczynnik kryjący się za notacją O( ) jest różny dla wszystkich trzech metod. Dla celów poniżej prezentowanych badań jako język implementacji wybrano ISO C++, kompilacji dokonano kompilatorem gcc zaś architekturą dla której generowany był kod jest architektura x86.

Rozdział 2 Krótki opis porównywanych metod sortowania Wszystkie metody będą prezentowane zgodnie z [2]. Założono istnienie dwóch funkcji: exch i compexch, zdefiniowanych jak niżej: 1 // S e d g e w i c k, s t r. 242 template <typename Item> void exch ( Item &A, Item &B) { Item t = A; A = B ; 6 B = t ; template <typename Item> void compexch ( Item &A, Item &B) { 11 i f (B < A) exch (A, B) ; 2.1 InsertionSort Poniżej fragment kodu implementujący metodę sortowania przez wstawianie (ang. insertion sort) w języku C++. Metoda ta będzie uruchamiana przez większy fragment kodu (tzw. sterownik - driver lub rusztowanie - scaffolding). 1 // S e d g e w i c k s t r o n a 249 // w c i e c i a K&R template <typename Item> void i n s e r t i o n ( Item a [ ], int l, int r ) { 6 f o r ( int i = r ; i > 1 ; i ) compexch ( a [ i 1], a [ i ] ) ; f o r ( int i = l +2; i <= r ; ++i ) { int j = i ; Item v = a [ i ] ; 11 while ( v < a [ j 1]) { a [ j ] = a [ j 1 ] ; j ;

2.2. SELECTIONSORT 3 16 a [ j ] = v ; 2.2 SelectionSort Poniżej prezentowany jest fragment kodu implementujący w C++ metodę sortowania przez wybór (ang. selection sort). // S e d g e w i c k, s t r. 246 2 template <typename Item> void s e l e c t i o n ( Item a [ ], int l, int r ) { f o r ( int i = l ; i < r ; ++i ) { int min = i ; f o r ( int j = i + 1 ; j <= r ; ++j ) 7 i f ( a [ j ] < a [ min ] ) min = j ; exch ( a [ i ], a [ min ] ) ; 2.3 BubbleSort I wreszcie ostatni framgent kodu w C++ - implementacja metody sortowania bąbelkowego (ang. bubble sort). Ciekawą analizę tej metody sortowania wraz z propozycjami zwiększenia wydajności prezentuje [1] // S e d g e w i c k, s t r. 251 template <typename Item> void bubble ( Item a [ ], int l, int r ) { 4 f o r ( int i = l ; i < r ; ++i ) f o r ( i n j = r ; j > i ; j ) compexch ( a [ j 1], a [ j ] ) ;

Rozdział 3 Metodologia użyta w porównaniu W porównaniu użyto dosyć prostej metodologii. Porównano wybrane metody sortowania dla danych wejściowych o zmiennym rozmiarze n, gdzie n zmieniało się w zakresie od 0 do 2 10 5, przy czym użyto dwóch podzakresów: od 0 do 2 10 4, co 1000 (1 10 3 ) i od 0 do 2 10 5, co 10000 (1 10 4 ). Zastosowano również trzy różne rodzaje zbiorów wejściowych: zbiór losowy (rozkład jednostajny), zbiór odwrotnie uporządkowany (uporządkowany malejąco) i zbiór uporządkowany (uporządkowany rosnąco). Dla każdego rozmiaru n powtórzono pomiar 10-krotnie w celu wyeliminowania przypadkowych zaburzeń. Jest to szczególnie ważne dla danych losowych.

Rozdział 4 Kilka słów o użytych narzędziach Programy kompilowane były kompilatorem gcc z użyciem opcji -O2: $ gcc -v Using built-in specs. Target: i486-linux-gnu... gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5) Platformą wykonania był procesor Intel Dothan (Pentium M) 1.6 GHz, komputer zaopatrzony był w 1 GB pamięci RAM. Sprawozdanie przygotowano przy użyciu narzędzia L A TEX, wykresy przygotowano za pomocą narzędzia gnuplot.

Rozdział 5 Wyniki Na początek porównano wyniki dla róznych algorytmów sortowania, dla tego samego typu danych wejściowych o małym rozmiarze. Następnie przeanalizowano jak zachowuje się każdy z algorytmów dla różnego rodzaju danych wejściowych, znów o małym rozmiarze. 25 "insertion_random.dat" "selection_random.dat" "bubble_random.dat" 20 15 10 5 0 0 5000 10000 15000 20000 Rysunek 5.1: Dane losowe, trzy rózne algorytmy sortowania

7 10 9 "insertion_ordered.dat" "selection_ordered.dat" "bubble_ordered.dat" 8 7 6 5 4 3 2 1 0 0 5000 10000 15000 20000 Rysunek 5.2: Dane posortowane, trzy rózne algorytmy sortowania 20 18 "insertion_back.dat" "selection_back.dat" "bubble_back.dat" 16 14 12 10 8 6 4 2 0 0 5000 10000 15000 20000 Rysunek 5.3: Dane posortowane malejąco (odwrotnie), trzy rózne algorytmy sortowania

8 25 "bubble_random.dat" "bubble_ordered.dat" "bubble_back.dat" 20 15 10 5 0 0 5000 10000 15000 20000 Rysunek 5.4: Algorytm BubbleSort, różne dane 6 "insertion_random.dat" "insertion_ordered.dat" "insertion_back.dat" 5 4 3 2 1 0 0 5000 10000 15000 20000 Rysunek 5.5: Algorytm InsertionSort, różne dane

9 6 "selection_random.dat" "selection_ordered.dat" "selection_back.dat" 5 4 3 2 1 0 0 5000 10000 15000 20000 Rysunek 5.6: Algorytm SelectionSort, różne dane

Rozdział 6 Podsumowanie i wnioski Z zamieszczonych powyżej wykresów wyraźnie widać, że: Najwolniejszym z wszystkich algorytmów jest BubbleSort, najszybszym InsertionSort, przy czym w miarę wzrostu rozmiaru danych róznica między SelectionSort a InsertionSort rośnie zdecydowanie wolniej niż między BubbleSort a pozostałymi dwoma algorytmami BubbleSort najszybciej sortuje dane już posortowane (choć i tak zajmuje to sporo czasu), najwolniej dane uporządkowane losowo InsertionSort najlepiej radzi sobie z danymi uporządkowanymi - czas działania w tym wypadku wynosi praktycznie zero, najgorzej (co może dziwić jeśli nie przeczytaliśmy uważnie opisu algorytmu) - dane posortowane odwrotnie. dla SelectionSorta sposób uporządkowania danych nie ma znaczenia I od razu można sformułować pewną ogólną obserwację: nie należy raczej używać BubbleSorta (przynajmniej nie w podanej wyżej postaci), należy za to stosować InsertionSort (chyba, że mamy do dyspozycji coś lepszego), SelectionSort będzie interesujący, gdy ważnym kryterium będzie brak wrażliwości na rozkład danych (np. systemy czasu rzeczywistego!). Powyższe obserwacje warto byłoby potwierdzić próbą dla większych n-ów, ale już nie starczyło mi czasu - postaram się to zrobić w przyszłym tygodniu.

Bibliografia [1] Bentley, J., Perełki oprogramowania, WNT, Warszawa, rok nieznany [2] Sedgewick, R., Algorytmy w C++, ReadMe, Warszawa, 1999