加快阵列重建效率

时间:2019-10-11 10:02:41

标签: arrays sorting pseudocode

如果我有两个整数数组,例如[100, 50, 32, 23][40, 30, 32, 125],再加上数字50,则应该删除第一个数组中大于该数字的数字以及第二个数组中对应的索引对。

如果我对每个元素值手动执行此操作,并在每次遍历10,000个元素时每次都重新构建int数组,这会不会效率极低/缓慢?

input 50:
new array changes:
[50, 32, 23]
[30, 32, 125]
到目前为止的

伪代码: for each value in array one that is greater than input, remove it and rebuild both arrays, continue

不确定要如何找到更有效/更快的方法,应该如何去学习?应该怎么走?

3 个答案:

答案 0 :(得分:1)

我将为您的2个数组创建一个SortedMap,然后使用小于或等于您的输入参数的键提取对:

假设您的数组是这样的:

int[] array_1;
int[] array_2;

将这些数组转换为地图:

NavigableMap<Integer, Integer> my_map = new TreeMap();
int                            index;
for (index = 0; index < array_1.length; index++)
  my_map.put(array_1[index], array_2[index]);

现在获取所有键值不大于您指定的键对的对:

NavigableMap<Integer, Integer> result;
result = my_map.headMap(50, true);

将结果转换为新数组:

array_1 = new int[result.size()];
array_2 = new int[array_1.length];
Iterator<Integer> it = result.keySet().iterator();
index = 0;
Integer key;
while (it.hasNext())
{
  key = it.next();
  array_1[index] = key;
  array_2[index] = result.get(key);
  index++;
}

当然,将对最终结果进行排序。不确定是否有问题。
因此,您的结果将是[23, 32, 50] [125, 32, 30]
此外,它假定键(第一个数组中的元素)是唯一的。

答案 1 :(得分:1)

这是一个 O(n)实现。它遍历数组一次,以查找将保留多少个元素,创建也保存结果的新数组,然后将应小于或等于限制的整数复制到新数组中。我假设这两个数组在int[][]中保持在一起,因为这是传递它们的最有效方法。

public static int[][] removeGreaterThan(int[][] arrays, int limit) {
    int retained = 0;
    for (int i = 0; i < arrays[0].length; i++) {
        if (arrays[0][i] <= limit) retained++;
    }

    int[][] result = new int[][] {new int[retained], new int[retained]};
    int j = 0;
    for (int i = 0; i < arrays[0].length; i++) {
        if (arrays[0][i] <= limit) {
            result[0][j] = arrays[0][i];
            result[1][j] = arrays[1][i];
            j++;
        }
    }

    return result;
}

像这样使用它。

int[][] arrays = new int[][] {{100, 50, 32, 23}, {40, 30, 32, 125}};
int[][] result = removeGreaterThan(arrays, 50);

// you can check to make sure the values are correct
System.out.println(Arrays.asList(result[0]);
System.out.println(Arrays.asList(result[1]);

答案 2 :(得分:0)

一种改善伪代码的方法是:

for each iteration
    find indexes of first array which are greater than the number.
    store indexes in a list.

remove all the elements of the first array using index list. // I can tell you more here but you should give it a try.
remove all the elements of the second array.