定义

在不改变数值相对大小的情况下,即大小顺序不变,修改数值以缩小数据范围。
参见百度百科:离散化

实现

允许有相同的数,相同的数离散化后任仍然一样。

  1. import java.util.Iterator;
  2. import java.util.SortedSet;
  3. import java.util.TreeSet;
  4. public class Discretization {
  5. // 原始数组
  6. private int[] raw;
  7. // 离散化后的数组
  8. private int[] value;
  9. /**
  10. * 构造函数
  11. *
  12. * @param a 原始数组
  13. */
  14. public Discretization(int[] a) {
  15. raw = a.clone();
  16. // TreeSet可以同时实现排序和去重
  17. SortedSet<Integer> tmpSet = new TreeSet<Integer>();
  18. for (int i : a) {
  19. tmpSet.add(i);
  20. }
  21. int[] tmpArray = new int[tmpSet.size()];
  22. int index = 0;
  23. for (Iterator<Integer> i = tmpSet.iterator(); i.hasNext(); ) {
  24. tmpArray[index++] = i.next();
  25. }
  26. value = raw.clone();
  27. for (int i = 0; i < value.length; ++i) {
  28. value[i] = lowerBound(tmpArray, value[i]);
  29. }
  30. }
  31. /**
  32. * 大于等于target的最小数的下标
  33. *
  34. * @param a 已升序排列的数组
  35. * @param target 下限值
  36. * @return 大于等于target的最小数的下标
  37. */
  38. private int lowerBound(int[] a, int target) {
  39. int l = 0;
  40. int r = a.length - 1;
  41. int mid;
  42. while (l < r) {
  43. mid = (l + r) / 2;
  44. if (a[mid] >= target) {
  45. r = mid;
  46. } else {
  47. l = mid + 1;
  48. }
  49. }
  50. return l;
  51. }
  52. public int[] getRaw() {
  53. return raw;
  54. }
  55. public int[] getValue() {
  56. return value;
  57. }
  58. }

参考链接

https://blog.csdn.net/Viscu/article/details/82631062