Løsningsforslag 7, gruppe 4

Fra Hiofwiki

Gå til: navigasjon, søk

oppgave 17.1

Hashing with division and hash table with linked chaining

34,45,3,87,65,32,1,12,17

Hashcode(key) = Math.abs(key)%p
Hvor p = 11

1   34,45,1,12
2
3   3
4
5
6   17
7
8
9
10  87,65,32
11

oppgave 17.2

Hashing with division and hash table using array chaining

34,45,3,87,65,32,1,12,17

Hashcode(key) = Math.abs(key)%p
Hvor p = 11

1   34, >> [1]
2
3   3
4
5
6   17
7
8
9
10  87, >> [2]
11

Oerflow table
1   45, >> [4]
2   65, >> [3]
3   32
4   1,  >> [5]
5   12
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

oppgave 17.3

Open addressing using linear probing

34,45,3,87,65,32,1,12,17

Hashcode(key) = Math.abs(key)%p
Hvor p = 17

1   34, >> [2]
2   87, >> [3]
3   3,  >> [4]
4   1,  >> [5]
5   17
6
7
8
9
10
11  45
12  12
13
14  65
15  32
16
17

oppgave 17.4

Open addressing using quadratic probing

34,45,3,87,65,32,1,12,17

=hashcode(x)+((-1)^(i-1))*((i+1)/2)^2
Hvor i = 1.17


1   34, {(87) >> [2]}, {(1) >> [2]}, {(17) >> [2]}
2   87, {(1) >> [5]}, {(17) >> [4]}
3   3  
4   17
5   1
6
7
8
9
10
11  45
12  12
13
14  65
15  32
16
17

oppgave 17.5

Open addressing using double hashing exstraction of 1 digit as secondary hashing function

34,45,3,87,65,32,1,12,17

=hashcode(x)+((-1)^(i-1))*((i+1)/2)^2
Hvor i = 1.17

1   34, {(87) >> [2]}, {(1) >> [2]}, {(17) >> [2]}
2   87, {(1) >> [5]}, {(17) >> [4]}
3   3  
4   17
5   1
6
7
8
9
10
11  45
12  12
13
14  65
15  32
16
17

oppgave 17.2 s542

package oppgavesett7;

import java.util.HashSet;
import java.util.Iterator;

public class Person2 {
    private String navn;

    public Person2(String navn) {
        this.navn = navn;
    }

    public String toString() {
        return "" + navn;
    }

    public boolean equals(Object obj) {
        Person2 p = (Person2)obj;
        return navn == p.navn;
    }

    // Overstyrer hashCode fra klassen Object:

    public int hashCode() {
        // tja hva skal man si var jo denne logaritmen beskrevet i boka
        return navn.toCharArray()[0]%32;
    }


    public static void main(String[] args) {
        
        Person2[] p = new Person2[8];
        p[0] = new Person2("Ann");
        p[1] = new Person2("Dough");
        p[2] = new Person2("Elizabeth");
        p[3] = new Person2("Hal");
        p[4] = new Person2("Mary");
        p[5] = new Person2("Tim");
        p[6] = new Person2("Walter");
        p[7] = new Person2("Young");

        HashSet<Person2> h = new HashSet<Person2>();
        for (int i = 0; i < p.length; i++) {
            h.add(p[i]);
        }

        Person2 test = new Person2("Andrew");

        // Andrew blir lagt inn i den lenkede lista
        h.add(test);

        if (h.contains(test))
            System.out.println("" + test + " finnes!");
        else
            System.out.println("" + test + " finnes ikke!");

        for (int i = 0; i < p.length; i++) {
            if (h.contains(p[i]))
                System.out.println("" + p[i] + " finnes!");
            else
                System.out.println("" + p[i] + " finnes ikke!");
        }
        
        System.out.print("\nHashtabellen inneholder : ");
        Iterator it = h.iterator();
        while (it.hasNext()) System.out.print(it.next()+" ");

    }
}

Oppgave 3

package oppgavesett7;

import java.util.Random;


/*
 *  Skriv et program som teller opp antall kollisjoner i en lang random sekvens
 *  av insettinger i hashtabeller med åpen adressering når lineær søk,
 *  kvadratisk søk og dobbel hashing benyttes.
 *  Kjør programmet med forskjellige verdier for tabellens lengde
 *  (primtall/ikke primtall). Gjør en oppsummering av resultatene
 *
 *  (Du trenger kun å beregne posisjonene til elementene i tabellene,
 *  oppgaven forutsetter altså ikke at du har implementert forskjellige
 *  varianter av hashtabellene).
 */
public class Collisions {
    static int antall_tall=10;
    static int max_tall=100;
    static int tabell_lengde=81;
    
    public Collisions() {
    }
    
    public static void openLinear(int[] tallrekke){
        int[] hashTabel = new int[tabell_lengde];
        int total_collision = 0;
        
        for (int i=0;i<antall_tall;i++){
            hashTabel[tallrekke[i]%tabell_lengde]++;
        }
        
        System.out.println("\n### Open linear ###\nAntall kollisjoner pr plass i hashtabellen");

        for (int i=0;i<tabell_lengde;i++){
            System.out.print(i+"-"+hashTabel[i]+" ");
            if (hashTabel[i]>1) total_collision += hashTabel[i]-1;
        }
        
        System.out.println("\nDet var totalt "+total_collision+" kollisjoner");
    }
    
    public static void openQuadratic(int[] tallrekke){
        int[] hashTabel = new int[tabell_lengde];
        int total_collision = 0;
        
        for (int h=0;h<tallrekke.length;h++){
            int i = 1;
            while(i<tabell_lengde)
            {
                if (hashTabel[i]<1) {
                    hashTabel[i]++;System.out.print(i+" ");
                    i=tabell_lengde;
                }
                
                double p = (int)Math.pow((double)i,2.0);
                i = (int)p+i;
                //
                   
            }
        }
             
        System.out.println("\n### Open Quadratic ###\nAntall kollisjoner pr plass i hashtabellen");

        for (int j=0;j<tabell_lengde;j++){
            System.out.print(j+"-"+hashTabel[j]+" ");
            if (hashTabel[j]>1) total_collision += hashTabel[j]-1;
        }
        
        System.out.println("\nDet var totalt "+total_collision+" kollisjoner");
    }
    
    public void openDouble(int[] tallrekke){
    
    }

    public static void main(String[] args) {
        Collisions collisions = new Collisions();
        
        Random generator = new Random();
        int[] tallrekke = new int[antall_tall];
        
        // Lager en tilfeldig tallrekke
        for (int i=0;i<antall_tall;i++){
            tallrekke[i] = generator.nextInt(max_tall);
            System.out.print(tallrekke[i]+" ");
        }
        
        System.out.println();
        openLinear(tallrekke);
        openQuadratic(tallrekke);
        
    }
    
}