21 |
21 |
private int mBucketBytes;
|
22 |
22 |
private int mNumBuckets;
|
23 |
23 |
private int mLevel;
|
|
24 |
private int[] mBucketOffsets;
|
24 |
25 |
|
25 |
26 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
26 |
27 |
|
... | ... | |
60 |
61 |
|
61 |
62 |
private int getBucketOffset(int bucket)
|
62 |
63 |
{
|
63 |
|
if( bucket>=mNumBuckets ) return mData.length;
|
|
64 |
if( mBucketOffsets[bucket]==0 )
|
|
65 |
{
|
|
66 |
if( bucket>=mNumBuckets ) mBucketOffsets[bucket] = mData.length;
|
|
67 |
else
|
|
68 |
{
|
|
69 |
int ret = 0;
|
|
70 |
int start = HEADER_SIZE + bucket*mBucketBytes;
|
64 |
71 |
|
65 |
|
int ret = 0;
|
66 |
|
int start = HEADER_SIZE + bucket*mBucketBytes;
|
|
72 |
for(int i=0; i<mBucketBytes; i++)
|
|
73 |
{
|
|
74 |
ret<<=8;
|
|
75 |
ret += ( ((int)(mData[start+i]))&0xff);
|
|
76 |
}
|
67 |
77 |
|
68 |
|
for(int i=0; i<mBucketBytes; i++)
|
69 |
|
{
|
70 |
|
ret<<=8;
|
71 |
|
ret += ( ((int)(mData[start+i]))&0xff);
|
|
78 |
mBucketOffsets[bucket] = HEADER_SIZE+mNumBuckets*mBucketBytes+ret;
|
|
79 |
}
|
72 |
80 |
}
|
73 |
81 |
|
74 |
|
return HEADER_SIZE+mNumBuckets*mBucketBytes+ret;
|
|
82 |
return mBucketOffsets[bucket];
|
75 |
83 |
}
|
76 |
84 |
|
77 |
85 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
... | ... | |
235 |
243 |
mNumBuckets = (size+entrySize-1)/entrySize;
|
236 |
244 |
int[] bucket = new int[mNumBuckets];
|
237 |
245 |
|
|
246 |
mBucketOffsets = new int[mNumBuckets+1];
|
|
247 |
|
238 |
248 |
for(int i=0; i<size; i++)
|
239 |
249 |
if( table.retrieveUnpacked(i)==level )
|
240 |
250 |
{
|
... | ... | |
309 |
319 |
mBucketBytes = ((int)mData[1])&0xff;
|
310 |
320 |
mNumBits = ((int)mData[2])&0xff;
|
311 |
321 |
mNumBuckets =((((int)mData[3])&0xff)<<16) + ((((int)mData[4])&0xff)<<8) + (((int)mData[5])&0xff);
|
|
322 |
|
|
323 |
mBucketOffsets = new int[mNumBuckets+1];
|
312 |
324 |
}
|
313 |
325 |
|
314 |
326 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
... | ... | |
343 |
355 |
|
344 |
356 |
int lower = 0;
|
345 |
357 |
int upper = numEntriesInBucket-1;
|
|
358 |
int rem = (bucket<<mNumBits);
|
346 |
359 |
|
347 |
360 |
while( upper>=lower )
|
348 |
361 |
{
|
349 |
362 |
int mid = (lower+upper)/2;
|
350 |
|
int value = retrieveData(offset1,mid);
|
351 |
|
|
352 |
|
value += (bucket<<mNumBits);
|
|
363 |
int value = retrieveData(offset1,mid) + rem;
|
353 |
364 |
if( value==number ) return true;
|
354 |
|
|
355 |
365 |
if( value>number ) upper = mid-1;
|
356 |
366 |
else lower = mid+1;
|
357 |
367 |
}
|
speedup in PruningTable