AED 2004/2005: Difference between revisions

From Wiki**3

No edit summary
 
No edit summary
 
(52 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Aula 30: Árvores Binárias ==
{{TOCright}}
== Aulas 1 a 3: Apresentação; Introdução ao C ==


Algoritmos sobre árvores binárias de procura (BSTs): inserção na raiz; junção de árvores; remoção de um elemento (na raiz). Discussão de aspectos de organização e eficiência; discussão de aspectos relacionados com os processos recursivos.
Apresentação da disciplina. Apresentação do programa e do método de avaliação.


== Aula 29: Árvores Binárias ==
=== Conceitos básicos de C ===
Instrodução ao ANSI C. Exemplo de programa: hello world. Tipos básicos e aspectos relacionados. Declarações de constantes e variáveis.


Travessias: algoritmos não recursivos: "pre-order" e "level-order". Discussão: algoritmos recursivos vs. iterativos. Árvores binárias de procura (BSTs - binary search trees). Métodos de construção, de procura e de inserção. Operações de rotação à esquerda e à direita. ADT para tabela de símbolos: implementação baseada em BSTs. Apresentação e discussão de implementações dos algoritmos de inserção e procura.
=== Constantes e Operadores ===
Literais em C. Caracteres e cadeias de caracteres: organização em memória. Operadores aritméticos, lógicos e relacionais. Operadores de atribuição. Exemplos. Discussão de problemas.


== Aula 28: Introdução às Árvores Binárias ==
== Aulas 4 a 6: Controlo de Fluxo; Funções; Programas ==


Anatomia de uma árvore: nós internos e externos; nós vs. folhas. "Rooted trees" vs. "free trees". Árvores genéricas: exemplos. Introdução às árvores binárias: definição de árvore binária; implementação vs. conceito. Estruturas de suporte à implementação de árvores binárias. Algoritmos básicos com árvores: contagem de nós e cálculo da altura de uma árvore. Travessias recursivas: "pre-order", "in-order", "post-order".
Revisões sobre tipos básicos e matéria associada. Revisões sobre operadores. Operador condicional. Ordem de execução. Conversão de tipos implícita e explícita. Discussão de aspectos associados. Controlo de fluxo em programas: instruções e blocos. if e if/else.


== Aula 27: ADTs de 1ª ordem ==
Controlo de execução em C: ciclos while, for, do/while. Exemplos. Comparação entre ciclos while e ciclos for. Interrupção do desenrolar normal de um ciclo: break e continue. Análise de comportamento nos diferentes ciclos. Funções em C: estrutura geral de uma função. Argumentos e retorno. Exemplos simples: função pop para uma [[Pilha de Inteiros (versão simples)|pilha de inteiros]].


Tipos de dados de primeira ordem: motivação. Exemplo de tipo de dados de 1ª ordem: números complexos. Reescrita como ADT de 1ª ordem. Justificação para o procedimento. Exemplos de ADTs de primeira ordem: FIFO; fila de prioridade com base em amontoado.
Funções e módulos. Compilação separada. Utilização do pré-processador de C. Visibilidade de variáveis e funções. O uso de static. Exemplos de funções e módulos. Exemplos de funções simples: [[Leitura de Caracteres (programa em C)|leitura interactiva de caracteres]]. Aplicação de switch.


== Aula 26: Tipos de Dados Abstractos (ADTs) ==
== Aulas 7 a 11: Ponteiros e Gestão de Memória ==


Tipos de dados abstractos: interface, implementação, cliente, item. Motivação para o uso de ADTs. Exemplos de ADTs: pilha; fila de prioridades; fila simples (FIFO) com base em vector e em lista ligada. Exemplos de clientes.
Introdução ao uso de ponteiros em C: ponteiros e endereços; ponteiros e vectores/tabelas. Notação (introdução ao uso dos operadores * e &). [[Strings vs. Vectores de Caracteres|Vectores de caracteres]]. Organização da memória. Apresentação e discussão de exemplos.


== Aula 25: Introdução à análise de algoritmos ==
Ponteiros e vectores: semelhanças e diferenças. Aritmética de ponteiros. Conversão de ponteiros. Passagem de ponteiros e vectores como argumentos de funções. Apresentação e discussão de exemplos.


Introdução à análise de algoritmos. Crescimento de funções. Notação assimptótica ("notação O"). Comportamentos em várias situações: média, pior caso e melhor caso. Recorrências. Apresentação e discussão de exemplos.
Matrizes em C. Acesso multidimensional. Diferenças entre matrizes, vectores e ponteiros: organização da memória. Passagem de argumentos por referência. Gestão de memória dinâmica utilizando malloc e free. Apresentação e discussão de exemplos.


== Aulas 19 a 24: Estruturas de Dados Elementares ==
Apresentação e discussão de [[Gestão de Memória (exemplo com pilha)|exemplo prático de gestão de memória]]. [[Pilha de Strings (controlo de falha)|Pilha de strings]].


Introdução às estruturas de dados. Estruturas de dados elementares: vectores, listas (simplesmente e duplamente ligadas). Uso de sentinelas. Apresentação e discussão de exemplos.
Ponteiros para funções. Apresentação e discussão de exemplo de utilização: algoritmo de procura binária parametrizado com comparador.


Vectores e listas. Algoritmos e dependência da estrutura de dados. Apresentação de ordenação por inserção (isort) com vector e lista ligada sem sentinela. Discussão de aspectos relacionados com as soluções.
== Aulas 12 a 15: Estruturas em C ==


Discussão de aspectos relacionados com o uso de sentinelas numa versão de ordenação por inserção (isort) numa lista ligada. Árvores binárias completas, equilibradas e completamente preenchidas: organização de elementos. Amontoados: propriedades e organização de dados. Algoritmos de fixUp e fixDown. Inserção e remoção de elementos em/de um amontoado. Discussão de aspectos de eficiência sem considerar implementações concretas.
Tipos estruturados em C. Acesso a campos de estruturas. Ponteiros para estruturas; sintaxes de acesso alternativas. Estruturas e vectores. Apresentação e discussão de exemplos.


Amontoados: estrutura de dados e representação em memória. Implementação com vector: algoritmos fixUp e fixDown. Algoritmo de ordenação de vectores com base em amontoados (heapsort). Discussão de aspectos de eficiência.
Estruturas auto-referenciadas. Apresentação e discussão de exemplos: [[Pilha (dimensão variável)|pilha de dimensão arbitrária]] ([[Gestão de Memória (pilha elástica)|exemplo de cliente]]). Revisões sobre ponteiros para funções. Definição de tipos utilizando typedef.


Filas de prioridades. Impacto da implementação na eficiência: implementação com amontoado e com vector. Discussão. Algoritmo de ordenação baseado em fila de prioridade (PQsort). Introdução aos tipos de dados abstractos (ADTs).
Apresentação de exemplo de utilização de estruturas em C. Lista duplamente ligada; funções de iteração parametrizadas; funções de inserção e remoção nos extremos: "push" e "pop". Considerações sobre alguns problemas da solução. O uso de <tt>assert</tt>.


(na aula 21 foram feitas revisões para o primeiro teste)
Apresentação e discussão de exemplo de aplicação de estruturas em C: construção de uma tabela de símbolos com recurso a função de dispersão; ênfase nos aspectos de organização e gestão de memória, assim como na simplicidade relativa dos acessos aos dados.


== Aula 18: Aspectos de Desempenho ==
== Aula 16: Argumentos Variáveis; Bibliotecas ==


Aspectos de desempenho de programas em C: apresentação de programa ilustrativo dos problemas que afectam o desempenho. Apresentação e discussão de algumas alternativas de solução.
Argumentos variáveis: stdarg. Apresentação de [[Exemplo de stdargs: miniprintf|exemplo]] e discussão das condições de utilização. Bibliotecas em C. [[Funções da Biblioteca Padrão (ficheiros)|Funções para manipulação de ficheiros]].


== Aula 17: Problemas Comuns em C ==
== Aula 17: Problemas Comuns em C ==
Line 45: Line 48:
Problemas comuns na programação em C. Apresentação e discussão de exemplos.
Problemas comuns na programação em C. Apresentação e discussão de exemplos.


== Aula 16: Argumentos Variáveis; Bibliotecas ==
== Aula 18: Aspectos de Desempenho ==


Argumentos variáveis: stdarg. Apresentação de exemplo e discussão das condições de utilização. Bibliotecas em C. Funções para manipulação de ficheiros.
Aspectos de desempenho de programas em C: apresentação de programa ilustrativo dos problemas que afectam o desempenho. Apresentação e discussão de algumas alternativas de solução.


== Aula 15: Estruturas em C ==
== Aulas 19 a 24: Estruturas de Dados Elementares ==


Apresentação e discussão de exemplo de aplicação de estruturas em C: construção de uma tabela de símbolos com recurso a função de dispersão; ênfase nos aspectos de organização e gestão de memória, assim como na simplicidade relativa dos acessos aos dados.
Introdução às estruturas de dados. Estruturas de dados elementares: vectores, listas ([[Listas Simplesmente Ligadas|simplesmente]] e [[Listas Duplamente Ligadas (inteiros)|duplamente]] ligadas). Uso de sentinelas. Apresentação e discussão de exemplos.


== Aula 14: Estruturas em C ==
Vectores e listas. Algoritmos e dependência da estrutura de dados. Apresentação de ordenação por inserção (isort) com vector e lista ligada sem sentinela. Discussão de aspectos relacionados com as soluções.


Apresentação de exemplo de utilização de estruturas em C. Lista duplamente ligada; funções de iteração parametrizadas; funções de inserção e remoção nos extremos: "push" e "pop". Considerações sobre alguns problemas da solução. O uso de <tt>assert</tt>.
Discussão de aspectos relacionados com o uso de sentinelas numa versão de [[Ordenação por Inserção|ordenação por inserção]] (isort) numa lista ligada. Árvores binárias completas, equilibradas e completamente preenchidas: organização de elementos. [[Amontoados]]: propriedades e organização de dados. Algoritmos de [[Amontoados#Algoritmo fixUp|fixUp]] e [[Amontoados#Algoritmo fixDown|fixDown]]. Inserção e remoção de elementos em/de um amontoado. Discussão de aspectos de eficiência sem considerar implementações concretas.


== Aula 13: Estruturas em C ==
Amontoados: estrutura de dados e representação em memória. Implementação com vector: algoritmos [[Amontoados#Algoritmo fixUp|fixUp]] e [[Amontoados#Algoritmo fixDown|fixDown]]. Algoritmo de ordenação de vectores com base em amontoados ([[Heapsort|heapsort]]). Discussão de aspectos de eficiência.


Estruturas auto-referenciadas. Apresentação e discussão de exemplos: pilha de dimensão arbitrária. Revisões sobre ponteiros para funções. Definição de tipos utilizando typedef.
Filas de prioridades. Impacto da implementação na eficiência: implementação com amontoado e com vector. Discussão. Algoritmo de ordenação baseado em fila de prioridade (PQsort). Introdução aos tipos de dados abstractos (ADTs).


== Aula 12: Estruturas em C ==
(na aula 21 foram feitas revisões para o primeiro teste)


Tipos estruturados em C. Acesso a campos de estruturas. Ponteiros para estruturas; sintaxes de acesso alternativas. Estruturas e vectores. Apresentação e discussão de exemplos.
== Aula 25: Introdução à Análise de Algoritmos ==


== Aula 11: Ponteiros para Funções ==
Introdução à análise de algoritmos. Crescimento de funções. Notação assimptótica ("notação O"). [[Complexidade de Algoritmos (exemplos)|Comportamentos em várias situações]]: média, pior caso e melhor caso. Recorrências. Apresentação e discussão de exemplos.


Ponteiros para funções. Apresentação e discussão de exemplo de utilização: algoritmo de procura binária parametrizado com comparador.
== Aula 26: Tipos de Dados Abstractos (ADTs) ==


== Aula 10: Ponteiros e Gestão de Memória ==
Tipos de dados abstractos: [[Tipos de Dados Abstractos#Interface|interface]], [[Tipos de Dados Abstractos#Implementação|implementação]], [[Tipos de Dados Abstractos#Cliente|cliente]], item. Motivação para o uso de ADTs. Exemplos de ADTs: pilha; fila de prioridades; fila simples (FIFO) com base em vector e em lista ligada. Exemplos de clientes.


Apresentação e discussão de exemplo prático de gestão de memória. Pilha de strings.
== Aula 27: ADTs de 1ª ordem ==


== Aula 09: Ponteiros e Vectores ==
Tipos de dados de primeira ordem: motivação. Exemplo de tipo de dados de 1ª ordem: [[Tipos de Dados de 1ª Ordem: números complexos|números complexos]]. Reescrita como ADT de 1ª ordem. Justificação para o procedimento. Exemplos de ADTs de primeira ordem: [[ADTs de 1ª ordem: Fila|FIFO]]; [[ADTs de 1ª ordem: Fila de Prioridade|fila de prioridade]] com base em amontoado. [[ADTs de 1ª ordem: Fila de Prioridade#Algoritmo de Ordenação|Ordenação com base em fila de prioridade]].


Matrizes em C. Acesso multidimensional. Diferenças entre matrizes, vectores e ponteiros: organização da memória. Passagem de argumentos por referência. Gestão de memória dinâmica utilizando malloc e free. Apresentação e discussão de exemplos.
== Aulas 28 a 32 Árvores Binárias ==


== Aula 08: Ponteiros e Vectores ==
Anatomia de uma árvore: nós internos e externos; nós vs. folhas. "Rooted trees" vs. "free trees". Árvores genéricas: exemplos. Introdução às árvores binárias: definição de árvore binária; [[Estruturas de suporte à implementação de BSTs|implementação]] vs. conceito. Estruturas de suporte à implementação de árvores binárias. [[Exemplos de Algoritmos Básicos com Árvores|Algoritmos básicos com árvores]]: contagem de nós e cálculo da altura de uma árvore. [[Travessias sobre BSTs|Travessias]] recursivas: "pre-order", "in-order", "post-order".


Ponteiros e vectores: semelhanças e diferenças. Aritmética de ponteiros. Conversão de ponteiros. Passagem de ponteiros e vectores como argumentos de funções. Apresentação e discussão de exemplos.
Travessias: algoritmos não recursivos: "pre-order" e "level-order". Discussão: algoritmos recursivos vs. iterativos. Árvores binárias de procura (BSTs - binary search trees). Métodos de construção, de [[Procura numa BST|procura]] e de [[Inserção numa BST|inserção]]. [[Operações de Rotação sobre Árvores Binárias|Operações de rotação à esquerda e à direita]]. [[ADT para tabela de símbolos]]: [[Implementação do ADT Tabela de Símbolos (BST)|implementação baseada em BSTs]]. Apresentação e discussão de implementações dos algoritmos de inserção e procura.


== Aula 07: Ponteiros e Vectores ==
Algoritmos sobre árvores binárias de procura (BSTs): [[Selecção da k-ésima Menor Chave (BST)|selecção da k-ésima menor chave]]; [[Partição pela k-ésima Menor Chave (BST)|partição pela k-ésima menor chave]]; [[Inserção numa BST#Inserção na Raiz|inserção na raiz]]; [[Junção de duas BSTs arbitrárias|junção de árvores]]; [[Remoção de Elementos de uma BST|remoção de um elemento]]. Discussão de aspectos de organização e eficiência; discussão de aspectos relacionados com os processos recursivos.


Introdução ao uso de ponteiros em C: ponteiros e endereços; ponteiros e vectores/tabelas. Notação (introdução ao uso dos operadores * e &). Vectores de caracteres. Organização da memória. Apresentação e discussão de exemplos.
Árvores equilibradas. Problemas de eficiência das BSTs. Discussão de possíveis soluções: balanceamento explícito e recurso à aleatorização. Árvores 2-3-4 e árvores red-black. Método de construção. Exemplos. Algoritmo de inserção para árvores red-black. Apresentação de exemplo.


== Aula 06: Funções e Estrutura de Programas ==
== Aulas 33 a 34 Algoritmos de Ordenação ==


Funções e módulos. Compilação separada. Utilização do pré-processador de C. Visibilidade de variáveis e funções. O uso de static. Exemplos de funções e módulos. Exemplos de funções simples: leitura interactiva de caracteres. Aplicação de switch.
Noção de estabilidade.


== Aula 05: Controlo de Fluxo; Funções ==
=== Algoritmos elementares ===
Algoritmos apresentados (para vectores): selection sort, bubble sort, insert sort. Discussão de aspectos de eficiência. Exemplos. Shell sort. Noção de h-sortedness. Discussão da influência da sequência h na eficiência do algoritmo. Comparação do Shell sort com o insert sort simples. Apresentação e discussão de exemplos de aplicação. [[Avaliação Experimental (ordenação)#Algoritmos Elementares|Avaliação experimental dos algoritmos de ordenação elementar]]: insert sort, selection sort e bubble sort. [[Avaliação Experimental (ordenação)#Shell Sort|Avaliação experimental do algoritmo Shell sort]]. Estabilidade dos algoritmos.


Controlo de execução em C: ciclos while, for, do/while. Exemplos. Comparação entre ciclos while e ciclos for. Interrupção do desenrolar normal de um ciclo: break e continue. Análise de comportamento nos diferentes ciclos. Funções em C: estrutura geral de uma função. Argumentos e retorno. Exemplos simples: função pop para uma pilha de inteiros.
=== Algoritmos baseados em propriedades das chaves ===


== Aula 04: Controlo de Fluxo ==
Ordenação por contagem: ''[[Counting Sort|counting sort]]''. Princípio de funcionamento; estabilidade. Apresentação de exemplo e discussão de aspectos de eficiência.


Revisões sobre tipos básicos e matéria associada. Revisões sobre operadores. Operador condicional. Ordem de execução. Conversão de tipos implícita e explícita. Discussão de aspectos associados. Controlo de fluxo em programas: instruções e blocos. if e if/else.
=== Algoritmos eficientes ===


== Aula 03: Constantes e Operadores ==
Introdução aos algoritmos de ordenação eficientes: [[Heapsort|heapsort]] (revisões: princípio de funcionamento do algoritmo; aspectos de implementação; aspectos de eficiência); princípios básicos do funcionamento do [[Quicksort|quicksort]]. Função de partição: influência da escolha do pivot: discussão e exemplos de alternativas. [[Avaliação Experimental (ordenação)#Quicksort vs. Heapsort|Avaliação experimental comparativa]] do quicksort e do heapsort.


Literais em C. Caracteres e cadeias de caracteres: organização em memória. Operadores aritméticos, lógicos e relacionais. Operadores de atribuição. Exemplos. Discussão de problemas.
Ordenação por fusão: mergesort. Operação de fusão de vectores ordenados. Fusão abstracta in-place. Versões top-down e bottom-up do algoritmo mergesort. Requisitos para a estabilidade da ordenação. Apresentação de exemplos de aplicação. Discussão de aspectos de eficiência em espaço e tempo. Mergesort sem cópia. Avaliação experimental do mergesort.


== Aula 02: Conceitos básicos de C ==
Uso de cutoff: insert sort para vectores pequenos. Discussão.


Instrodução ao ANSI C. Exemplo de programa: hello world. Tipos básicos e aspectos relacionados. Declarações de constantes e variáveis.
[[category:AED]]
 
[[category:Ensino]]
== Aula 01: Apresentação ==
 
Apresentação da disciplina. Apresentação do programa e do método de avaliação.

Latest revision as of 14:47, 6 April 2015

Aulas 1 a 3: Apresentação; Introdução ao C

Apresentação da disciplina. Apresentação do programa e do método de avaliação.

Conceitos básicos de C

Instrodução ao ANSI C. Exemplo de programa: hello world. Tipos básicos e aspectos relacionados. Declarações de constantes e variáveis.

Constantes e Operadores

Literais em C. Caracteres e cadeias de caracteres: organização em memória. Operadores aritméticos, lógicos e relacionais. Operadores de atribuição. Exemplos. Discussão de problemas.

Aulas 4 a 6: Controlo de Fluxo; Funções; Programas

Revisões sobre tipos básicos e matéria associada. Revisões sobre operadores. Operador condicional. Ordem de execução. Conversão de tipos implícita e explícita. Discussão de aspectos associados. Controlo de fluxo em programas: instruções e blocos. if e if/else.

Controlo de execução em C: ciclos while, for, do/while. Exemplos. Comparação entre ciclos while e ciclos for. Interrupção do desenrolar normal de um ciclo: break e continue. Análise de comportamento nos diferentes ciclos. Funções em C: estrutura geral de uma função. Argumentos e retorno. Exemplos simples: função pop para uma pilha de inteiros.

Funções e módulos. Compilação separada. Utilização do pré-processador de C. Visibilidade de variáveis e funções. O uso de static. Exemplos de funções e módulos. Exemplos de funções simples: leitura interactiva de caracteres. Aplicação de switch.

Aulas 7 a 11: Ponteiros e Gestão de Memória

Introdução ao uso de ponteiros em C: ponteiros e endereços; ponteiros e vectores/tabelas. Notação (introdução ao uso dos operadores * e &). Vectores de caracteres. Organização da memória. Apresentação e discussão de exemplos.

Ponteiros e vectores: semelhanças e diferenças. Aritmética de ponteiros. Conversão de ponteiros. Passagem de ponteiros e vectores como argumentos de funções. Apresentação e discussão de exemplos.

Matrizes em C. Acesso multidimensional. Diferenças entre matrizes, vectores e ponteiros: organização da memória. Passagem de argumentos por referência. Gestão de memória dinâmica utilizando malloc e free. Apresentação e discussão de exemplos.

Apresentação e discussão de exemplo prático de gestão de memória. Pilha de strings.

Ponteiros para funções. Apresentação e discussão de exemplo de utilização: algoritmo de procura binária parametrizado com comparador.

Aulas 12 a 15: Estruturas em C

Tipos estruturados em C. Acesso a campos de estruturas. Ponteiros para estruturas; sintaxes de acesso alternativas. Estruturas e vectores. Apresentação e discussão de exemplos.

Estruturas auto-referenciadas. Apresentação e discussão de exemplos: pilha de dimensão arbitrária (exemplo de cliente). Revisões sobre ponteiros para funções. Definição de tipos utilizando typedef.

Apresentação de exemplo de utilização de estruturas em C. Lista duplamente ligada; funções de iteração parametrizadas; funções de inserção e remoção nos extremos: "push" e "pop". Considerações sobre alguns problemas da solução. O uso de assert.

Apresentação e discussão de exemplo de aplicação de estruturas em C: construção de uma tabela de símbolos com recurso a função de dispersão; ênfase nos aspectos de organização e gestão de memória, assim como na simplicidade relativa dos acessos aos dados.

Aula 16: Argumentos Variáveis; Bibliotecas

Argumentos variáveis: stdarg. Apresentação de exemplo e discussão das condições de utilização. Bibliotecas em C. Funções para manipulação de ficheiros.

Aula 17: Problemas Comuns em C

Problemas comuns na programação em C. Apresentação e discussão de exemplos.

Aula 18: Aspectos de Desempenho

Aspectos de desempenho de programas em C: apresentação de programa ilustrativo dos problemas que afectam o desempenho. Apresentação e discussão de algumas alternativas de solução.

Aulas 19 a 24: Estruturas de Dados Elementares

Introdução às estruturas de dados. Estruturas de dados elementares: vectores, listas (simplesmente e duplamente ligadas). Uso de sentinelas. Apresentação e discussão de exemplos.

Vectores e listas. Algoritmos e dependência da estrutura de dados. Apresentação de ordenação por inserção (isort) com vector e lista ligada sem sentinela. Discussão de aspectos relacionados com as soluções.

Discussão de aspectos relacionados com o uso de sentinelas numa versão de ordenação por inserção (isort) numa lista ligada. Árvores binárias completas, equilibradas e completamente preenchidas: organização de elementos. Amontoados: propriedades e organização de dados. Algoritmos de fixUp e fixDown. Inserção e remoção de elementos em/de um amontoado. Discussão de aspectos de eficiência sem considerar implementações concretas.

Amontoados: estrutura de dados e representação em memória. Implementação com vector: algoritmos fixUp e fixDown. Algoritmo de ordenação de vectores com base em amontoados (heapsort). Discussão de aspectos de eficiência.

Filas de prioridades. Impacto da implementação na eficiência: implementação com amontoado e com vector. Discussão. Algoritmo de ordenação baseado em fila de prioridade (PQsort). Introdução aos tipos de dados abstractos (ADTs).

(na aula 21 foram feitas revisões para o primeiro teste)

Aula 25: Introdução à Análise de Algoritmos

Introdução à análise de algoritmos. Crescimento de funções. Notação assimptótica ("notação O"). Comportamentos em várias situações: média, pior caso e melhor caso. Recorrências. Apresentação e discussão de exemplos.

Aula 26: Tipos de Dados Abstractos (ADTs)

Tipos de dados abstractos: interface, implementação, cliente, item. Motivação para o uso de ADTs. Exemplos de ADTs: pilha; fila de prioridades; fila simples (FIFO) com base em vector e em lista ligada. Exemplos de clientes.

Aula 27: ADTs de 1ª ordem

Tipos de dados de primeira ordem: motivação. Exemplo de tipo de dados de 1ª ordem: números complexos. Reescrita como ADT de 1ª ordem. Justificação para o procedimento. Exemplos de ADTs de primeira ordem: FIFO; fila de prioridade com base em amontoado. Ordenação com base em fila de prioridade.

Aulas 28 a 32 Árvores Binárias

Anatomia de uma árvore: nós internos e externos; nós vs. folhas. "Rooted trees" vs. "free trees". Árvores genéricas: exemplos. Introdução às árvores binárias: definição de árvore binária; implementação vs. conceito. Estruturas de suporte à implementação de árvores binárias. Algoritmos básicos com árvores: contagem de nós e cálculo da altura de uma árvore. Travessias recursivas: "pre-order", "in-order", "post-order".

Travessias: algoritmos não recursivos: "pre-order" e "level-order". Discussão: algoritmos recursivos vs. iterativos. Árvores binárias de procura (BSTs - binary search trees). Métodos de construção, de procura e de inserção. Operações de rotação à esquerda e à direita. ADT para tabela de símbolos: implementação baseada em BSTs. Apresentação e discussão de implementações dos algoritmos de inserção e procura.

Algoritmos sobre árvores binárias de procura (BSTs): selecção da k-ésima menor chave; partição pela k-ésima menor chave; inserção na raiz; junção de árvores; remoção de um elemento. Discussão de aspectos de organização e eficiência; discussão de aspectos relacionados com os processos recursivos.

Árvores equilibradas. Problemas de eficiência das BSTs. Discussão de possíveis soluções: balanceamento explícito e recurso à aleatorização. Árvores 2-3-4 e árvores red-black. Método de construção. Exemplos. Algoritmo de inserção para árvores red-black. Apresentação de exemplo.

Aulas 33 a 34 Algoritmos de Ordenação

Noção de estabilidade.

Algoritmos elementares

Algoritmos apresentados (para vectores): selection sort, bubble sort, insert sort. Discussão de aspectos de eficiência. Exemplos. Shell sort. Noção de h-sortedness. Discussão da influência da sequência h na eficiência do algoritmo. Comparação do Shell sort com o insert sort simples. Apresentação e discussão de exemplos de aplicação. Avaliação experimental dos algoritmos de ordenação elementar: insert sort, selection sort e bubble sort. Avaliação experimental do algoritmo Shell sort. Estabilidade dos algoritmos.

Algoritmos baseados em propriedades das chaves

Ordenação por contagem: counting sort. Princípio de funcionamento; estabilidade. Apresentação de exemplo e discussão de aspectos de eficiência.

Algoritmos eficientes

Introdução aos algoritmos de ordenação eficientes: heapsort (revisões: princípio de funcionamento do algoritmo; aspectos de implementação; aspectos de eficiência); princípios básicos do funcionamento do quicksort. Função de partição: influência da escolha do pivot: discussão e exemplos de alternativas. Avaliação experimental comparativa do quicksort e do heapsort.

Ordenação por fusão: mergesort. Operação de fusão de vectores ordenados. Fusão abstracta in-place. Versões top-down e bottom-up do algoritmo mergesort. Requisitos para a estabilidade da ordenação. Apresentação de exemplos de aplicação. Discussão de aspectos de eficiência em espaço e tempo. Mergesort sem cópia. Avaliação experimental do mergesort.

Uso de cutoff: insert sort para vectores pequenos. Discussão.