어디에 오류가 있는지 알 수 없습니다 (표에 삽입). 그것은 내 코드 조각 (열린 주소 해시 테이블에 삽입)입니다. 주소 선형 및 더블 좋지만해시 테이블에 정수 값을 삽입 할 때 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;
그러나 내 생각은 모든 것을 잘 렸기 때문에에 해야 내 기능 (인덱스)과 같이 보인다 :
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;
}
예외를 throw하는 행은 무엇입니까? – Taylor
어디서 오류인지 알고 있습니다 : OpenAddressHash.java의 101 행에 있습니다. 어딘가에 음의 정수가 있거나 정수가 넘칠 수 있습니다. 디버거를 사용하십시오. –
'index'를 계산하는 공식에 문제가있는 것 같습니다. 알아 내기가 어렵지만 코드에서 실제로 진행되는 작업을 알지 못합니다. –