【发布时间】:2014-03-30 10:06:43
【问题描述】:
public Ranking(String[] names, float[] scores) { nameTest = 新城市[names.length]; rankTest = 新城市[names.length]; 城市 = 新城市 [names.length]; scoreRanks = new Float[scores.length]; for (int i = 0; i
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 循环中对 minimumIndex() 的调用将其提高到 O(n^2) 时间,但我需要它在不超过 O(n log n) 时间内运行。
它的作用是获取一组分数和名称。然后得分最低的位置将是排名 1,次低的位置是排名 2,依此类推。然后我可以创建 Cities 对象,其中 names[i] 对应于ranking[i]。
希望这是有道理的。买是的,但在 O(n log n) 时间内,我无法获得相同的结果。我的代码完美运行,我猜它太慢了:(。
另外,O(2n log n + 5n) 会归结为 O(n log n) 吗?
【问题讨论】:
-
1.什么是原始问题? 2. 是的,
O(2n log + 5n) = O(n logn)
标签: java algorithm sorting rank