int p = ((f i)/ 2); if (n == v[p+i]) { return p+i; } else if (n > v[p+i]) { return misterio(n, v, p+i, f); } else if (n < v[p+i]) { return misterio(n, v, i, p); } } R.: Busca binaria de um numero dentro do vetor 2 Questo: Determine as sadas apresentadas pelo programa abaixo: #include <stdio.h> int menor(int i, int v[], int tamanho) { int j, m = i; for (j = i; j < tamanho; j++) { if (v[j] < v[m]) { m = j; } } return m; } main() { int v[] = {10, 14, 9, 3, 21, 27}; int tamanho = sizeof(v) / sizeof(int); int i, m, a; for (i = 0; i < tamanho; i++) { m = menor(i, v, tamanho); a = v[i]; v[i] = v[m]; v[m] = a; }
for (i = 0; i < tamanho; i++) {
printf("%d ", v[i]); } } R.: 3 9 10 14 21 27 3 Questo: Dada a estrutura de um n, escreva uma funo que adicione valores no fim de uma lista ligada. struct Node { int valor; struct Node *proximo; }; R.: Void insereFim (int n, node *lista){ node *novo = (node *) malloc (sizeof (node)); novo -> valor = n; novo -> proximo = NULL; node *temp = lista; while (temp -> proximo != NULL){ temp = temp -> proximo; } Temp -> proximo = novo; }
4 Questo: Utilize a mesma estrutura de n apresentada acima e escreva
uma funo que adicione valores no incio de uma lista ligada. R.: Void insereInicio (int n, node *lista){ node *novo = (node *) malloc (sizeof (node)); novo -> valor = n; node *temp = lista -> proximo; lista -> proximo = novo; novo -> proximo= temp; }
5 Questo: Explique as principais diferenas entre uma lista ligada e uma
rvore, bem como seus propsitos de utilizao. R.:
Lista fcil de inserir, porem a busca ruim.
Arvore fcil de buscar, porem a insero ruim.
6 Questo: Defina alocao esttica e alocao dinmica.
R.: Ordenao esttica alocao previa de um conjunto de endereos de memoria. R.: Ordenao dinmica vai alocando em tempo de execuo. 7 Questo: Dada a estrutura de um n, escreva uma funo que adicione valores em uma rvore binria. Considere que os valores sero inseridos na ordem digitada pelo usurio. Escreva apenas a funo de profundidade. struct Node { int valor; struct Node *esq; struct Node *dir; }; void inserirNoPorProfundidade(node *arvore, node *novo){ if(novo -> valor < arvore -> valor){ if(arvore -> esq == NULL){ arvore -> esq = novo; }else { inserirNoPorProfundidade(arvore -> esq, novo); }else{ if(arvore -> dir == null){ arvore -> dir = novo; }else{ inserirNoPorProfundidade(arvore -> dir, novo); } }
8 Questo: Utilize a mesma estrutura de n apresentada acima e escreva
uma funo de busca em rvore binria. node* buscar (int n, node *arvore){ node *no = NULL; if (arvore != NULL){ if (n == arvore -> valor) no = arvore; else { if (n < arvore -> valor) no = buscar (n, arvore -> esq); else no = buscar (n, arvore -> dir); } } return no; } 9 Questo: Resolva os itens a seguir e justifique suas respostas. a) Qual o custo computacional de ordenar um vetor de tamanho N com o algoritmo Quick Sort? R.: O (n*(n+1))/2 b) Qual o custo computacional de adicionar um valor em uma lista ligada de tamanho N? R.: o (n+1) c) Qual o custo computacional de buscar um valor em uma rvore binria perfeitamente balanceada (AVL)? R.: Log2 n d) O que uma rvore AVL? R.: uma arvore balanceada pela altura e uma rvore de busca binria auto balanceada. Em tal rvore, a altura de dois ns folha difere no mximo em uma unidade, ou seja (-1 <= h <= 1). e) Qual premissa deve ser atendida para realizar uma busca binria em um vetor? R.: O vetor deve estar ordenado. 10 Questo: Classifique as rvores abaixo com suas respectivas regras de balanceamento. Justifique: LL