【问题标题】:Min & Max of subset of map地图子集的最小值和最大值
【发布时间】:2014-06-09 20:54:54
【问题描述】:

当我逐个元素地遍历地图时,我需要找到最小值和最大值,如图所示(“索引”是地图的键数组的位置):

/**even: lowest, odd: highest*/
private Double[] getLowestAndHighestValues(final int index, final int timeRange, ConcurrentSkipListMap<String, Double> ... maps){

    if(maps != null && maps.length > 0){
        ArrayList<Object[]> keyArrayList = new ArrayList<>();
        for(int i = 0; i < maps.length; i++){
            try{
                ConcurrentSkipListMap<String, Double> map = maps[i];
                keyArrayList.add(map.keySet().toArray());
            }
            catch(Exception e){

            }
        }

        Double[] values = new Double[maps.length * 2];
        for(int i = index - timeRange; i < index; i++){
            if(i >= 0){
                for(int x = 0; x < maps.length; x++){
                    try{
                        if(x >= 0){
                            ConcurrentSkipListMap<String, Double> map = maps[x];
                            if(map != null){

                                final Object[] keyArray = keyArrayList.get(x);
                                final String key = (String) keyArray[i];
                                Double value = map.get(key);
                                if(value != null && !Double.isNaN(value)){
                                    if(values[x * 2] == null){
                                        values[x * 2] = value;
                                    }
                                    else{
                                        if(values[x * 2] > value){
                                            values[x * 2] = value;
                                        }
                                    }

                                    if(values[(x * 2) + 1] == null){
                                        values[(x * 2) + 1] = value;
                                    }
                                    else{
                                        if(values[(x * 2) + 1] < value){
                                            values[(x * 2) + 1] = value;
                                        }
                                    }
                                }

                            }
                        }
                    }
                    catch(Exception e){}
                }
            }
        }
        return values;
    }
    return null;
}

上面显示的糟糕代码需要非常长的时间并且是一个真正的瓶颈,尤其是当我每次索引增加时都必须获取地图子集的最小值和最大值时。有谁知道我怎样才能更快地实现相同的目标(获取每个地图子集的最高和最低值)?

谢谢。

【问题讨论】:

  • 我的眼睛在流血。也许您应该重新考虑您的逻辑,以便在每次更改地图时使用第二个结构来保持最小值/最大值。
  • 最小值和最大值是什么?最小值和最大值(双精度)?
  • 请清楚地说明您的签名要求。对于索引在位置index - timeRangeindex 的值,您是否需要返回每个Map 的最小值和最大值?由于这种类型的 Map 的键按自然顺序排序,index 作为int 真的适用吗?您是缩进自然顺序位置还是插入顺序位置?通常在 Maps 中使用索引值是一种反模式。
  • 我正在尝试获取地图数组子集的最小值和最大值。地图没有改变,但只要地图元素指针“index”指向的位置增加,就会重复调用该方法。另外,我相信我已经包含了代码,它应该可以告诉您我正在尝试做什么。

标签: java performance optimization


【解决方案1】:

首先,从一个更简单的算法开始。

  • 每张地图

1 获取值的数组

2 使用数组将子数组从索引(索引时间,索引)复制到一个新数组

3 使用数组对子数组进行排序

4 获取第一个和最后一个值

【讨论】:

  • 在这里排序是不必要的低效,直接计算最小值和最大值很容易。
猜你喜欢
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2013-06-05
  • 2017-01-12
  • 2023-04-02
相关资源
最近更新 更多