public class LinearProbingHashST< Key, Value> { private int N; private int M = 16; private Key[] keys; private Value[] vals; public LinearProbingHashST( ) { keys = (Key[]) new Object[M]; vals = (Value[]) new Object[M]; } private int hash( Key key) { return (key.hashCode( ) & 0x7fffffff) % M; } private void resize( int cap) { LinearProbingHashST< Key, Value> t; t = new LinearProbingHashST< Key, Value>( cap); for (int i = 0; i < M; i++) if (keys[i] != null) t.put( keys[i], vals[i]); keys = t.keys; vals = t.vals; M = t.M; } public void put( Key key, Value val) { if (N >= M/2) resize(2*M); int i; for (i = hash( key); keys[i] != null; i = (i+1) % M) if (keys[i].equals( key)) { vals[i] = val; return; } keys[i] = key; vals[i] = val; N++; } public Value get( Key key) { int i; for (i = hash( key); keys[i] != null; i = (i+1) % M) if (keys[i].equals( key)) return vals[i]; return null; } } Código adaptado de |
O tema dessas notas é o mesma de boa parte da Ciência/Engenharia da Computação: a construção de programas rápidos, programas que resolvem problemas de maneira eficiente (ou seja, sem desperdício de tempo).
O segredo de muitos programas rápidos está na maneira como seus dados são organizados durante o processamento, ou seja, na estrutura de dados (data structure) empregada pelo programa. Muitas vezes, a melhor maneira de organizar os dados não é óbvia nem simples. Mas uma boa estrutura de dados tem um efeito dramático sobre a velocidade do programa. (É o caso, por exemplo, da estrutura conhecida como árvore rubro negra.)
O estudo de boas estruturas de dados é o assunto central destas notas. Isso envolve, em particular, o estudo de algoritmos para a criação e manipulação dessas estruturas. Assim, o título deste sítio poderia ser Algoritmos e Estruturas de Dados.
Conteúdo deste sítio:
Pré-requisito: Supõe-se que o leitor já teve um curso de introdução à programação e um curso de projeto de algoritmos.
Outros assuntos:
Projeto de Algoritmos em C |
Livro Algoritmos em C
|
Algorithms Design in C |
Desenvolvimento de Algoritmos |
Literate Programming & CWEB |
O que é uma prova? |
Uma Introdução Sucinta à Teoria dos Grafos |
Exercícios de Teoria dos Grafos |
Graph Theory Exercises |
Digrafos |
Algoritmos em Grafos com Stanford GraphBase |
Algoritmos para Grafos via Sedgewick |
Teoria dos Grafos via Diestel |
Análise de Algoritmos |
Minicurso de Análise de Algoritmos |
Algoritmos de Programação Linear |
Otimização Combinatória |
Algoritmos de Aproximação