Sorry, glaub auch, dass das das Beste ist. Hier isser:
Java:
package blatt7_aufgabe1;importjava.util.LinkedList;publicclassMyHashSetimplementsHashInterface{int n;LinkedList<Integer> list =newLinkedList<Integer>();publicMyHashSet(int size){
n = size;for(int i =0; i < n; i++){
list.add(null);// Generating n buckets... is that right? }}privateinthash(int x){int m = n -1;// Something's wrong. Can you see what? x_X return x % m;}publicvoidinsert(int value){if(!(hasValue(value))){
list.remove(hash(value));
list.add(hash(value), value);}}publicvoiddelete(int value){if(hasValue(value)){
list.remove(hash(value));}}publicbooleanhasValue(int value){int hash =hash(value);Integer element = list.get(hash);//return (element != null);if(element ==null)returnfalse;elsereturntrue;}publicdouble[]statistics(){// needs implementation desperately... returnnull;}}
es kommt halt drauf an was man bei 5 elementen vor hast
also grundsätzlich funktioniert das mit hashvalue schon..
hier musst du aufpassen..
list.remove(hash(value));
achtung... du vernichtest dein bucket. also wenn du remove machst und du hast 2, 3, 4 drinnen, machst ein remove auf 3 dann ist 4 anstelle von 3... du willst eher 3 auf null setzen..
Also du füllst dein komplettes Hashset, hast ne Hashfunktion die dir lediglich mit modulo die hashs berechnet. Und dann kommts dir komisch vor dass alle prüfungen auf hasValue true ergeben?
EDIT:
Du solltest anstatt der Liste ne Map<Integer, Integer> nehmen und die Hashfunktion gegen eine geignetere (z.b. von Eclipse generierte) austauschen, dann solltest du weniger Kollisionen haben und deine Tests sollten hinhaun
hier musst du aufpassen..
list.remove(hash(value));
achtung... du vernichtest dein bucket. also wenn du remove machst und du hast 2, 3, 4 drinnen, machst ein remove auf 3 dann ist 4 anstelle von 3... du willst eher 3 auf null setzen..
Also du füllst dein komplettes Hashset, hast ne Hashfunktion die dir lediglich mit modulo die hashs berechnet. Und dann kommts dir komisch vor dass alle prüfungen auf hasValue true ergeben?
EDIT:
Du solltest anstatt der Liste ne Map<Integer, Integer> nehmen und die Hashfunktion gegen eine geignetere (z.b. von Eclipse generierte) austauschen, dann solltest du weniger Kollisionen haben und deine Tests sollten hinhaun
Ich hab mir jetzt mal gedacht, dass ich ein array mache, wo LinkedList<Integer>'s drin sind und Integer. Bloß weiß ich nicht, wie ich das abfragen soll. Und warum soll ich 'ne Map nehmen? Das kenn' ich gar nicht. Wie funktioniert das?
Also was ich bis jetzt geschaffen habe ist:
Java:
package blatt7_aufgabe1;importjava.util.LinkedList;publicclassMyHashSetimplementsHashInterface{int n;Object[] array;publicMyHashSet(int size){
n = size;for(int i =0; i < n; i++){
array[i]=null;}}privateinthash(int x){int m = n;// Something's wrong. Can you see what? x_X return x % m;}publicvoidinsert(int value){if(!(hasValue(value))){
array[hash(value)]= value;}elseif(hasValue(value)){LinkedList<Integer> foo =newLinkedList();
foo.add(value);// TODO write foo into the array }}publicvoiddelete(int value){/*if (hasValue(value)) {
list.remove(hash(value));
}*/}publicbooleanhasValue(int value){Object element = array[hash(value)];if(element ==null)returnfalse;/* if (element an Integer)
* if (element == value)
* return true;
* else if (element a LinkedList<Integer>)
* if (element.contains(value)
* return true;
* else
* return false;
*/}publicdouble[]statistics(){// needs implementation desperately... returnnull;}}
Bloß den groß auskommentierten Teil kann ich nicht implementieren. Keine Ahnung wie.
Ich hab mir jetzt mal gedacht, dass ich ein array mache, wo LinkedList<Integer>'s drin sind und Integer. Bloß weiß ich nicht, wie ich das abfragen soll. Und warum soll ich 'ne Map nehmen? Das kenn' ich gar nicht. Wie funktioniert das?
Erstmal zum warum:
Du hast in deinem Array n mögliche Keys. Wenn du deine Hashfunktion auf die keys (0...n-1) abbildest dann bekommst du sehr viele Kollisionen , und das ist in ner hashmap immer mist.
Nimmst du ne Map<Integer, Integer> dann hast du als möglichen Wertebereich den Wertebereich Integer.MIN_VALUE bis Integer.MAX_VALUE. Mit ner geschickten Hashfunktion kannst du damit dann deine anzahl an Kollisionen verringern und bekommst somit auch genauere Werte bei hasValue.
Zur Anwendung:
einfach mal googlen
Erstmal zum warum:
Du hast in deinem Array n mögliche Keys. Wenn du deine Hashfunktion auf die keys (0...n-1) abbildest dann bekommst du sehr viele Kollisionen , und das ist in ner hashmap immer mist.
Nimmst du ne Map<Integer, Integer> dann hast du als möglichen Wertebereich den Wertebereich Integer.MIN_VALUE bis Integer.MAX_VALUE. Mit ner geschickten Hashfunktion kannst du damit dann deine anzahl an Kollisionen verringern und bekommst somit auch genauere Werte bei hasValue.
Zur Anwendung:
einfach mal googlen
OK, gut, aber da ich nur Zahlen abspeichern will kann ich doch auch 'n Array von LinkedLists machen? Denn auf dem Aufgabenblatt steht (diesmal zum ersten Mal) "Sie dürfen java.util.LinkedList verwenden". Ich gehe also davon aus, dass eine Lösung LinkedLists verwenden soll und sonst eher nichts, da keine Aussage darüber gemacht wurde, ob andere java.*s benutzt werden dürfen. Und in dieser Veranstaltung zählen die Blätter schon auf die finale Note drauf. D.h. ich will da kein Risiko eingehen.
Ich bastel noch ein bisschen und poste dann mal wieder 'ne geupdatete Version. Hoffentlich ist die dann auch fertig Ansonsten hoffe ich, hier weiter Hilfe zu erhalten, ihr seid super(,) Leute! (nur so nebenbei)
OK, danke für alle Tips bis hierher. Ich hab's jetzt mal so gemacht, hoffe, das findet eure Zustimmung. [edit: jetzt müsste auch die statistics() so stimmen] Findet noch wer 'nen Fehler? Ansonsten halt close, ne? ^^
Java:
package blatt7_aufgabe1;importjava.util.LinkedList;publicclassMyHashSetimplementsHashInterface{int n;LinkedList[] array;publicMyHashSet(int size){
n = size;
array =newLinkedList[n];for(int i =0; i < n; i++){
array[i]=null;}}privateinthash(int x){int m = n;// Something's wrong. Can you see what? x_X return x % m;}publicvoidinsert(int value){if(!(hasValue(value))){if((array[hash(value)])!=null)
array[hash(value)].add(value);else{
array[hash(value)]=newLinkedList<Integer>();
array[hash(value)].add(value);}}}publicvoiddelete(int value){Integer valueObj = value;if(hasValue(value)){
array[(hash(value))].remove(valueObj);}}publicbooleanhasValue(int value){LinkedList<Integer> list = array[hash(value)];if(list !=null)return list.contains(value);returnfalse;}publicdouble[]statistics(){double min_size =Integer.MAX_VALUE, max_size =0, mean_size =0, deviation =0;for(int i =0; i < n; i++){if(array[i]!=null){int size = array[i].size();if(size < min_size)
min_size = size;if(size > max_size)
max_size = size;
mean_size += size;}}
mean_size /= n;for(int i =0; i < n; i++){if(array[i]!=null){int size = array[i].size();
deviation +=Math.pow(size - mean_size,2);}}
deviation /= n;
deviation =Math.sqrt(deviation);double[] result =newdouble[4];
result[0]= min_size;
result[1]= max_size;
result[2]= mean_size;
result[3]= deviation;return result;}}
Ja, ich weiß, das ist ziemlich hässlich, aber darüber steht ja auskommentiert dasselbe, was du wolltest. Ich war mir nur kurz mal nicht sicher, weil irgendwie gar nichts ging, und hab' dann erstmal foolproof getestet.
Ja, ich weiß, das ist ziemlich hässlich, aber darüber steht ja auskommentiert dasselbe, was du wolltest. Ich war mir nur kurz mal nicht sicher, weil irgendwie gar nichts ging, und hab' dann erstmal foolproof getestet.