Java 使用n log(n)运行时来查找特定数量是否占用超过一半数组的解决方案是什么

Java 使用n log(n)运行时来查找特定数量是否占用超过一半数组的解决方案是什么,java,runtime,big-o,Java,Runtime,Big O,程序的要求是打印数组中出现n/2次以上的数字。确保解决方案的算法的运行时间为n log(n) [2,1,3,2]=无结果 [1,5,2,5,5]=5 我当前的解决方案: int answer = -1; int[] a = {2, 4, 2, 5, 1}; int[] occurances = {0, 0, 0, 0, 0, 0}; for(int i = 0; i < a.length; i++){ occurances[a[i]]++;

程序的要求是打印数组中出现n/2次以上的数字。确保解决方案的算法的运行时间为n log(n)

[2,1,3,2]=无结果 [1,5,2,5,5]=5

我当前的解决方案:

    int answer = -1;
    int[] a = {2, 4, 2, 5, 1};
    int[] occurances = {0, 0, 0, 0, 0, 0};

    for(int i = 0; i < a.length; i++){
        occurances[a[i]]++;
    }

    for(int i = 0; i < occurances.length; i++){
        if(occurances[i] > ((double)a.length)/2){
            answer = i;
        }
    }

    System.out.println(answer);
int-answer=-1;
int[]a={2,4,2,5,1};
int[]发生率={0,0,0,0,0,0};
for(int i=0;i((双倍)a.长度)/2){
答案=i;
}
}
System.out.println(应答);
关于这一点,我的解决方案的运行时间是多少?我认为这不是n log(n),因为它只通过数组一次

如果不是n log(n),那么什么解决方案会有n log(n)?
如果是,为什么是n长(n)?

您的解决方案取决于数组中的最大值,因此它是伪多项式,即O(n+max),其中
max
是数组中的最高值

要查看是否有一个值占用了数组的一半以上,可以按照以下算法操作:

  • 对数组进行排序
  • 如果一个值占据数组的一半以上,它将占据排序数组的中间单元格(请参阅);使用中间元素,并在下面的步骤中使用它
  • 使用二进制搜索查找包含中间元素的范围的上下索引
  • 将中间元素的上下索引之间的差异与数组长度的一半进行比较
  • 如果索引差超过长度的一半,则中间元素包含的时间超过一半;否则,答案是“不”
另一种选择是在哈希表中使用计数:

  • 构造一个哈希表,将一个元素映射到O(n)中的元素计数
  • 遍历哈希表,取O(n)中的最大计数

int[]a={-2,-2,-3}应该返回什么?对它进行排序(O(N log(N)))并扫描(O(N))。仍然是O(N log(N))。转换为双精度是没有意义的。那么
{10000000000000000000000000,…}
呢?一般来说,您不能使用基于数组的方法。您的解决方案是O(n),但如果您不希望数组对于处理大量数据来说是超大型的,则需要使用
HashMap
。“出现次数”这证实了我所认为的运行时。我试图在期末考试时向一群学生解释它,但我不确定是排序,然后再次通过它会产生一个O(n logn)。我原以为仍然是O(n logn+n),但那仍然只是n logn。@Xenosth您可以在O(n)摊销时间内完成(不需要树集步骤)。O(n+n*long n)与O(n*(log n+1))相同,后者与O(n log n)相同。见鬼,您甚至可以对已排序的数据进行顺序扫描以找到每个值的计数,如果计数达到数组大小的一半,则停止。那仍然是O(n logn)。但是我喜欢二进制搜索然而,正如您所指出的,
HashMap
解决方案甚至更好,因为它是O(n)。您可能应该再强调一点。@Andreas非常感谢您!