12.07.2015 Views

slides - Unisinos

slides - Unisinos

slides - Unisinos

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Árvore Binária• O nó A é a raiz da árvore. Como B é a raiz da suasub-árvore esquerda dizemos que B é o filhoesquerdo de A, do mesmo modo, C é o filhodireito de A. Por isso A é o pai dos nós B e C e estesdois são irmãos.Afilho esquerdo de ABCfilho direito de ADEFG5


٩٦العربيالتراث.(٢).(٣).(١)الطبع،‏ وجزالة العبارة وفصاحة الكلمة.‏ وهكذا يمكن القول إن الشعر الحق عند ابن رشيق هو الشعرالمطبوع المصنوع في آن واحد يقول:‏ ‏"فالمطبوع هو الأصل الذي وضع أولا ً وعليه المدار.‏والمصنوع وإن وقع عليه هذا الاسم،‏ فليس متكلفا ً تكل ّف أشعار المولدين،‏ لكن وقع فيه هذا النوعالذي سموه صنعة من غير قصد ولا تعمل،‏ لكن بطباع القوم عفوا ً،‏ فاستحسنوه ومالوا إليه بعضالميل بعد أن عرفوا وجه اختياره على غيره"‏فابن رشيق يفهم الصنعة على هذا النحو الذي تبدو فيه تلقائية غير متعمدة وعكسها التكلف الذيرسم به أشعار المولدين،‏ فهو إذا ً أفضل من ابن قتيبة الذي لم يفرق بين الصنعة والتكل ّف.‏إلا أنه حين طبق كلامه هذا على الشعر لم يلتفت لحقيقة دور الصنعة أو الطبع في صياغةالتجربة الفنية صياغة خلاقة.‏ومن هنا نستطيع أن نقول إن ابن رشيق لم يفصل بين الطبع والصنعة فصلا ً كاملا ً،‏ بل احتفظبدرجة في العلاقة تتبدى في وقفاته التحليلية الطويلة عند بعض النصوص الشعرية كموقفه منقصيدة أبي ذؤيب الهذلي في رثاء ابنه"‏:א:א.أما دراسة ابن رشيق للأغراض البلاغية،‏ فلا زيادة فيها على من سبقه،‏ إلا أن باب التشبيه،‏جدير بالوقوف عنده خاصة،‏ فقد بدا كمن يحاول أن يخالف النزعة السائدة لمفهوم التشبيه في القرنالرابع.‏ قال معقبا ً على رأي قدامة ‏"وزعم قدامة أن أفضل التشبيه ما وقع بين شيئين اشتراكهما فيالصفات أكثر في انفرادهما،‏ حتى يدني بهما إلى حال الاتحاد،‏ وأنشد في ذلك وهو عند أفضلالتشبيه كافة:‏له أيطلا ظبيٍ‏ وساقا نعامة(٤)وإرخاء سِرحانٍ‏ وتقريب تتف ُلِ‏وهذا تشبيه أعضاء بأعضاء هي بعينها،‏ وأفعال بأفعال هي أيضا ً بعينها،‏ إلا أنها في حيوانمختلف"‏فقد يظهر للوهلة الأولى أنه يضع مقياسا ً مخالفا ً لما كان سائدا ً حتى قاعدة عمود الشعر عندالمرزوقي،‏ إذ أن الذي تردد دائما ً عند السابقين على ابن رشيق هو تفضيل تقارب طرفي التشبيه،‏حتى يكاد أحدهما أن يكون هو الآخر بعينه،‏ بينما عبارة ابن رشيق واضحة،‏ أن أحسن التشبيه ماقرب بين البعدين،‏ أو بعبارة أخرى فإن براعة الشاعر هي أن يعقد صلة تشابه بين المتباعدات.‏(1)(2)الحركة النقدية على أيام ابن رشيق المسيلي،‏ د.‏ بشير خلدون،‏ ص‎٢١١‎‏.‏العمدة،‏ ج‎١‎‏،‏ ص‎١٠٧‎‏.‏(3)العمدة،‏ ج‎١‎‏،‏ ص‎١٠٩‎‏.‏(4)العمدة،‏ ج‎٢‎‏،‏ ص‎٢٥٩‎‏.‏١٦٤


Estrutura de um HeapCom o último nível, éuma árvore binária completaIgnorando o último nível,o heap é uma árvore binária cheia10


Tipos de Heap• Dois tipos de heap (propriedades):• Máximo• MínimoHeap MáximoHeap Mínimo11


Heap Máximo• Para todo nó diferente da raiz,o pai é maior ou igual aos filhos:• A[i]>=FILHO_ESQ(I)• A[i]>=FILHO_DIR(I)• O maior elemento de um heap máximo estáarmazenado na raiz;• Uso do Heap Máximo em algoritmos declassificação como o HeapSort.12


Heap Mínimo• Para todo nó diferente da raiz,o pai é menor ou igual aos filhos:• A[i]


Altura de um Heap• Theorem: um heap que armazena n chaves tem alturaO(log n)• n = t n• O número total de nós em (t n ) em uma árvore binária cheia de altura hé:• t n =2 h -1• Assim, pela mesma fórmula podemos afirmar que, numa árvore bináriacompleta, a altura h de uma árvore é dada por:• h= log 2 (t n +1)14


InserçãoExemplo: inserção da chave “15”2a11) Coloca o novo nó no últimonível na posição mais aesquerda possívelSatisfaz condição de árvorebinária completa, mas nãoa condição de heap2) Tenta ordenar do novo nópara a raizChamado de up-heap bubblingou heapfy2b15


Inserção - complexidade12a1) Coloca o novo nó no últimonível na posição mais aesquerda possívelSatisfaz condição de árvorebinária completa, mas nãoa condição de heap2) Tenta ordenar do novo nópara a raiz2bPasso 1= O(1)Tn=O(log n)Passo 2= log n16


Exercício (1)• Insira a entrada (2,T) na árvore abaixo.A chave é 2. Mostre os passos daresolução.17


Remoção(raiz)12a81) Em um heap máximo, maiorchave encontra-se na raizTn=O(1)2) Substitui raiz pelo último nó11• No heap máximo,• se tem dois filhos, testa ordem com o filho de maior chave• No heap mínimo• testa ordem com o filho de menor chave2b3) HeapfyTn=O(log n)188


Exercício (2)• Faça a implementação do método deremoção do heap abaixo.19


Resumo das ComplexidadesMétodoTemposizeO(1)isEmptyO(1)minO(1)insert O(log n)removeMin O (log n)20


Representação• Um Heap pode ser representado por um arrayunidimensional.16RAIZ = 0.14 10PAI(i) = (i-1)/2FILHO_ESQUERDO(i) =return i*2 + 18 72 4 19 3FILHO_DIREITO(i) =return i*2 + 216 14 10 8 7 9 3 2 4 10 1 2 3 4 5 6 7 8 921


Classe Nodeclass Node {private int iData; // data item (key)// -------------------------------------------------------------public Node(int key) // constructor{iData = key;}// -------------------------------------------------------------public int getKey() {}return iData;// -------------------------------------------------------------public void setKey(int id) {iData = id;}// -------------------------------------------------------------} // end class Node22


Heap (1)class Heap {private Node[] heapArray;private int maxSize; // size of arrayprivate int currentSize; // number of nodes in arraypublic Heap(int mx) // constructor{maxSize = mx;currentSize = 0;heapArray = new Node[maxSize]; // create array}public boolean isEmpty() {}return currentSize == 0;23


Heap (2)public boolean insert(int key) {if (currentSize == maxSize)return false;Node newNode = new Node(key);heapArray[currentSize] = newNode;heapfyUp(currentSize++);return true;} // end insert()82 70 51 63 55 37 10 43 27 30 34 950 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1724


582AA5132B43BTemp371C2C95DD1


Heap (3)public void heapfyUp (int index) {int parent = (index - 1) / 2;Node temp= heapArray[index];while (index > 0} // end while&& heapArray[parent].getKey() < temp.getKey()) {heapArray[index] = heapArray[parent]; // move it downindex = parent;parent = (parent - 1) / 2;heapArray[index] = temp;} // end trickleUp()82 70 51 63 55 37 10 43 27 30 34 950 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1726


Heap (4)public Node remove() // delete item with max key{ // (assumes non-empty list)Node root = heapArray[0];heapArray[0] = heapArray[--currentSize];heapfyDown(0);return root;} // end remove()27


Heap (5)public void heapfyDown(int index) {int largerChild;Node top = heapArray[index]; // save rootwhile (index < currentSize / 2) // while node has at least one child{int leftChild = 2 * index + 1;int rightChild = leftChild + 1;// find larger childif (rightChild < currentSize && // (rightChild exists?)heapArray[leftChild].getKey() < heapArray[rightChild].getKey())largerChild = rightChild;elselargerChild = leftChild;// top >= largerChild?if (top.getKey() >= heapArray[largerChild].getKey())break;// shift child upheapArray[index] = heapArray[largerChild];index = largerChild; // go down} // end whileheapArray[index] = top; // root to index} // end trickleDown()28


Heap (6)public boolean change(int index, int newValue) {if (index < 0 || index >= currentSize)return false;int oldValue = heapArray[index].getKey(); // remember oldheapArray[index].setKey(newValue); // change to newif (oldValue < newValue) // if raised,heapfyUp(index); // trickle it upelse// if lowered,heapfyDown(index); // trickle it downreturn true;} // end change()29


Lembrando de fila de prioridade• Podemos usar uma filade prioridade paraordenar um conjuntode elementos• Insere os elementos comuma série de operaçõesinsert• Remove os elementos emordem com uma série deoperações removeMin• O tempo de execuçãodepende daimplementação de filade prioridade:• Com Listas: O(n 2 )• Com Heap: O(nlog(n))• Inserir todos os elementos:O(nlog(n))• Remover todos os elementos:O(nlog(n))O(nlog(n)) é muito melhor que O(n 2 )Algorithm PQ-Sort(S, C)Input sequence S, comparator Cfor the elements of SOutput sequence S sorted inincreasing order according to CP ← priority queue withcomparator Cwhile ¬S.isEmpty ()e ← S.remove (S. first ())P.insertItem(e, e)while ¬P.isEmpty()e ← P.removeMin()S.insertLast(e)30


Representação• Um Heap pode ser representado por um arrayunidimensional.16RAIZ = 0.14 10PAI(i) = (i-1)/2FILHO_ESQUERDO(i) =return i*2 + 18 72 4 19 3FILHO_DIREITO(i) =return i*2 + 216 14 10 8 7 9 3 2 4 10 1 2 3 4 5 6 7 8 931


Procedimentos sobre Heaps• Heapify• Garante a manutenção da propriedade deordem do Heap. Complexidade O(logn).• Build-Heap• Produz um heap a partir de um vetor nãoordenado. Complexidade O(n).• Heapsort• Procedimento de ordenação.Complexidade(nlogn).32


Max-heapfymaxHeapfy(A, 0, A.length)25public static void maxHeapfy (int a[], int i, int N) {int maior=i;int l = 2*i+1; // posicao do filho esquerdo de iint r = 2*i+2; // posicao do filho direito de iif (l < N && a[l]>a[i]) maior=l;if (r < N && a[r]>a[maior]) maior = r;if (maior!=i) {int T = a[i];a[i] = a[maior];a[maior] = T;maxHeapfy (a, maior, N);}}2512 2218 2209 18 10 1309 12 10 1333


Exercício 3• Usando o slide anterior como modelo,ilustre a operação deMAX-HEAPFY(A,2, A.length)sobre o arranjoA={27,17,3,16,13,10,1,5,7,12,4,8,9,0}34


HeapSort• Algoritmo de ordenação sofisticado;• Desenvolvido em 1964 por Robert W. Floyd (NewYork, USA) e J.W.J. Williams;• Consiste em um método de seleção em árvorebinária do tipo heap, de forma ordenada em relaçãoaos valores de suas chaves;• Consiste em duas fases:• Fase 1: construção do heap (build-Heap)• Fase 2: seleção dos elementos na ordem desejada (Heapsort)35


HeapSort• Fase 1: construindo o heap• a partir da estrutura de dados vista anteriormente, o passoseguinte consiste em trocar as chaves de posição no vetor,de forma que a árvore representada passe a ser um heap,ou seja, toda raiz de cada sub-árvore satisfaça as seguintescondições:A[Pai(i)] >= A[i]• os testes das chaves iniciam pela última subárvoreprosseguindo, a partir daí, para as subárvores queantecedem esta, até testar a raiz da árvore.Árvore representada pelo vetor C 1..7 36


HeapSort• Exemplo de construção doheap:• Seja o seguinte vetor dechaves:1209 1312 09 13 25 18 10 2225 18 10 2237


HeapSortTransformação da subárvore deraiz 13 em heap12 09 22 25 18 10 13Transformação da subárvore deraiz 09 em heap12 25 22 09 18 10 131209 2225 18 10 131225 2209 18 10 1338


HeapSortTransformação da subárvore deraiz 12 em heap25 12 22 09 18 10 13Rearranjo de uma subárvore donivel inferior. Agora, a árvore todaé um heap!25 18 22 09 12 10 132512 2209 18 10 132518 2209 12 10 133939


HeapSort• Fase 2: seleção doselementos na ordemdesejada• se a chave que está na raiz é amaior de todas, então suaposição definitiva correta, naordem crescente, é na últimaposição no vetor;• então, esta maior chave écolocada na última posição dovetor, por troca, com a chaveque ocupa aquela posição.25 18 22 09 12 10 1313 18 22 09 12 10 251318 2209 12 1040


HeapSortSeleção da segunda maior chave:22Colocação da segunda maior chaveem sua posição:18 1309 12 10(A árvore é novamente rearranjadap/ formar um heap)10 18 13 09 12 22 251018 1322 18 13 09 12 10 2509 1241


HeapSortSeleção da terceira maior chave:18Seleção da terceira maior chave:1810 1312 1309 12(A árvore é novamente rearranjadap/ formar um heap)09 10(A árvore é novamente rearranjadap/ formar um heap)18 10 13 09 12 22 2518 12 13 09 10 22 2542


HeapSortColocação da terceira maior chaveem sua posição:10 12 13 09 18 22 2510Seleção da quarta maior chave:1312 1012 13090913 12 10 09 18 22 2543


HeapSortColocação da quarta maior chaveem sua posição:9 12 10 13 18 22 259Seleção da quinta maior chaveem sua posição:129 1012 1012 9 10 13 18 22 2544


HeapSortColocação da quinta maior chaveem sua posição:Final do processo de classificação:9 10 12 13 18 22 2509 10 12 13 18 22 250910091045


HeapSort• Tanto no melhor como no pior caso, odesempenho do HeapSort é igual aO(nlog 2 n).46


Exercícios4.1 – Considerando o seguinte vetor:11 1 5 7 6 12 17 8 4 10 2a) Construa o heapb) Aplique o heapSort47


Algoritmo do livro do Cormenpublic static void heapSort(int a[]) {for (int k = a.length/2-1; k >= 0; k--) {maxHeapfy (a, k, a.length);}for (int N=a.length-1; N>=1; N--) { // troca de lugarint T = a[0];// o 1º elementoa[0] = a[N];// com o últimoa[N] = T;maxHeapfy (a, 0, N); // torna o vetor uma árvore heap}}// construção do heap48


public static void maxHeapfy (int a[], int i, int N) {int maior=i;int l = 2*i+1; // posicao do filho esquerdo de iint r = 2*i+2; // posicao do filho direito de iif (l < N && a[l]>a[i]) maior=l;if (r < N && a[r]>a[maior]) maior = r;if (maior!=i) {int T = a[i];a[i] = a[maior];a[maior] = T;maxHeapfy (a, maior, N);25}}12 2209 18 10 1349


Exercício (4)• Ilustre a operação de HEAPSORT sobreo arranjo A={5,13,2,25,7,17,20,8,4}.


Exercício (5)• Ilustre a operação de HEAPSORT sobreo arranjo A={2,5,16,4,10,23,39,18,26,15}.51


Bibliografia• Silberchatz, A; Korth, H. F., Sudarshan, S. Sistema deBanco de Dados. 3ª. Edição, Makron Books, 1999.• Lafore, Robert. Estruturas de Dados & Algoritmos emJava. Editora Ciência Moderna, 2004.• Lâminas do Prof. Alexandre Parra Carneiro da Silva.Métodos de Classificação por Seleção: HeapSort.52

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!