Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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/2/csharp/328.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 为什么方法2比方法1更快,即使方法2使用O(2n)时间复杂度,而方法1使用O(n)解决相同的问题_Java_Time Complexity_Space Complexity_Complex Event Processing - Fatal编程技术网

Java 为什么方法2比方法1更快,即使方法2使用O(2n)时间复杂度,而方法1使用O(n)解决相同的问题

Java 为什么方法2比方法1更快,即使方法2使用O(2n)时间复杂度,而方法1使用O(n)解决相同的问题,java,time-complexity,space-complexity,complex-event-processing,Java,Time Complexity,Space Complexity,Complex Event Processing,我在解决GFG的问题。我用两种方法解决了同样的问题 方法1 静态整数多数元素1(整数a[],整数大小){ HashMap mp=新的HashMap(); 整数计数=0; int maxNum=0; for(int i=0;i

我在解决GFG的问题。我用两种方法解决了同样的问题

方法1

静态整数多数元素1(整数a[],整数大小){
HashMap mp=新的HashMap();
整数计数=0;
int maxNum=0;
for(int i=0;isize/2)?maxNum:-1;
}
方法2

static int-majorityElement(int a[],int-size){
整数计数=0;
int maxNum=0;
for(int i=0;i大小/2)?最大值:-1;
}
即使方法1正在解决O(n)时间复杂度问题,GFG的时间编译器显示超过了时间限制。 但是当我使用时间复杂度为O(2n)的方法2的代码时,它显示执行成功。
能不能请一些人帮我理解这是怎么发生的。

大O符号给你一个关于增长的指示,带有“some'n”。这对于正确理解您正在使用的算法是必要的

鉴于此,你看不到这里的大局。一旦你知道一个算法在O(n)中,而另一个算法在O(2n)中,你基本上是说两个算法都以线性速度增长,事实上常数因子都被吸收了,所以它们都在O(n)中。虽然你不知道确切的速度,但你必须挖掘更多

挖掘,意味着开始考虑额外的细节,如:

  • 我们从内存中读取值的次数是多少
  • 我们进行了多少次交流

例如,考虑这个场景:你正在执行一个算法,它应该把条目交换成数组来排序它。这可能是低效的,因为您正在执行大量的读写操作。您提出了一个可比较的算法,该算法分配另一个数组以帮助最小化此类交换。后一个版本效率更高,但它也使用了更多内存。记忆,不是最初分析的一部分

因此,Big-O表示法为您提供了粗略比较的洞察力,然后您必须分析您的输入和输出,以便了解实际增长情况:您可以使用低效的算法对10个项目进行排序,但您可能不希望对100000个项目进行同样的排序


维基百科有一篇非常详细和全面的文章。您可能想看看它,它可以帮助您更好地了解这个主题。

时间复杂性并不意味着实际的执行速度。这只是一种比较算法的方法,因为
n
越来越大
O(2n)==O(n)
!常数因子被忽略了。这是该表示法的一个问题:
100000n
1n
更糟糕,尽管其复杂性相同(使用
HashMap
并在其中搜索肯定需要一些额外的时间),第二个算法是如何工作的?
static int majorityElement1(int a[], int size) {
        HashMap<Integer, Integer> mp = new HashMap<>();
        int count = 0;
        int maxNum = 0;
        for (int i = 0; i < a.length; i++) {
            if (mp.containsKey(a[i])) {
                if (count < mp.get(a[i]) + 1) {
                    count = mp.get(a[i]) + 1;
                    maxNum = a[i];
                }
                mp.replace(a[i], mp.get(a[i]) + 1);
            } else {
                if (count < 1) {
                    count = 1;
                    maxNum = a[i];
                }
                mp.put(a[i], 1);
            }
        }
        return (mp.get(maxNum) > size / 2) ? maxNum : -1;
    }
static int majorityElement(int a[], int size) {
        int count = 0;
        int maxNum = 0;
        for (int i = 0; i < a.length; i++) {
            if (count == 0) {
                maxNum = a[i];
                count++;
            } else {
                if (maxNum == a[i]) {
                    count++;
                } else {
                    count--;
                }
            }
        }
        count = 0;
        for (int i = 0; i < a.length; i++) {
            if (a[i] == maxNum) {
                count++;
            }
        }
        return (count > size / 2) ? maxNum : -1;
    }