IKI 20100: Struktur Data & Algoritma

dokumen-dokumen yang mirip
Penerapan Fungsi Hash dalam Penempatan Parkir Mobil

Struktur Data dan Algoritma

03/04/2018. Collection set List Map. Pemrograman Berorientasi Object

Praktikum Algoritma dan Struktur Data 2010

Struktur Data dan Algoritma

Struktur Data & Algoritma

Pemrograman Berorientasi. Array dan Collections

IKI 20100: Struktur Data & Algoritma

IKI 20100: Struktur Data & Algoritma

Struktur Data dan Algoritma

KUM 3 IMPLEMENTASI LIST

Everybody in this country should learn how to program a computer because it teaches you how to think. Steve Jobs

ORGANISASI BERKAS RELATIF

Struktur Data & Algoritma

Sorting. Struktur Data dan Algoritma. Suryana Setiawan, Ruli Manurung & Ade Azurat (acknowledgments: Denny) Fasilkom UI

IX. Implementasi ADT : Stacks & Queues. Operasi dasar Contoh kegunaan Implementasi Array-based dan linked list-based

Fungsi Hash dan Metode Collision Resolution

Gambar 1. Single Linked List

Collections. Collections Framework

Pemrograman Berbasis Objek. Collections. Politeknik Elektronika Negeri Surabaya

DIG1G3 Implementasi Struktur Data

SEARCHING (PENCARIAN)

INSTITUT TEKNOLOGI SUMATERA COLLECTION: SET DAN MAP

Struktur Data & Algoritme (Data Structures & Algorithms)

Struktur Data dan Algoritme. Struktur Data & Algoritme (Data Structures & Algorithms) Struktur Data dan Algoritme. Objectives.

MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA QUEUE

Algoritma dan Struktur Data. Pertemuan 7 Linked List

BAB 2 LANDASAN TEORI. 2.1 Pengertian Text Mining

Linked List dan Implementasinya dalam Bahasa Java

Boxing & AutoBoxing Java Collection Framework. Collection List Map Set. Generics vs Inheritance

IMPLEMENTASI PERANGKAT LUNAK DENGAN PENERAPAN PENCARIAN RELATIF (HASH SEARCH)

Variabel dengan tipe dasar hanya dapat menyimpan sebuah nilai

MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA LINKED LIST (BAGIAN 1)

Grouping Object. Viska Mutiawani, M.Sc

Gambar 1. Single Linked List

Review. Struktur Data & Algoritme (Data Structures & Algorithms) Objectives. Outline. Stacks & Queues

MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA STACK

Struktur Data & Algoritme (Data Structures & Algorithms)

BAB IV IMPLEMENTASI DAN PENGUJIAN

List: Pokok Bahasan dan TIK

Gambar 1. Single Linked List

DIG1G3 Implementasi Struktur Data

Tujuan Instruksional. Mahasiswa mampu :

Gambar 1. Single Linked List

BAB 4 ORGANISASI BERKAS RELATIF

FILE BERKAS LANGSUNG. Rudi Susanto

Java Collections Framework

MODUL PRAKTIKUM BASIS DATA PENGENALAN STRUKTUR DATA DAN KOMPLEKSITAS WAKTU

Algoritma dan Struktur Data. Pertemuan 8 Doubly Linked List

SORTING DENGAN ALGORITMA DIVIDE AND CONQUER

BAHASA PEMROGRAMAN JAVA PUTU INDAH CIPTAYANI JURUSAN SISTEM INFORMASI STMIK AMIKOM YOGYAKARTA

Java Generic & Collection

Algoritma dan Struktur Data

MODUL III ARRAYLIST TUGAS PENDAHULUAN

Objectives. Struktur Data & Algoritme (Data Structures & Algorithms) Sort. Outline. Bubble Sort: idea. Bubble Sort. Sorting

PRAKTIKUM STRUKTUR DATA QUEUE. SULIDAR FITRI, M.Sc

Pemrograman Berorientasi Obyek Lanjut (IT251) Ramos Somya, S.Kom., M.Cs.

BEBERAPA METODE PENYELESAIAN COLLISION PADA ORGANISASI BERKAS SECARA HASHING

ORGANISASI BERKAS RELATIF

Algoritma dan Struktur Data. Queue

DASAR PEMOGRAMAN JAVA

BAB 2 COLLECTION & THREAD

Pada pembuatan game di java, sering kali para programer. mendefinisikan banyak object seperti suara, gambar, dan grafik geometri yang

Topic Complexity of Hashing Search & Binary Search Tree Algorithm

MODUL PRAKTIKUM STRUKTUR DATA DAN ALGORITMA LINKED LIST (BAGIAN 2)

Collision Resolution

Badiyanto, S.Kom., M.Kom. PBO java

Design and Analysis Algorithm

IF PEMROGRAMAN LANJUT TUGAS 1. Oleh : Andri Heryandi, M.T.

Score: 94.0 Persentage: % ~ u ~ Generated by Foxit PDF Creator Foxit Software For evaluation only.

BAB X Hashing. typedef char *NomorBuku[100]; Buku = NomorBuku;

Algoritma dan Struktur Data. Linked List

Jobsheet 16 String dan Collection (List, Set, Map)

TUGAS BASIS DATA FILE ORGANIZATION IF2250 SEMESTER GENAP 2013/2014

IMPLEMENTASI STRUKTUR DATA LIST, QUEUE DAN STACK DALAM JAVA

Pemrograman. Pertemuan-3 Fery Updi,M.Kom

KONSEP DASAR PEMROGRAMAN BERORIENTASI OBYEK

Algoritma dan Struktur Data. Pertemuan 9 Circular Linked List

A. TUJUAN Mahasiswa diharapkan mampu : 1. Memahami Konsep Binary Search Tree 2. Mengimplementasaikan Binary Search Tree

Pengenalan OOP. Object-Oriented programming (OOP) Menitikberatkan pada konsep object sebagai elemen dasar dari program.

Outline STRUKTUR DATA. VII. Sorting

BAB 7 Java Array. Sebagai contoh, kita memiliki tiga variabel dengan tipe data int yang memiliki identifier yang berbeda untuk tiap variabel.

PEMOGRAMAN APLIKASI BERGERAK (Java ME) Company LOGO

BAHASA PEMROGRAMAN JAVA

sistem basis data ti ti ukdw Indexing Materi Minggu ke-10 Teknik Informatika Universitas Kristen Duta Wacana Yogyakarta 04/07/13 budi susanto 1

Algoritma & Struktur Data. Array. Oleh : Nur Hayatin, M.Kom

ANALISIS ALGORITMA BINARY SEARCH

Data structure :Metode LINK LIST. Kusnawi, S.Kom, M.Eng STMIK AMIKOM Yogyakarta

Jika Anda ingin bisa/sukses dalam kuliah SDA ini, rajinlah mengimplementasikan ADT dan mengerjakan soal-soal yang diberikan.

ALGORITMA DAN STRUKTUR DATA

ORGANISASI FILE. Alif Finandhita, S.Kom

Penerapan Algoritma Brute Force dalam mencari Faktor Prima pada suatu Bilangan

Penerapan Algoritma Brute Force di Permainan Nonogram

Pendahuluan Struktur Data. Nisa ul Hafidhoh

Sebuah algoritma tidak saja harus benar, tetapi juga harus mangkus (efisien). Algoritma yang bagus adalah algoritma yang mangkus.

A. TUJUAN PEMBELAJARAN 1. Memahami konsep dan operasi pada Stack. 2. Mampu mengimplementasikan struktur data Stack pada array dan List.

BAB VIII Pencarian(Searching)

KONSEP POINTER DAN LINKED LIST

Pertemuan 8. Dasar query basis data dengan SQLite ARFIAN HIDAYAT, S.KOM

Java Operators. Nurochman

Transkripsi:

IKI 20100: Struktur Data & Algoritma Hash Table Ruli Manurung & Ade Azurat ( Setiawan (acknowledgments: Denny, Suryana Fasilkom UI Ruli Manurung & Ade Azurat Fasilkom UI - IKI20100 2007/2008 Ganjil Minggu 13 1

Outline Hashing Definition Hash function Collition resolution Open hashing Separate chaining Closed hashing (Open addressing) Linear probing Quadratic probing Double hashing Primary Clustering, Secondary Clustering Access: insert, find, delete 2

Hash Tables Hashing digunakan untuk menyimpan data yang cukup besar pada ADT yang disebut hash table. Ukuran Hash table (H-size), biasanya lebih besar dari jumlah data yang hendak disimpan. load factor ( ) adalah perbandingan antara data yang disimpan dengan ukuran hash table. Fungsi Hash memetakan elemen pada indeks dari hash table. hash table item key hash function 0 1 2 3 H-1 3

Hash Tables (2) Hashing adalah teknik untuk melakukan penambahan, penghapusan dan pencarian dengan constant average time. Untuk menambahkan data atau pencarian, ditentukan key dari data tersebut dan digunakan sebuah fungsi hash untuk menetapkan lokasi untuk key tersebut. Hash tables adalah arrays dengan sel-sel yang ukurannya telah ditentukan dan dapat berisi data atau key yang berkesesuaian dengan data. Untuk setiap key, digunakan fungsi hash untuk memetakan key pada bilangan dalam rentang 0 hingga H-size-1. 4

Fungsi Hash Fungsi hash harus memiliki sifat berikut: mudah dihitung. dua key yang berbeda akan dipetakan pada dua sel yang berbeda pada array. (secara umum tidak bisa berlaku, mengapa? ). dapat dicapai dengan menggunakan direct-address table dimana semesta dari key relatif kecil. membagi key secara rata pada seluruh sel. Sebuah fungsi hash sederhana adalah menggunakan fungsi mod (sisa bagi) dengan bilangan prima. Dapat menggunakan manipulasi digit dengan kompleksitas rendah dan distribusi key yang rata. 5

Fungsi Hash: Truncation Sebagian dari key dapat dibuang/diabaikan, bagian key sisanya digabungkan untuk membentuk index. contoh: Phone no: index 731-3018 338 539-2309 329 428-1397 217 6

Fungsi Hash: Folding Data dipecah menjadi beberapa bagian, kemudian tiap bagian tersebut digabungkan lagi dalam bentuk lain. contoh. Phone no: 3-group index 7313018 73+13+018 104 5392309 53+92+309 454 4281397 42+81+397 520 7

Fungsi Hash: Modular arithmetic Melakukan konversi data ke bentuk bilangan bulat, dibagi dengan ukuran hash table, dan mengambil hasil sisa baginya sebagai indeks. contoh: Phone no: 2-group index 7313018 731+3018 3749 % 100 = 49 5392309 539+2309 2848 % 100 = 48 4281397 428+1397 1825 % 100 = 25 8

Memilih Fungsi Hash Sebuah fungsi hash yang bagus memiliki dua kriteria: 1. Harus dapat cepat dihitung. 2. Harus meminimalkan juga collisions yang terjadi. 9

Contoh Fungsi Hash Fungsi Hash untuk string X = 128 A 3 X 3 + A 2 X 2 + A 1 X 1 + A 0 X 0 (((A 3 X) + A 2 ) X + A 1 ) X + A 0 Hasil dari fungsi hash jauh lebih besar dari ukuran table, sehingga perlu di modulo dengan ukuran hash table. 10

Contoh Fungsi Hash int hash(string key, int tablesize) { int hashval = 0; for (int i=0; i < key.length(); i++) { hashval = (hashval * 128 + key.charat(i)) % tablesize; return hashval % tablesize; Modulo (A + B) % C = (A % C + B % C) % C (A * B) % C = (A % C * B % C) % C 11

Contoh Fungsi Hash int hash(string key, int tablesize) { int hashval = 0; for (int i=0; i < key.length(); i++) { hashval = (hashval * 37 + key.charat(i)); hashval %= tablesize; if (hashval < 0) { hashval += tablesize; return hashval; 12

Contoh Fungsi Hash int hash(string key, int tablesize) { int hashval = 0; for (int i=0; i < key.length(); i++) { hashval += key.charat(i) return hashval % tablesize; 13

Collision Resolution Collision Resolution: Penyelesaian bila terjadi collision (tabrakan). Dikatakan terjadi collision jika dua buah keys dipetakan pada sebuah sel. Collision bisa terjadi saat melakukan insertion. Dibutuhkan prosedur tambahan untuk mengatasi terjadinya collision. Ada dua strategi umum: ( Addressing Closed Hashing (Open ( Chaining ) Open Hashing 14

Closed Hashing Ide: mencari alternatif sel lain pada tabel. Pada proses insertion, coba sel lain sesuai urutan dengan menggunakan fungsi pencari urutan seperti berikut: h i (x) = (hash(x) + f(i)) mod H-size f(0) = 0 Fungsi f digunakan sebagai pengatur strategy collision resolution. Bagaimana bentuk fungsi f? 15

Closed Hashing Beberapa strategy/alternatif untuk menentukan bentuk fungsi f, yaitu: Linear probing Quadratic probing Double hashing 16

Linear Probing Gunakan fungsi linear f(i) = i Bila terjadi collision, cari posisi pertama pada tabel yang terdekat dengan posisi yang seharusnya. fungsi linear relatif paling sederhana. Mudah diimplementasikan. Dapat menimbulkan masalah: primary clustering Elemen-elemen yang menurut perhitungan hash diletakkan pada lokasi sel berbeda, diarahkan pada sel pengganti yang sama. 17

Linear Probing: Load factor Kompleksitas dari teknik ini bergantung pada nilai (load factor). Definisi (load factor): Untuk hash table T dengan ukuran m, yang menyimpan n data. (Load factor) dari T adalah n/m Linear Probing tidak disarankan bila: > 0.5 Linear Probing hanya disarankan untuk ukuran hash table yang ukurannya lebih besar dua kali dari jumlah data. 18

Hashing - insert 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 alpha dawn emerald flamingo hallmark moon. crystal marigold 19

Hashing - lookup 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 alpha crystal dawn emerald flamingo hallmark moon marigold private. cobalt? marigold? private? 20

Hashing - delete lazy deletion - mengapa? 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 alpha crystal dawn flamingo hallmark marigold private. delete emerald delete moon 21

Hashing - operation after delete 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 alpha crystal dawn flamingo hallmark marigold private. custom (insert) marigold? 22

Primary Clustering Elemen-elemen yang menurut perhitungan hash diletakkan pada lokasi sel berbeda, diarahkan (probe) pada sel pengganti yang sama. cobalt alpha crystal dawn custom flamingo canary dark alpha crystal dawn custom flamingo canary hallmark hallmark marigold marigold private. private. 23

Quadratic Probing Menghindari primary clustering dengan menggunakan fungsi: f(i) = i 2 Menimbulkan banyak permasalahan bila hash table telah terisi lebih dari setengah. Perlu dipilih ukuran hash table yang bukan bilangan kuadrat. Dengan ukuran hash table yang merupakan bilangan prima dan hash table yang terisi kurang dari setengah, strategy quadratic probe dapat selalu menemukan lokasi untuk setiap elemen baru. 24

Quadratic Probing Dapat melakukan increment bila terjadi collision Perhatikan bahwa fungsi quadratic dapat dijabarkan sebagai berikut: f(i) = i 2 = f(i-1) + 2 i - 1. Menimbulkan second clustering: Elemen-elemen yang menurut perhitungan hash diletakkan pada lokasi sel sama, diarahkan pada sel pengganti yang sama. 25

Double hashing fungsi untuk collision resolution disusun dengan fungsi hash seperti : ( x ) f(i) = i * hash2 Setiap saat faktor hash2(x) ditambahkan pada probe. Harus hati-hati dalam memilih fungsi hash kedua untuk menjamin agar tidak menghasilkan nilai 0 dan mem-probe ke seluruh sel. Salah satu syaratnya ukuran hash table haruslah bilangan prima. 26

Double Hashing cobalt alpha crystal dawn custom flamingo canary dark alpha crystal dawn custom flamingo done hallmark hallmark marigold marigold private. private. 27

Open Hashing Permasalahan Collision diselesaikan dengan menambahkan seluruh elemen yang memilih nilai hash sama pada sebuah set. Open Hashing: Menyediakan sebuah linked list untuk setiap elemen yang memiliki nilai hash sama. Tiap sel pada hash table berisi pointer ke sebuah linked list yang berisikan data/elemen. 28

Open Hashing Fungsi dan analisa Open Hashing: Menambahkan sebuah elemen ke dalam tabel: Dilakukan dengan menambahkan elemen pada akhir atau awal linkedlist yang sesuai dengan nilai hash. Bergantung apakah perlu ada pengujian nilai duplikasi atau tidak. Dipengaruhi berapa sering elemen terakhir akan diakses. 29

Open Hashing 0 1 2 3 4 5 30

Open Hashing Untuk pencarian, gunakan fungsi hash untuk menentukan linked list mana yang memiliki elemen yang dicari, kemudian lakukan pembacaan terhadap linked list tersebut. Penghapusan dilakukan pada linked list setelah pencarian elemen dilakukan. Dapat saja digunakan struktur data lain selain linked list untuk menyimpan elemen yang memiliki fungsi hash yang sama tersebut. Kelebihan utama dari metode ini adalah dapat menyimpan data yang tak terbatas. (dynamic expansion). Kekurangan utama adalah penggunaan memory pada tiap sel. 31

Analisa Open Hash Secara umum panjang dari linked list yang dihasilkan sejalan dengan nilai. Kompleksitas insertion bergantung pada fungsi hash dan insertion pada linked-list. Untuk pencarian, kompleksitasnya adalah waktu konstan dalam mengevaluasi fungsi hash + pembacaan list. Worst case O(n) untuk pencarian. Average case bergantung pada. Aturan umum untuk open hashing adalah untuk menjaga agar: 1. Digunakan untuk data yang ukuran-nya dinamic. 32

Isu-isu lain Hal-hal lain yang umum dan perlu diperhatikan pada metode closed hashing resolutions: Proses menghapus agak membingungkan karena tidak benar-benar dihapus. Secara umum lebih sederhana dari pada open hashing. Bagus bila diperkirakan tidak akan terjadi banyak collision. Jika pencarian berdasarkan fungsi hash gagal, kemungkinan harus mencari/membaca seluruh tabel. Menggunakan ukuran table yang lebih besar dari data yang diharapkan. 33

HashSet Contoh Implementasi Hash Table Quadratic Probing 34

public class HashSet<AnyType> extends AbstractCollection<AnyType> implements Set<AnyType>{ /** * Construct an empty HashSet. */ public HashSet( ) { allocatearray( DEFAULT_TABLE_SIZE ); clear( ); /** * Construct a HashSet from any collection. */ public HashSet( Collection<? extends AnyType> other ) { allocatearray( nextprime( other.size( ) * 2 ) ); clear( ); for( AnyType val : other ) add( val ); 35

/** * This method is not part of standard Java. * Like contains, it checks if x is in the set. * If it is, it returns the reference to the matching * object; otherwise it returns null. * @param x the object to search for. * @return if contains(x) is false, the return value is null; * otherwise, the return value is the object that causes * contains(x) to return true. */ public AnyType getmatch( AnyType x ) { int currentpos = findpos( x ); if( isactive( array, currentpos ) ) return (AnyType) array[ currentpos ].element; return null; 36

/** * Tests if some item is in this collection. * @param x any object. * @return true if this collection contains an item equal to x. */ public boolean contains( Object x ) { return isactive( array, findpos( x ) ); /** * Tests if item in pos is active. * @param pos a position in the hash table. * @param arr the HashEntry array (can be oldarray during rehash). * @return true if this position is active. */ private static boolean isactive( HashEntry [ ] arr, int pos ) { return arr[ pos ]!= null && arr[ pos ].isactive; 37

/** * Adds an item to this collection. * @param x any object. * @return true if this item was added to the collection. */ public boolean add( AnyType x ) { int currentpos = findpos( x ); if( isactive( array, currentpos ) ) return false; if( array[ currentpos ] == null ) occupied++; array[ currentpos ] = new HashEntry( x, true ); currentsize++; modcount++; if( occupied > array.length / 2 ) rehash( ); return true; 38

/** * this inner class is needed to encapsulate the element * and provide the flag field required by the Hash Table */ private static class HashEntry { public Object element; // the element public boolean isactive; // false if marked deleted public HashEntry( Object e ) { this( e, true ); public HashEntry( Object e, boolean i ) { element = e; isactive = i; 39

/** * Private routine to perform rehashing. * Can be called by both add and remove. */ private void rehash( ) { HashEntry [ ] oldarray = array; // Create a new, empty table allocatearray( nextprime( 4 * size( ) ) ); currentsize = 0; occupied = 0; // Copy table over for( int i = 0; i < oldarray.length; i++ ) if( isactive( oldarray, i ) ) add( (AnyType) oldarray[ i ].element ); /** * Internal method to allocate array. * @param arraysize the size of the array. */ private void allocatearray( int arraysize ) { array = new HashEntry[ nextprime( arraysize ) ]; 40

/** * Removes an item from this collection. * @param x any object. * @return true if this item was removed from the collection. */ public boolean remove( Object x ) { int currentpos = findpos( x ); if(!isactive( array, currentpos ) ) return false; array[ currentpos ].isactive = false; currentsize--; modcount++; if( currentsize < array.length / 8 ) rehash( ); return true; 41

/** * Method that performs quadratic probing resolution. * @param x the item to search for. * @return the position where the search terminates. */ private int findpos( Object x ) { int offset = 1; int currentpos = ( x == null )? 0 : Math.abs( x.hashcode( ) % array.length ); while( array[ currentpos ]!= null ) { if( x == null ) { if( array[ currentpos ].element == null ) break; else if( x.equals( array[ currentpos ].element ) ) break; currentpos += offset; offset += 2; if( currentpos >= array.length ) currentpos -= array.length; return currentpos; // Compute ith probe // Implement the mod 42

Open Hashing (Chaining) 43

/** * this inner class is needed to encapsulate the element * and provide the next field to implement the linked-list chaining */ private static class HashEntry { public Object element; // the element public HashEntry next; // linked list chaining. public HashEntry( Object e ) { this( e, null ); public HashEntry( Object e, HashEntry n ) { element = e; next = n; 44

/** * Adds an item to this collection. * @param x any object. * @return true if this item was added to the collection. */ public boolean add( AnyType x ) { if( getmatch( x ) ) return false; int currentpos = x.hashcode(); array[ currentpos ] = new HashEntry( x, array[currentpost]); currentsize++; return true; 45

46

HashMap 47

/** * Hash table implementation of the Map. */ public class HashMap<KeyType,ValueType> extends MapImpl<KeyType,ValueType>{ /** * Construct an empty HashMap. */ public HashMap( ) { super( new HashSet<Map.Entry<KeyType,ValueType>>( ) ); /** * Construct a HashMap with same key/value pairs as another map. * @param other the other map. */ public HashMap( Map<KeyType,ValueType> other ) { super( other ); 48

public int hashcode( ) { KeyType k = getkey( ); return k == null? 0 : k.hashcode( ); /** * Computes the hashcode for this String. * A String is represented by an array of Character. * This is done with int arithmetic, * where ** represents exponentiation, by this formula:<br> * <code>s[0]*31**(n-1) + s[1]*31**(n-2) +... + s[n-1]</code>. * * @return hashcode value of this String */ public int hashcode() { int hashcode = 0; int limit = count + offset; for (int i = offset; i < limit; i++) hashcode = hashcode * 31 + value[i]; return hashcode; 49

Source Code lengkap bisa dilihat di: http://telaga.cs.ui.ac.id/webkuliah/iki20100/resources/weiss.co de/weiss/util/hashset.java http://telaga.cs.ui.ac.id/webkuliah/iki20100/resources/weiss.co de/weiss/util/hashmap.java 50

Rangkuman Hash tables: array Hash function: Fungsi yang memetakan keys menjadi bilangan ( table [0 ukuran dari hash Collition resolution Open hashing Separate chaining ( addressing Closed hashing (Open Linear probing Quadratic probing Double hashing Primary Clustering, Secondary Clustering 51

Rangkuman Advantage running time ( resolution O(1) + O(collition Cocok untuk merepresentasikan data dengan frekuensi insert, delete dan search yang tinggi. Disadvantage Sulit (tidak efficient) untuk mencetak seluruh elemen pada hash table tidak efficient untuk mencari elemen minimum or maximum ( addressing tidak bisa di expand (untuk closed hash/open ada pemborosan memory/space 52

Referensi Bab 19 pada buku teks http://www.cs.auckland.ac.nz/software/alganim/hash_tables.ht ml http://www.engin.umd.umich.edu/cis/course.des/cis350/hashin g/web/hashapplet.htm 53