public Ranking(String [] names,float [] scores){ nameTest = new Cities [names.length]; rankTest = new Cities [names.length]; city = new Cities [names.length]; scoreRanks = new Float [scores.length];对于(int i = 0; i < scores.length - 1; i ++){ if(scores [i] == scores [i + 1]) throw new IllegalArgumentException(); } if(names == null || scores == null) throw new NullPointerException(); if(names.length!= scores.length) throw new IllegalArgumentException();降低产生秩数阵列的时间复杂度
for (int p = 0; p < scoreRanks.length; p++) {
scoreRanks[p] = scores[p];
}
int[] ranking = new int[names.length];
for (int k = 0; k < ranking.length; k++) {
ranking[this.smallestIndex()] = k + 1;
}
for (int i = 0; i < ranking.length; i++) {
city[i] = new Cities(names[i], ranking[i]);
nameTest[i] = new Cities(names[i], ranking[i]);
rankTest[i] = new Cities(names[i], ranking[i]);
}
Arrays.sort(nameTest, Cities.BY_NAME);
Arrays.sort(rankTest, Cities.BY_RANK);
for (int i = 0; i < names.length - 1; i++) {
if (nameTest[i].getName().equals(nameTest[i + 1].getName())
|| nameTest[i].getName() == null
|| rankTest[i].getRank() == rankTest[i + 1].getRank())
throw new IllegalArgumentException();
}
}
public int smallestIndex() {
float smallest = 0.0f;
int i;
for (i = 0; i < scoreRanks.length; i++) {
if (scoreRanks[i] > 0.0f) {
smallest = scoreRanks[i];
break;
} else
continue;
}
int j = 1;
while (j < scoreRanks.length) {
if (scoreRanks[j] < smallest && scoreRanks[j] != 0.0f) {
smallest = scoreRanks[j];
i = j;
}
j++;
}
scoreRanks[i] = 0.0f;
return i;
}
这是我的排名构造函数。目前,for循环内的smallestIndex()调用会将其调高到O(n^2)时间,但我需要它在不超过O(n log n)时间内运行。
这是做什么是一个分数和名称的数组。然后,LOWEST分数为1,次低为2,依此类推。然后,我可以创建名称[i]与排名[i]相对应的城市对象。
希望是有道理的。买耶我没有得到我能做的,以获得相同的结果,但在O(n日志n)时间。我的代码完美的作品,它实在是太慢了我想:(。
另外,将O(2N日志N + 5N)归结为为O(n log n)的?
1.什么是原始问题? 2.是的,'O(2n log + 5n)= O(n logn)' –