如何找到整数数组中每个元素的等级

时间:2015-08-10 11:37:34

标签: java arrays algorithm time-complexity

我想找出从0开始的数组中每个元素的等级。

例如:

rank of 2 is 1 because 2 is greater than exactly 1 element
rank of 1 is 0 because 1 is greater than exactly  0  element
rank of 3 is 2 because 1 is greater than exactly  2  element

解释

n^2

我所尝试的是O(n)时间复杂度算法。我想要一个线性时间复杂度为import java.io.IOException; import java.io.InputStream; import java.util.*; class rank{ public static void main(String args[]){ ArrayList<Integer> list = new ArrayList<Integer>(); list.add(2); list.add(1); list.add(3); ArrayList<Integer> listCopy = new ArrayList<Integer>(list); Collections.sort(list); // sorting array // System.out.println("List : " + listCopy); // System.out.println("Sorted List : " + list); Map<Integer, Integer> rankMap = new HashMap<Integer, Integer>(); int counter = 0; for(int x : list) { rankMap.put(x, counter); // list value as key and rank as value. counter++; } StringBuffer sb=new StringBuffer(); for(int x : listCopy) { sb.append(rankMap.get(x) + " "); // System.out.println(map.get(x)); } System.out.println( sb.toString().substring(0, sb.length()-1)) } } 的算法。

有人在下面的评论部分给了我解决方案,但他的评论已被删除我不知道如何。这对于负整数和正整数以及非常大的列表大小都是正确的。

感谢作者

$httpBackend.whenGET(/\/app/).passThrough();

7 个答案:

答案 0 :(得分:3)

因此,对于排名,您指的是排序数组后该元素最终会出现的位置吗?

您可以从身份映射map = {0,1,2}开始,然后对其进行排序,但使用arr作为排序键。

Collections.sort(map, (c1, c2) -> arr[c2] > arr[c1] ? +1 : arr[c2] == arr[c1] ? 0 : -1);

这样您就不会更改原始数组,但会获得从数组元素到其排名的映射。

显然,这种算法取决于排序算法的复杂性。 您应该以O(n log n)结束,但也许您的数据允许使用具有O(n)复杂度的排序算法。但这实际上取决于你在大清单中存储的内容。

答案 1 :(得分:1)

首先对所有元素进行排序并存储在另一个数组中(如果元素未排序) 然后从该数组中打印元素索引。

答案 2 :(得分:1)

使用基数排序以线性时间对数组进行排序。每个元素都有自己的等级。

答案 3 :(得分:1)

我提出一个主意。如果需要,可以使用:

It's applicable if array value[0....n-1]
  1. 首先通过count_array从输入数组创建counting sort technique(例如:array = {2,1,3},所以count_array = {0,1,1,1} // here {{ 1}}用作array value)。
  2. 然后,您可以过滤count_array index value count_array //仅限result_array = {0, 1, 2, 3}(您也可以add 1 with previous added value if count_array[i] == 1进行过滤。我使用count_array进行理解)
  3. 然后,您从result _arrayrank_array
  4. 制作result_array
  5. 最后,您可以找到rank_array[i] = result_array[array[i]] - 1 rank_array
  6. 示例:

    O(n)

答案 4 :(得分:1)

在java 8中,第一个数组列表,然后流。因为流中只有一个循环,所以它应该是O(n)。

Integer[] arr = {2, 1,3 };
List <Integer> list = Arrays.asList(arr);
Integer[] outArr  = list.stream()
        .sorted()
        .map(e -> list.indexOf(e))
        .toArray(Integer[]::new);

结果:{1,0,2}

答案 5 :(得分:1)

您可以使用映射将数组中的索引映射到值,对值进行排序并返回索引。它看起来像这样:

private static int[] ranks(int[] array) {
  Map<Integer, Integer> m = new HashMap<> ();
  for (int i = 0; i < array.length; i++) {
    m.put(i, array[i]);
  }
  return m.entrySet().stream()
                  .sorted(Entry.comparingByValue())
                  .mapToInt(Entry::getKey)
                  .toArray();
}

使用示例:

int[] ranks = ranks(new int[] { 2, 1, 3 });
System.out.println(Arrays.toString(ranks)); //outputs {1, 0, 2}

答案 6 :(得分:1)

可以使用名为&#34; Order statistic tree&#34;的数据结构来计算此等级,它是增强的数据结构。为了实现此结构,您必须实现平衡二叉树(例如AVL树或红黑树),并为每个节点添加其他属性。这是计算排名的一种非常有效的方法,因为它为每个元素采用O(lg n)(其中lg是基数2对数)。您可以在&#34;算法简介&#34;中找到有关此数据结构的更多信息。在第14章。

排序的问题在于它的运行时间是O(nlog(n)),并且我认为如果你想对少数元素(即少于n个元素)进行排序则效率很低。