数据离散化

来源:互联网 发布:淘宝财富值在哪看 编辑:程序博客网 时间:2024/06/08 06:02

离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据:1,999,100000,15
离散化后:1,3,4,2

如果我们关注的不是数据本身的大小,而是数据的相对大小,则可以使用离散化处理。

实现:
把N个大小不确定的数映射到1-N的数列上:

package study;import java.util.*;/*** @file Discretization.java* @CopyRight (C) http://blog.csdn.net/x_iya* @Description 离散化* @author N3verL4nd* @email lgh1992314@qq.com* @date 2017/9/11*/public class Discretization {    class Node implements Comparable<Node> {        int pos;        int value;        public Node(int pos, int value) {            this.pos = pos;            this.value = value;        }        @Override        public int compareTo(Node o) {            if (value == o.value) {                return pos - o.pos;            }            return value - o.value;        }    }    public void discrete(int[] arr) {        int len = arr.length;        Node[] nodes = new Node[len];        for (int i = 0; i < len; i++) {            nodes[i] = new Node(i, arr[i]);        }        Arrays.sort(nodes);        int i, j;        for (i = 0, j = 1; i < len - 1; i++, j++) {            arr[nodes[i].pos] = j;            if (nodes[i].value == nodes[i + 1].value) {                j--;            }        }        arr[nodes[i].pos] = j;    }    public static void main(String[] args) {        // 构造随机序列        Random random = new Random();        int len = random.nextInt(10);        int arr[] = new int[len];        for (int i = 0; i < len; i++) {            arr[i] = random.nextInt(100);        }        // 打印随机序列        System.out.println(Arrays.toString(arr));        // 离散化        Discretization discretization = new Discretization();        discretization.discrete(arr);        // 打印离散化后的随机序列        System.out.println(Arrays.toString(arr));    }}

相同的元素需要进行特殊处理。

原创粉丝点击