Realizacja algorytmu przez komputer Wstęp do informatyki Wykład UniwersytetWrocławski 0 Tydzień temu: opis algorytmu w języku zrozumiałym dla człowieka: schemat blokowy, pseudokod. Dziś: schemat logiczny komputera; zapis algorytmu w formie umożliwiającej wykona go przez komputer; Schemat logiczny komputera urządzenia ( układy ) wejścia i wyjścia: komunikacja ze światem procesor: przetwarza informacje (wykonuje instrukcje), steruje pozostałymi elementami pamięć: przechowuje informacje (dane i programy) magistrale komunikacyjne: łączą pozostałe elementy Maszyna RAM taśma wejściowa: ciąg liczb całkowitych taśma wyjściowa : ciąg liczb całkowitych, wypisywanych przez program procesor: wykonuje instrukcje pamięć: komórki 0,,,,; przechowują liczby całkowite Komórka 0: akumulator program: ciąg instrukcji do wykonania licznik rozkazów: wskazuje na instrukcję, która aktual powinna być wykonana Maszyna RAM taśma wejściowa RAM: szczegóły Pamięć: skończona liczba komórek etykietowanych 0,,,.. Komórka 0 nazywana rejestrem lub akumulatorem Każda komórka może przechowywać dowolną liczbę całkowitą Taśma wejściowa i wyjściowa to urządzenia sekwencyjne: taśma wejściowa: dane dla programu (wejście) taśma wyjściowa: wyniki programu (wyjście) Urządze sekwencyjne: program przemieszcza się tylko w jednym kierunku, zawsze do następnej pozycji; każdy element czytany tylko jeden raz; taśma wyjściowa
RAM: cykl główny procesora Pobierz instrukcję do wykonania wskazywaną przez licznik rozkazów Pobierz argumenty instrukcji do wykonania Wykonaj instrukcję Uaktualnij licznik rozkazów (o ile został zmieniny przez instrukcję) Wykona programu Powtarzaj cykl główny procesora aż do momentu gdy: Licznik rozkazów wskazuje na żadną instrukcję LUB Wykonana została instrukcja HALT RAM: instrukcje Składnia: <etykieta> <instrukcja> <argument> Instrukcje wejścia/wyjścia: Read Write Czyta kolejną liczbę z taśmy wejściowej Wypisuje liczbę na końcu taśmy wyjściowej Przesła do / z akumulatora: Load Store Prześlij do akumulatora Prześlij zawartość akumulatora do innej komórki Instrukcje arytmetyczne: Add Sub Mult Div RAM: instrukcje cd Dodaj zawartość akumulatora i argument Od akumulatora odejmij argument Pomnóż zawartość akumulatora przez argument Podziel zawartość akumulatora przez argument (wynik zakrąglony w dół) Rezultat jest zawsze umieszczany w akumulatorze. RAM: instrukcje cd RAM: argumenty Halt: zakończ działa programu Uwaga: halt jest koczne, Jeśli licznik rozkazów wskazuje na pozycję zawierającążadnej instrukcji, program rówż się zatrzymuje. Argument liczba = liczba ^ liczba etykieta Znacze zawartość komórki o numerze liczba wartość liczba adresow pośred: zawartość komórki, której numer znajduje się w komórce o numerze liczba etykieta instrukcji
Argumenty instrukcji: przykład load : zawartość komórki numer pobierz (skopiuj) do akumulatora load =: umieść liczbę w akumulatorze load ^: do akumulatora pobierz (skopiuj) zawartość komórki, której numer znajduje się w komórce Argumenty instrukcji: przykład div : podziel zawartość akumulatora przez zawartość komórki numer div =: podziel zawartość akumulatora przez liczbę div ^: podziel zawartość akumulatora przez zawartość komórki, której numer znajduje się w komórce WYNIK jest zawsze umieszczany w akumulatorze! Argumenty instrukcji: przykład Komórka 0 4 6 7 Wartość 90 Instrukcja div div = div ^ Nowa wartość komórki 0 0 (90/) 8 (90/) 6 (90/) Kod RAM: przykład Wejście: a, b liczby Wyjście: a + b Read a, b c a+b write c Start Stop Skojarze z komórkami pamięci: a b c Translacja na kod RAM: Read Read Load Add Store Write Halt Jump Jzero Jgtz Instrukcje RAM: skoki Skok bezwarunkowy Skok pod warunkiem, że w akumulatorze znajduje się zero Skok pod warunkiem, że w akumulatorze znajduje się liczba większa od zera Argument: etykieta instrukcji Etykieta: napis umieszczony z lewej strony instrukcji ( jest wymagana). RAM przykład: maksimum z dwóch liczb Wejście: a, b liczby Wyjście: maksimum liczb a, b Czytaj a, b a-b>0 Wypisz b Wypisz a et Skojarze: a b Ćwicze. uzupełnij powyższy schemat o bloki Start i Stop. READ READ LOAD SUB JGTZ et WRITE HALT et WRITE HALT
Translacja schematu blokowego na kod RAM Skojarz zmienne z komórkami pamięci Translacja każdego bloku schematu blokowego osob! Zaznacz instrukcje odpowiadające każdemu blokowi! Przekształć warunki sprawdzane w schemacie blokowym do jednej z postaci wyraze = 0 wyraze > 0 Używaj skoków aby zmienić odpowiednio licznik rozkazów (przejść do odpowiedgo fragmentu programu). Skojarzona z komórką j Schemat blokowy kod RAM x <expr> + <expr> oblicz <expr>, zachowaj w pewnej komórce i oblicz <expr>, wynik masz w akumulatorze! dodaj <expr> do <expr>: add i zachowaj wynik w komórce j: store j et Schemat blokowy RAM <expr> = 0 et oblicz <expr>, wynik masz w akumulatorze; wykonaj skok warunkowy: jzero et Kod odpowiadający podaj pod instrukcją skoku et <expr> jzero et et jump et et jump et et Suma ciągu liczb Wejście: ciąg liczb zakończony zerem! Wyjście: suma wszystkich liczb w ciągu loop s s + a Start s 0 Read a a=0 etkon Write s Stop loop s s + a s 0 Suma ciągu liczb, cd Start Read a a=0 etkon Write s Skojarzenia komórek i zmiennych: a s Stop load =0 store loop read load JZERO etkon load add store jump loop etkon write Suma ciągu liczb złożość czasowa Rozmiar danych: n liczba elementów do zsumowania (bez ostatgo zera) Złożość schematu blokowego: + n + = n + 4 Złożość programu w kodzie RAM: + 7n + 4 = 7n + 6 Która złożość poprawna? 4
Złożość asymptotyczna Notacja dużego O : igrujemy stałe zależne od zapisu algorytmu / modelu obliczeń; np., 0n, n+7, n są podobne (funkcje liniowe); Lecz 00n and n istot się różnią! Pyt.: Która z nich jest większa? Odp.: n Pyt.: Dlaczego? A: Szybciej roś! Złożość asymptotyczna Notacja dużego O formal: f(n) = O(g(n)) wtedy i tylko wtedy gdy (wtw) istje stała c>0 i liczba naturalna m>0 ie, że f(n) c g(n) dla każdego n>m. Złożość asymptotyczna - intuicja f(n) = O(g(n)) Złożość asymptotyczna przykłady 00 n = O(n ), gdyż 00 n 00 n dla każdego n>0. wtw g(n) roś co najmj samo szybko jak f(n) gdy n n +00n-0 = O(n ), gdyż n +00n-0 7 n dla każdego n>60. n =O( n ), gdyż n n dla każdego n>. [jak to pokazać?] Złożość asymptotyczna przykłady n / 000 O(n), gdyż dla każdego c>0 mamy: n / 000 > c n dla skończe wielu n. W szczególści, rówść n / 000 > c n zachodzi dla każdego n spełniającego n > 000 max(c,). Złożość asymptotyczna przykłady 00 n = O(n) 00 n = O(n ) n / 000 O(n) 77 n+ = O(n) n +00n-0 = O(n ) n +00n-0 = O(n ) n +00n-0 O(n) n =O( n ) n O(n )
Suma ciągu liczb złożość czasowa Rozmiar danych: n liczba elementów do zsumowania (bez ostatgo zera) Złożość schematu blokowego: + n + = n + 4 Złożość programu w kodzie RAM: + 7n + 4 = 7n + 6 Złożość asymptotyczna: O( n ) Problem Wejście: n liczba naturalna; a,a,...,a n ciąg liczb naturalnych z przedziału [0,9] Wyjście: elementy a,a,...,a n wypisane w porządku malejącym Przykład Wejście: ; 0, 7, 9, 9,,, 6, 7, 6,, Wyjście: 0,,,,, 6, 6, 7, 7, 9, 9 Algorytm Nadaj licznikom K 0,,K 9 wartość zero. Wczytaj n Dla i=,,,n powtarzaj: Wczytaj a K a K a + Dla i=0,,,,9 powtarzaj: Powtórz K i razy: Wypisz i Zamiast K i używamy zmiennej złożonej K o elementach K[0],,K[9]: elementy K[0],,K[9] tego samego typu; indeksowane kolejnymi liczbami naturalnymi K tablica (p. tablice w Ansi C) Implementacja K[0],,K[9] sąsied komórki pamięci licznik: zlicza liczbę wystąpień pewnego zdarzenia Wstaw 0 do K[0]..K[9] wczytaj n i n i = 0? wczytaj a 4 j 0 7 Skojarzenia: K[0]..K[9]: komórki..4 n : C i : C a : C4 j : C Uwaga: komórkę C i będziemy też oznaczać przez C[i] Assign 0 to C[]..C[4] read C C C C = 0? read C4 4 C 0 7 Skojarzenia: K[0]..K[9]: C[]..C[4] n : C i : C a : C4 j : C Uwaga: komórkę C i będziemy też oznaczać przez C[i] K[a] K[a]+ j > 9? 8 C[C4+] C[C4+]+ C > 9? 8 6 i i- Powtórz K[j] razy: wypisz j 6 C C- Repeat C[C+] times: write C Stop j j + 0 9 The end C C + 0 9 6
Assign 0 to C[]..C[4] b C6 4 C6< C[C6] 0 C6 C6- a c d load =4 #a store 6 Lb: load = #b sub 6 jgtz l load =0 #c store ^6 load 6 #d sub = store 6 jump Lb C[C4+] C[C4+]+ load 4 # add = store 7 load ^7 add = store ^7 ogólj 9 Repeat C[C+] times: C7 C+ write C C8 C[C7] load #9a add = store 7 load ^7 store 8 L9b: load 8 #9b jgtz L9c jump L0 L9c: write #9c load 8 #9d sub = store 8 jump L9b 9b C8>0 Write C C8 C8-9a 9c 9d 0 Problem Wejście: n liczba naturalna; a,a,...,a n ciąg liczb całkowitych z zakresu [0,k], k<n. Wyjście: elementy ciągu a,a,...,a n wypisane w porządku malejących Rozwiąza Zamiast tablicy rozmiaru 0, użyj tablicy rozmiaru k. złożość Rozmiar danych: n? n + k? Pamięć: proporcjonalna do k, czyli O( k ) Czas: proporcjonalny do n+k, czyli O( n+k ) : gdy n > k: O( n + k ) = O( n ) gdy n k: O( n + k ) = O( k ) złożość Czas: proporcjonalny do n+k, czyli O( n+k ) : gdy n > k: O( n + k ) = O( n ) gdy n k: O( n + k ) = O( k ) Uwaga Jeśli k>>n: potrzebujemy większej pamięci niż długość ciągu! czas obliczeń proporcjonalny do k, czyli znacz większy od n (czy i algorytm jest praktyczny?). 7
Podsumowa.Maszyna RAM model komputera: Zmienna liczbowa komórka w pamięci Operacje arytmetyczne wykonaj operację na akumulatorze i (ewentual) zawartości innej komórki Cykl główny procesora Pętle skoki licznik rozkazów..adresowa pośred i jego zastosowania!.notacja asymptotyczna w szacowaniu złożości 4.Problem sortowania; sortowa przez zlicza: jak działa? kiedy przydatne? 8