java - 具有 n log(n) 运行时间的解决方案是什么,用于查找特定数字是否占据数组的一半以上

标签 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]]++;
    }

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

    System.out.println(answer);

关于这个,我的解决方案的运行时间是多少?我不认为这是 n log(n) 因为它只通过数组一次。

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

最佳答案

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

要查看是否有一个值占据数组的一半以上,您可以遵循以下算法:

  • 对数组进行排序
  • 如果一个值占据数组的一半以上,它将占据排序数组的中间单元格(参见 Pigeonhole principle );获取中间元素,并在下面的步骤中使用它
  • 使用二分查找查找包含中间元素的范围的下索引和上索引
  • 比较中间元素上下索引的差值与数组长度的一半
  • 如果索引差异超过长度的一半,则包含中间元素的次数超过一半;否则,答案就是“否”。

另一种选择是在哈希表中使用计数:

  • 构造一个哈希表,将一个元素映射到 O(n) 的元素计数
  • 遍历哈希表,并在 O(n) 内获取最高计数

关于java - 具有 n log(n) 运行时间的解决方案是什么,用于查找特定数字是否占据数组的一半以上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43905216/

相关文章:

algorithm - 冒泡排序相似算法运行时分析

algorithm - 什么样的算法缩短了较长输入的运行时间?

JAVAFX:setMaxWidth() 和 maxWidthProperty().set() 之间的区别

java - flatMap如何管理线程?

c - 测量 Linux 中应用程序的运行时间

ios - objective-c - 在运行时创建一个变量名并计算它的值

java - 正则表达式找到一个 float

java - 如何获取未填充的页面属性

c++ - 我将如何在 O(1)(摊销)中执行此任务?

java - 像 .Net 一样将节点引用到链表中,以启用 O(1) 项插入