我想找出从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();
答案 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]
count_array
从输入数组创建counting sort technique
(例如:array = {2,1,3},所以count_array = {0,1,1,1} // here {{ 1}}用作array value
)。 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
进行理解)result _array
按rank_array
result_array
rank_array[i] = result_array[array[i]] - 1
rank_array
示例:
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个元素)进行排序则效率很低。