Pokročilá algoritmizace amortizovaná složitost, Fibonacciho halda, počítačová aritmetika

Podobné dokumenty
Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

TGH07 - Chytré stromové datové struktury

Číselné soustavy v mikroprocesorové technice Mikroprocesorová technika a embedded systémy

TGH07 - Chytré stromové datové struktury

Základní principy zobrazení čísla Celá čísla s pevnou řádovou čárkou Zobrazení reálných čísel Aritmetika s binárními čísly

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Architektury počítačů

Čísla v plovoucířádovéčárce. INP 2008 FIT VUT v Brně

Principy počítačů I Reprezentace dat

3 Jednoduché datové typy Interpretace čísel v paměti počítače Problémy s matematickými operacemi 5

ADT prioritní fronta. Haldy. Další operace nad haldou. Binární halda. Binomické stromy. Časová složitost jednotlivých operací.

Algoritmy I. Číselné soustavy přečíst!!! ALGI 2018/19

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

Mikroprocesorová technika (BMPT)

Fz =a z + a z +...+a z +a z =

v aritmetické jednotce počíta

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

LEKCE 6. Operátory. V této lekci najdete:

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Základní datové struktury III: Stromy, haldy

Dynamické datové struktury IV.

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Čísla a číselné soustavy.

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

E. Pohyblivářádováčárka

Informatika Datové formáty

1. Chyby vstupních dat metody převedení úlohy na numerickou (řád použité metody) zaokrouhlovací reprezentace čísel v počítači

IB111 Úvod do programování skrze Python

Datový typ prioritní fronta Semestrální práce z předmětu 36PT

TGH05 - Problém za milion dolarů.

Prioritní fronta, halda

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Stromy, haldy, prioritní fronty

C2115 Praktický úvod do superpočítání

Dynamické datové struktury III.

AVL stromy. pro každý uzel u stromu platí, že rozdíl mezi výškou jeho levého a pravého podstromu je nejvýše 1 stromy jsou samovyvažující

Aritmetické operace a obvody pro jejich realizaci

Datové typy a jejich reprezentace v počítači.

ČÍSELNÉ SOUSTAVY PŘEVODY

Algoritmy a datové struktury

Datové typy a struktury

VÝRAZY výrazy = operandy prokládané operátory, vyhodnocované podle priority operátorů

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Struktura a architektura počítačů (BI-SAP) 6

Algoritmizace a programování

Úvod do programování 7. hodina

Programování 3. hodina. RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

Algoritmy a datové struktury

Datové struktury Úvod

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Algoritmizace a programování

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

NPRG030 Programování I, 2018/19 1 / :25:37

Binární vyhledávací stromy pokročilé partie

Struktura a architektura počítačů (BI-SAP) 5

Struktura a architektura počítačů

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

Algoritmy na ohodnoceném grafu

Floating Point. Jak je reprezentovaný a proč někdy nefunguje. 2. června 2013

Algoritmy výpočetní geometrie

PJC Cvičení #2. Číselné soustavy a binární reprezentace proměnných

Red Black strom (Red Black Tree) Úvod do programování. Rotace. Red Black strom. Rotace. Rotace

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

PA152. Implementace databázových systémů

Programování v C++, 2. cvičení

Abstraktní datové typy FRONTA

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Elementární datové typy

Aplikovaná numerická matematika

Konstruktory a destruktory

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

REPREZENTACE DAT. Principy počítačů I. Literatura. Literály. Typy dat. Literály. Čísla Instrukce. Znaky. Logické hodnoty

Algoritmy I, složitost

Úloha 1 Spojte binární obrazy na obrázku s hodnotami, které reprezentují.

Programování v jazyce JavaScript

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Datové struktury 2: Rozptylovací tabulky

Binární Vyhledávací Stromy, u kterých je. složitost operací v nejhorším. rovná O(log n)

UNIVERZITA PARDUBICE. Fakulta elektrotechniky a informatiky. Vybrané problémy výpočtů na PC s pohyblivou řádovou čárkou Nomindalai Naranbaatar

Reprezentace dat. INP 2008 FIT VUT v Brně

TGH06 - Hledání nejkratší cesty

Základy algoritmizace c2005, 2007 Michal Krátký, Jiří Dvorský1/39

Přednáška 2: Čísla v počítači. Práce s počítačem. Číselné soustavy. Převody mezi soustavami. Aritmetické operace. Uložení čísel v paměti počítače

Volné stromy. Úvod do programování. Kořenové stromy a seřazené stromy. Volné stromy

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Poslední nenulová číslice faktoriálu

Předmět: Algoritmizace praktické aplikace

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Časová a prostorová složitost algoritmů

Struktura a architektura počítačů

5 Rekurze a zásobník. Rekurzivní volání metody

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Aritmetické operácie v rôznych číselných sústavách. Ľudmila MACEKOVÁ, KEMT-FEI-TUKE, sep. 2017

Transkript:

amortizovaná složitost, Fibonacciho halda, počítačová aritmetika Jiří Vyskočil, Marko Genyg-Berezovskyj 2009

Amortizovaná složitost Asymptotická složitost často dostatečně nevypovídá o složitosti algoritmů, které se spouštějí v sekvencích, a u kterých je jejich složitost proměnlivá, závislá na vnitřním stavu jejich datových struktur. Amortizovaná časová složitost je průměrný čas potřebný pro vykonání určité operace v sekvenci operací v nejhorším případě. Na rozdíl od časové složitosti v průměrném případě nevyužívá pravděpodobnosti. U amortizované složitosti je průměrný čas na operaci skutečně zaručený. Základní myšlenka amortizované složitosti spočívá v tom, že operace s nejhorší složitostí změní stav datové struktury algoritmu tak, že tento nejhorší případ nemůže nastávat příliš často, tudíž amortizuje svou cenu. 2 / 19

Amortizovaná složitost příklad Složitost vkládání prvků do tzv. dynamického pole. dynamického pole je pole, které zdvojnásobuje svou velikost pokaždé, když dojde k jeho naplnění. Samotné vkládání prvků (bez nutnosti realokace) vyžaduje čas O(1), pro N prvků tedy také O(N). V případě naplnění pole je nutná realokace. V nejhorším případě tato operace potřebuje čas až O(N). Pro vložení N prvků (včetně realokace) je tedy potřeba v nejhorším případě O(N) + O(N) = O(N). Amortizovaný čas na jedno vložení prvku je pak O(N)/N = O(1). 3 / 19

Fibonacciho halda Fibonacciho halda je druh haldy, který Principiálně vychází z binomiální haldy. Hlavní výhodou Fibonacciho haldy je nízká asymptotická složitost prováděných algoritmů. Operace Insert, AccessMin a Merge probíhají v O(1). Operace DecreaseKey probíhá v amortizovaném konstantním čase. Operace Delete a DeleteMin pracují s amortizovanou časovou složitostí O(log(n)). Užití Fibonacciho haldy není vhodné pro real-time systémy, protože některé operace mohou mít v nejhorším případě lineární složitost. 4 / 19

Fibonacciho halda Fibonacciho haldu tvoří skupina stromů vyhovující lokální podmínce na uspořádání haldy, která vyžaduje, aby pro každý uzel stromu platilo, že prvek, který reprezentuje, je menší než prvek reprezentovaný jeho potomky. Z této podmínky vyplývá, že minimálním prvkem je vždy kořen jednoho ze stromů. Vnitřní struktura Fibonacciho haldy je v porovnání s binomiální haldou daleko více flexibilní. Jednotlivé stromy nemají pevně daný tvar a v extrémním případě může každý prvek haldy tvořit izolovaný strom nebo naopak všechny prvky mohou být součástí jediného stromu hloubky N. Tato flexibilní struktura umožňuje velmi jednoduchou implementaci operací s haldou. Operace, které nejsou potřebné, odkládáme a vykonáváme je až v okamžiku, kdy je to nevyhnutelné, například spojení nebo vložení nového prvku se jednoduše provede spojením kořenových seznamů (s konstantní náročností) a jednotlivé stromy spojíme až při operaci snížení hodnoty klíče. 5 / 19

Fibonacciho halda každý vrchol má nejvýše log(n) synů a velikost stromu řádu k je nejméně F k +2, kde F k je k -té Fibonacciho číslo. Kořen každého stromu řádu k má právě k potomků. F n = 0, pro n = 0; 1, pro n = 1; F n 2 + F n 1 jinak. Toto je dosaženo díky pravidlu, které dovoluje oříznout nejvýše jednoho syna od každého nekořenového prvku. Pokud je odříznut druhý syn, vrchol musí být odříznut od svého otce a stává se kořenem nového stromu. Počet stromů je snižován při operaci DeleteMin, kdy dochází ke spojování stromů. 6 / 19

Fibonacciho halda - reprezentace Jednotlivé stromy haldy jsou propojeny dvojitým kruhovým spojovým seznamem. MIN 7 / 19

Fibonacciho halda - reprezentace N je aktuální počet prvků v haldě. MIN je ukazatel na strom jehož kořen obsahuje minimální prvek haldy key(x) je hodnota klíče vrcholu x. mark(x) je boolovská hodnota vrcholu x. Je to pomocná značka pro odebírání vrcholů. Pokud je nastavena na true nesmíme již žádného potomka x ze stromu odebírat. descendants(x) vrací všechny potomky x. parent(x) vrací rodiče x. Pro prvek x, který nemá rodiče vrací x. 8 / 19

Fibonacciho halda - Merge, Insert Merge (H 1, H 2 ) Propojí oba dvojité kruhové seznamy do jednoho a updatuje ukazatel na MIN. O(1) AccessMin Vrátí prvek reprezentovaný kořenem stromu, na nějž ukazuje MIN ukazatel. O(1) Insert (x) Vytvoří se strom řádu 0, tedy jediný vrchol reprezentující přidávaný prvek x. Z tohoto stromu vytvoří Fibonacciho haldu. Nastaví mark(x ) na false. Poté se zavolá Merge na obě haldy. O(1) 9 / 19

Fibonacciho halda - DeleteMin DeleteMin 1. z = MIN; 2. if z null then { 3. for each x descendants(z) do 4. Vlož x do spojového seznamu stromů haldy; 5. Vyjmi z ze spojového seznamu stromů haldy; 6. if N = 1 then 7. MIN = null 8. else { 9. MIN = ukazatel na libovolný kořen stromu v haldě; 10. Konsolidace; 11. } 12. N--; 13. } 10 / 19

Fibonacciho halda - Konsolidace Konsolidace 1. for i = 0 to max. možný řád stromu ve Fibonacciho haldě velikosti N do A[i] = null; 2. for each s všechny stromy v haldě do { 3. x = umístění kořene s; d = řád stromu s; 4. while A[d] null do { 5. y = A[d]; 6. if key(x) > key(y) then prohoď x a y; 7. Vyjmi y z haldy a připoj toto y k vrcholu x jako potomka; 8. mark(y) = false; A[d] = null; d++; 9. } 10. A[d] = x; 11. } 12. MIN = null; 13. for i = 0 to max. řád stromu v poli A do 14. if A[i] null then { 15. vlož A[i] do spojového seznamu stromů haldy; 16. If (MIN = null) or (key(a[i]) < key(min)) then MIN = A[i]; 17. } 11 / 19

Fibonacciho halda - DecreaseKey, Delete DecreaseKey (x,d) 1. key(x) = key(x) d; 2. y = parent(x); 3. if (x y) and (key(x) < key(y)) then { 4. Řez(x,y); 5. KaskádovýŘez(y); 6. } 7. If key(x) < key(min) then MIN = x; Delete(x) 1. Pomocí DecreaseKey(x, ) snížíme hodnotu x na - ; 2. DeleteMin; Řez(x,y) 8. Odřízni podstrom x z potomků y; 9. Vlož x do spojového seznamu haldy; 10. mark(x) = false; KaskádovýŘez(y) 1. z = parent(y); 2. if (y z) then 3. if mark(y) = false then mark(y) = true 4. else { 5. Řez(y,z); 6. KaskádovýŘez(z); 7. } 12 / 19

Haldy - shrnutí binární halda d-regulární halda binomiální halda AccessMin O(1) O(1) O(1) O(1) DeleteMin O(log(n)) O(log(n)) O(log(n)) Insert O(log(n)) O(log(n)) O(log(n)) amortizovaně: O(1) Delete O(log(n)) O(log(n)) O(log(n)) Fibonacciho halda O(n) amortizovaně: O(log(n)) O(1) Merge O(n) O(n) O(log(n)) O(1) DecreaseKey O(log(n)) O(log(n)) O(log(n)) O(n) amortizovaně: O(log(n)) O(log(n)) amortizovaně: O(1) 13 / 19

Reprezentace přirozených čísel Nejčastější reprezentací přirozených čísel v počítači je číslo v binární soustavě: hodnota čísla = kde n je počet bitů čísla a b i je hodnota i-tého bitu. Často se ještě používá tzv. BCD (Binary Coded Decimal) notace, která kóduje číslo v desítkové soustavě po jednotlivých číslicích jako čtveřicích bitů (nibblů). není tak efektivní (všechny možné kombinace čtveřice bitů nejsou využity) často se používá v bankovních aplikacích, protože přesně koresponduje s desítkovou soustavou. n i=0 b i 2 i 14 / 19

Reprezentace celých čísel Doplňková reprezentace (nejčastější): hodnota čísla N = n 1 b i 2 i i=0 n 1 1 (1 b i ) 2 i i=0 pro b n = 0, tedy N 0; 2 n 1 1 pro b n = 1, tedy N 2 n 1 ; 1 Na operace sčítání a odčítání lze použít stejné algoritmy jako u předchozí binární reprezentace přirozených čísel. Znaménko +/- lze zjistit z nejvyššího bitu. V reprezentaci je pouze jedna nula. 15 / 19

Reprezentace čísel s pohyblivou řádovou čárkou reprezentace: s c be bp 1 kde s je signum (znaménko +/-) c je mantisa (fraction) b je základ (base) číselné soustavy (nejčastěji 2 nebo 10) p je přesnost mantisy (počet číslic mantisy) e je celočíselný exponent Do tohoto formátu bychom ještě chtěli zakódovat + a -. Pokud je b=2 (nejčastější případ) dochází při zpracování vstupů a výstupů k některým problémům způsobeným konverzí z/do desítkové soustavy. 16 / 19

Reprezentace čísel s pohyblivou řádovou čárkou Reprezentace podle IEEE 754: význam exponent fraction +/- nula 0 0 denormalizovaná čísla 0 nenulový normalizovaná čísla 1 až 2 e - 2 cokoliv +/- 2 e - 1 0 NaN (Not a Number) 2 e - 1 nenulový Normalizovaná hodnota: Hodnota = (-1) sign 2 exponent-exponent bias (1.fraction) Denormalizovaná hodnota: Hodnota = (-1) sign 2 exponent-exponent bias+1 (0.fraction) 17 / 19

Reprezentace čísel s pohyblivou řádovou čárkou Reprezentace podle IEEE 754: NaN (Not a Number) se používá k reprezentaci čísel, která byla výsledkem aritmetických operací s nestandardními vstupy: všechny aritmetické operace s NaN jako s alespoň jedním operandem výsledek dělení: 0/0, /, /-, - / a - /- výsledek násobení: 0 a 0 - výsledek sčítání: + (- ), (- ) + a k němu odpovídající odčítání. aplikace argumentu funkce mimo svou doménu: druhá odmocnina záporného čísla logaritmus záporného čísla trigonometrické funkce NaN se ještě rozlišuje na Quiet (většinou nevyvolávají výjimky) a Signalling (většinou vyvolávají výjimky (přetečení, podtečení)). 18 / 19

Platí: Rozdíly počítačové a standardní aritmetiky 1 x = x x y = y x x + x = 2 x Obecně nemusí platit x (1/x) = 1 (1 + x) 1 = x (x + y) + z = x + (y + z) Častou chybou bývá přičítání např. jedničky ve floatu v cyklu s podmínkou ukončení na rovnost libovolného čísla nebo nerovnost u velkých čísel. Cyklus se pak typicky nezastaví. 19 / 19