90 lines
2.5 KiB
Java
90 lines
2.5 KiB
Java
|
/*
|
||
|
(C) Copyright Taligent, Inc. 1996 - All Rights Reserved
|
||
|
(C) Copyright IBM Corp. 1996 - All Rights Reserved
|
||
|
|
||
|
The original version of this source code and documentation is copyrighted and
|
||
|
owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These materials are
|
||
|
provided under terms of a License Agreement between Taligent and Sun. This
|
||
|
technology is protected by multiple US and International patents. This notice and
|
||
|
attribution to Taligent may not be removed.
|
||
|
Taligent is a registered trademark of Taligent, Inc.
|
||
|
*/
|
||
|
|
||
|
package com.ibm.text.utility;
|
||
|
|
||
|
public class FastByteBinarySearch
|
||
|
{
|
||
|
private byte dataArray[];
|
||
|
private int auxStart;
|
||
|
private int power;
|
||
|
|
||
|
private static final int exp2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072 };
|
||
|
|
||
|
public FastByteBinarySearch(byte data[])
|
||
|
{
|
||
|
if (data.length < 1) throw new IllegalArgumentException();
|
||
|
if (data.length >= exp2[exp2.length-1]) throw new IllegalArgumentException();
|
||
|
dataArray = data;
|
||
|
for (power = exp2.length-1; power > 0 && dataArray.length < exp2[power]; power--) {}
|
||
|
if (exp2[power] != dataArray.length) {
|
||
|
auxStart = dataArray.length - exp2[power];
|
||
|
}
|
||
|
else {
|
||
|
auxStart = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public byte[] getData()
|
||
|
{
|
||
|
return dataArray;
|
||
|
}
|
||
|
|
||
|
public int findIndex(int value)
|
||
|
{
|
||
|
int index = exp2[power]-1;
|
||
|
if (value >= dataArray[auxStart]) {
|
||
|
index += auxStart;
|
||
|
}
|
||
|
|
||
|
switch (power) {
|
||
|
case 17:
|
||
|
if (value < dataArray[index-65536]) index -= 65536;
|
||
|
case 16:
|
||
|
if (value < dataArray[index-32768]) index -= 32768;
|
||
|
case 15:
|
||
|
if (value < dataArray[index-16384]) index -= 16384;
|
||
|
case 14:
|
||
|
if (value < dataArray[index-8192]) index -= 8192;
|
||
|
case 13:
|
||
|
if (value < dataArray[index-4096]) index -= 4096;
|
||
|
case 12:
|
||
|
if (value < dataArray[index-2048]) index -= 2048;
|
||
|
case 11:
|
||
|
if (value < dataArray[index-1024]) index -= 1024;
|
||
|
case 10:
|
||
|
if (value < dataArray[index-512]) index -= 512;
|
||
|
case 9:
|
||
|
if (value < dataArray[index-256]) index -= 256;
|
||
|
case 8:
|
||
|
if (value < dataArray[index-128]) index -= 128;
|
||
|
case 7:
|
||
|
if (value < dataArray[index-64]) index -= 64;
|
||
|
case 6:
|
||
|
if (value < dataArray[index-32]) index -= 32;
|
||
|
case 5:
|
||
|
if (value < dataArray[index-16]) index -= 16;
|
||
|
case 4:
|
||
|
if (value < dataArray[index-8]) index -= 8;
|
||
|
case 3:
|
||
|
if (value < dataArray[index-4]) index -= 4;
|
||
|
case 2:
|
||
|
if (value < dataArray[index-2]) index -= 2;
|
||
|
case 1:
|
||
|
if (value < dataArray[index-1]) index -= 1;
|
||
|
case 0:
|
||
|
if (value < dataArray[index]) index -= 1;
|
||
|
}
|
||
|
return index;
|
||
|
}
|
||
|
|
||
|
}
|