Java 降低生成秩数组的时间复杂度
公开排名(字符串[]名称,浮动[]分数){ nameTest=新城市[names.length]; rankTest=新城市[名称.长度]; 城市=新城市[名称.长度]; scoreRanks=新浮动[分数.长度]; 对于(int i=0;iJava 降低生成秩数组的时间复杂度,java,algorithm,sorting,rank,Java,Algorithm,Sorting,Rank,公开排名(字符串[]名称,浮动[]分数){ nameTest=新城市[names.length]; rankTest=新城市[名称.长度]; 城市=新城市[名称.长度]; scoreRanks=新浮动[分数.长度]; 对于(int i=0;i
for(int p=0;p0.0f){
最小=得分等级[i];
打破
}否则
持续
}
int j=1;
而(j
这是我的排名构造器。目前,for循环中对smallestIndex()的调用将其运行时间增加到O(n^2),但我需要它在不超过O(n logn)的时间内运行
这样做的目的是获取一组分数和名称。然后得分最低的是排名1,其次是排名2,依此类推。然后我可以创建名称[I]与排名[I]相对应的城市对象
希望这是有道理的。买是的,我不知道我能做些什么来获得相同的结果,但在O(n log n)时间内。我的代码运行得很好,我想它太慢了:(
此外,O(2n logn+5n)是否可以归结为O(n logn)?根据您的描述,基本上您希望根据分数的增加对列表进行排序。在
smallestIndex
中检查您的代码,似乎您确实在以一种非常低效的方式进行此操作。如果要保留此方法,我建议更改scoreRanks[I]=0.0f
进入scoreRanks[i]=Float.MAX_VALUE
并通过循环一次简化方法
但为了高效地完成任务,我建议完全删除smallestIndex
。我发现您已经在使用数组。使用自定义比较器排序
。您可以使用相同的方法高效地解决任务。您可以创建自定义比较器,如本问题中所述:
类ArrayIndexComparator实现Comparator
{
私人浮动[]分数;
公共阵列索引比较器(浮动[]分数)
{
this.scores=新的浮动[scores.length];
对于(inti=0;i1.最初的问题是什么?2.是的,O(2n log+5n)=O(n logn)
Hmm…但这不是将排名[]数组排序为[1,2,3,4,…]吗?因为问题是我不能这样做。分数[]数组不能排序,排名[]也不能排序。城市对象可以更晚,但数组必须与其各自的字符串匹配,因此无法排序。不,这将提供与您的方法相同的排序
数组。数组。排序
将根据分数对分数的索引进行排序。因此,在上面的测试用例中(我添加了一个测试用例),则索引
数组将为{2,0,1}
,表示得分[2]
最小,得分[0]
次之,而得分[1]
是最大的。然后它本质上与您的smallestIndex
方法相同,只是结果已经在一个数组中,而不是调用该方法n次。您可以检查排名的结果,看看它是否正确。Ermahgerd这就像黑魔法一样!非常感谢!它像一个梦一样工作st将我的复杂性从O(n^2)降低到O(n log n)!很高兴这有帮助=)。我要指出的是,这不是一个梦想,而是现实。事实上,如果你能接受这个答案,这将对我和其他人有所帮助,因此,寻求排名排序的人可以找到这个问题的答案=D(如果你喜欢,也可以投赞成票)
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;
}