Quick Sort, a Insert Sort
Transkrypt
Quick Sort, a Insert Sort
Podstawowe algorytmy w asemblerze Szymon Jagieła Bartłomiej Rupik Plan prezentacji Wstęp Proste algorytmy 1. 2. 1. 2. 3. Zaawansowane algorytmy 3. 1. 2. 4. Dane i tablice Instrukcja if Instrukcja while Linked-list Algorytmy sortowania Podsumowanie Wstęp Głównym celem prezentacji jest przedstawienie algorytmów, które mogę przyspieszyć działanie programu. Zostaną porównane rozwiązania z C przedstawione w kodzie assemblerowym, takie jak pętle, instrukcje warunkowe oraz bardziej zaawansowane algorytmy, jak lista oraz różne rodzaje sortowania Przykład 1: C: int x; char y, z[100]; Asm (NASM): x dw y db z db Deklaracja zmiennych b – typ 8 bitowej zmiennej w – typ 16 bitowej zmiennej 1 1 100 dup (?) dup (?) dup (?) Przykład 2 : C: y = x[i]; Asm: mov add mov mov bx,offset x bx,i ax,[bx] y,ax Operowanie na tablicach Offset x – zwraca przesunięcie danej, której nazwę podamy w nawiasach Przykład 3 : C: if(a cop b) { //s1… } else { //s2… } Asm: mov cmp cop ax,a ax,b l1 s1… jmp l2 l1: s2… l2: Instrukcje warunkowe cop – wszelkie operacje warunkowe s1,s2 – dowolny kod do wykonania w instrukcji warunkowej Tabela operacji warunkowych dostępnych w asemblerze Mnemonik Znaczenie Warunek skoku JC / JNC Jump if Carry / if Not Carry CF=1 / CF=0 JZ / JNZ Jumf if Zero / if Not Zero ZF=1 / ZF=0 JG Jump if Greater (A>B) ZF=0 oraz SF=OF JE Jump if Equal (A=B) ZF=1 JGE Jump if Greater or Equal (A>=B) SF=OF JL Jump if Less (A<B) SF<>OF JLE Jump if Less or Equal (A<=B) ZF=1 lub SF<>OF JA Jump if Above CF=0 oraz ZF=0 JAE Jump if Above or Equal CF=0 JB Jump if Below CF=1 JBE Jump if Below or Equal CF=1 lub ZF=1 Przykład 4 : C: while(a cop b) { //s1… Asm: l1: mov ax,a cmp ax,b cop l2 s1… jmp l1 l2: Pętla while cop – wszelkie operacje warunkowe s1 – dowolny kod do wykonania w pętli Algorytmy sortowania Insertion Sort – sortowanie przez wstawienie Quick Sort Insertion Sort + & Najprostszy algorytm sortowania Złożoność czasowa n^2 Wydajny dla wstępnie posortowanych Wydajny dla niewielkich zbiorów Stabilny Pseudokod 0. Insert_sort(A, n) 1. 2. 3. 4. 5. 6. 7. for i=2 to n : klucz = A[i] j=i-1 while j>0 and A[j]>klucz: A[j + 1] = A[j] j=j-1 A[j+1] = klucz Insertion Sort Insertion Sort DEMO TIME Quick Sort Popularny algorytm sortowania działający na zasadzie dziel i zwyciężaj Złożoność obliczeniowa n logn Quick Sort - pseudokod Quick Sort – How To Quick Sort DEMO TIME Porównanie algorytmów sortowania Insertion Sort w asm Czas wykonania 1.203s Insertion Sort w C/C++ Czas wykonania 1.03s Porównanie algorytmów sortowania Quick Sort w asm Czas wykonania 0.015s Quick Sort w C/C++ Korzystamy z funkcji qsort() Czas wykonania: 0.047s Std:sort() wykonywał się ponad 0.109s Porównanie algorytmów sortowania Quick Sort, a Insert Sort dla tablicy składającej się z 20000 elementów (liczby typu int) algorytm QuickSort jest znacznie szybszym rozwiązaniem. Czas wykonania dla algorytmu przez wstawianie to ponad 1s! Quick Sort tę samą tablicę sortuje w czasie 0.015s Lista jednokierunkowa Struktura danych służąca do reprezentacji zbiorów dynamicznych. Kolejne składniki struktury posiadają sekcję danych oraz wskaźnik, przechowujący położenie początku kolejnej sekcji danych w pamięci Cecha charakterystyczna – bezpośredni dostęp posiadamy tylko do pierwszego elementu Lista jednokierunkowa LAST DEMO TIME Podsumowanie W niniejszej przezentacji przedstawione zostały podstawowe oraz popularne algorytmy Dokonano ich porównania pomiędzy językami wysokiego oraz językami poziomu maszynowego W większości przypadków algorytmy napisane w asemblerze wykonywały się działać szybciej niż ich odpowiedniki w językach wyższego poziomu Dziękujemy za uwagę