Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 降低生成秩数组的时间复杂度_Java_Algorithm_Sorting_Rank - Fatal编程技术网

Java 降低生成秩数组的时间复杂度

Java 降低生成秩数组的时间复杂度,java,algorithm,sorting,rank,Java,Algorithm,Sorting,Rank,公开排名(字符串[]名称,浮动[]分数){ nameTest=新城市[names.length]; rankTest=新城市[名称.长度]; 城市=新城市[名称.长度]; scoreRanks=新浮动[分数.长度]; 对于(int i=0;i

公开排名(字符串[]名称,浮动[]分数){ 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;
    }