定义
在不改变数值相对大小的情况下,即大小顺序不变,修改数值以缩小数据范围。
参见百度百科:离散化
实现
允许有相同的数,相同的数离散化后任仍然一样。
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;}}
