我不知道錯誤在哪裏(插入表)。它是我的代碼片段(插入到開放尋址哈希表中)。線性和雙尋址都不錯,但與此(二次函數處理)的一些錯誤ArrayIndexOutOfBoundsException將整數值插入散列表時
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -848
at openaddresshash.OpenAddressHash.insertKwadratowe(OpenAddressHash.java:101)
at openaddresshash.OpenAddressHash.main(OpenAddressHash.java:261)
Java Result: 1
我知道這是什麼問題這一行:
int index = ((start + (c1 * i) + (c2 * i * i))) % size;
但在我看來,它的一切都很好becouse我的函數(指數)應該是這樣的:
h(k,i) = (h'(k) + c1*i + c2*i^2) mod m
where h'(k) = k mod m
我的代碼:
for(int d = 25; d<=2500; d+=25)
{
int liczba=4*d;
OpenAddressHash hstb = new OpenAddressHash(liczba);
int jj=2*d;
hstb.AdresowanieKwadratoweDane(1, jj);
Losowania los = new Losowania(); // random values
los.Losowe(liczba);
for(int yy=0; yy<liczba; yy++)
{
hstb.insertKwadratowe(los.trzy[yy]);//trzy is a table with random values
if((yy%(Math.ceil(liczba/50)))==0)
{
AdresowanieKwadratowe.println(liczba+" "+yy+" "+hstb.s);
}
hstb.s=0;
}
}
static public class SLOT
{
public int key;
public STATUS stat;
public SLOT()
{
stat = STATUS.INVALID;
}
}
public void AdresowanieKwadratoweDane(int c1, int c2)
{
this.c1 = c1;
this.c2 = c2;
}
public OpenAddressHash(int n)
{
table = new SLOT[n];
for (int i = 0; i < table.length; i++)
{
table[i] = new SLOT();
}
}
public int insertKwadratowe(int key)
{
int size = table.length;
int start = key%size;
for (int i = 0; i < size; i++)
{
s++;
int index = ((start + (c1 * i) + (c2 * i * i))) % size;
if (table[index].stat == STATUS.INVALID ||
table[index].stat == STATUS.DELETED)
{
table[index] = new SLOT();
table[index].key = key;
table[index].stat = STATUS.OCCUPIED;
return index;
}
}
return -1;
}
public void AdresowanieKwadratoweDane(int c1, int c2)
{
this.c1 = c1;
this.c2 = c2;
}
哪條線拋出異常? – Taylor
我知道錯誤在哪裏:它位於OpenAddressHash.java的第101行。某處可能有一個負整數,或整數溢出。使用你的調試器。 –
計算'index'的公式可能有些問題。很難弄清楚,不知道代碼中究竟發生了什麼。 –