java - 整数域到定域映射数组的应用与实现

标签 java c++ algorithm functional-programming binary-search

假设给定了一个可以占据整个整数空间的整数数组。但是,我想将其映射到固定范围。

例如: {1, 5, 38, 5, 2^32-1} ---> {1, 2, 3, 2, 4}请注意重复的元素值“5”及其映射数组。与顺序无关。

除了分域树(分域树需要 1..N 的范围)之外,还有其他应用吗?

一种方法是,

int[] map( int[]  a) {
    int[] transArr = new int[a.length];
    Map<Integer,Integer> posValueMap = new HashMap<Integer,Integer>();
    for(int i= 0 ; i < a.length; i++) {
       if(!posValueMap.contains(i))
          posValueMap.put(a[i], i);
    }
    for(int i= 0 ; i < transArr.length; i++) {
        transArr[i] = posValueMap.get(a[i]);
    }
    return transArr;
}

是否有更简单的方法来使用不同的算法或函数式编程构造来实现这一目标?

最佳答案

看来你需要某种 perfect hashing .

最小完美散列函数将 N 个不同元素的集合映射到 0..N-1 或 1..N 范围内的 N 个整数键,如您所愿。

(有 MPH 的开源库)

关于java - 整数域到定域映射数组的应用与实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34361037/

相关文章:

java - 如何从 Jtable 中获取所有值并绘制它们的图表?

java - Java中 boolean 数组的大小是多少

java - 将组件添加到 controlfx maskerpane

c++ - 立即在不同的线程上通过 IP 发送

algorithm - Fenwick Trees 中的更新步骤

java - 如何使用合并的单元格值大于单元格宽度的 Apache-POI 增加 excel 行的高度?

c++ - 如何将任何值转换为字节数组并将其附加到字节列表?

c++ - 如何进行正确的 2d 网格到圆碰撞检测

ruby - 搜索单词中是否包含特里集

c++ - 如何使用 DP 用 n 种不同的颜色绘制 r x r 字段,而不在同一行使用相同的颜色