定义
在不改变数值相对大小的情况下,即大小顺序不变,修改数值以缩小数据范围。
参见百度百科:离散化
实现
允许有相同的数,相同的数离散化后任仍然一样。
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
public class Discretization {
// 原始数组
private int[] raw;
// 离散化后的数组
private int[] value;
/**
* 构造函数
*
* @param a 原始数组
*/
public Discretization(int[] a) {
raw = a.clone();
// TreeSet可以同时实现排序和去重
SortedSet<Integer> tmpSet = new TreeSet<Integer>();
for (int i : a) {
tmpSet.add(i);
}
int[] tmpArray = new int[tmpSet.size()];
int index = 0;
for (Iterator<Integer> i = tmpSet.iterator(); i.hasNext(); ) {
tmpArray[index++] = i.next();
}
value = raw.clone();
for (int i = 0; i < value.length; ++i) {
value[i] = lowerBound(tmpArray, value[i]);
}
}
/**
* 大于等于target的最小数的下标
*
* @param a 已升序排列的数组
* @param target 下限值
* @return 大于等于target的最小数的下标
*/
private int lowerBound(int[] a, int target) {
int l = 0;
int r = a.length - 1;
int mid;
while (l < r) {
mid = (l + r) / 2;
if (a[mid] >= target) {
r = mid;
} else {
l = mid + 1;
}
}
return l;
}
public int[] getRaw() {
return raw;
}
public int[] getValue() {
return value;
}
}