Hashing |
Vejledende løsninger |
1 | Vi vil først se selve HashSet-klassen: |
HashSet.java
public class HashSet { private int[] array; private final static int DELETED = -1; private final static int FREE = 0; public HashSet() { this( 10 ); } public HashSet( int size ) { array = new int[ size ]; clear(); } public void add( int value ) { int i = findIndex( value ); if ( i < 0 ) { i = hash( value ); while ( true ) { if ( array[ i ] == FREE || array[ i ] == DELETED ) { array[ i ] = value; break; // eller return } i = inc( i ); } } } public void delete( int value ) { int i = findIndex( value ); if ( i >= 0 ) array[ i ] = DELETED; } public boolean contains( int value ) { return findIndex( value ) >= 0; } public void clear() { for ( int i = 0; i < array.length; i++ ) array[ i ] = FREE; } private int inc( int i ) { return ( i + 1 ) % array.length; } private int findIndex( int value ) { int i = hash( value ); while ( true ) { if ( array[ i ] == value ) return i; else if ( array[ i ] == FREE ) // findes ikke return -1; i = inc( i ); } } private int hash( int value ) { return value % array.length; } @Override public String toString() { StringBuffer sb = new StringBuffer(); for ( int i = 0; i < array.length; i++ ) if ( array[ i ] != FREE && array[ i ] != DELETED ) sb.append( array[ i ] + " " ); return sb.toString().trim(); } } |
|
De to konstanter FREE og DELETED er måske ikke så nødvendige, og visse af udtrykkene kunne forkortes ved at anvende uligheder der i stedet sammenligner med 0, men de øger læsbarheden. | |
Kaldet af clear-metoden i konstruktoren er heller ikke nødvendig, men understreger at alle indgange i array'et initialt er sat til FREE (i.e. 0). | |
Problematikken omkring at starte forfra i array'et når man kommer ud for enden, er samlet i en service-metode: inc, der fremhæver løsningen med modulus. | |
Test-anvendelsen følger dernæst: | |
Main.java
public class Main { public static void main( String[] args ) { HashSet set = new HashSet(); set.add( 19 ); set.add( 29 ); set.add( 39 ); System.out.println( set ); System.out.println( set.contains( 19 ) ); System.out.println( set.contains( 29 ) ); System.out.println( set.contains( 39 ) ); System.out.println( set.contains( 5 ) ); set.delete( 19 ); System.out.println( set.contains( 19 ) ); System.out.println( set.contains( 29 ) ); System.out.println( set.contains( 39 ) ); System.out.println( set.contains( 5 ) ); } } 29 39 19 true true true false false true true false |
|
Udskriften er måske lidt svær at læse, da den næsten udelukkende består af true og false, men den demonstrerer at man kan indsætte og fjerne værdier fra mængden, samt teste for om elementer tilhører denne. |