如何加速这段java代码?

如何加速这段java代码?,java,algorithm,Java,Algorithm,如果正整数数组中的数字超过数组大小的一半,则此方法返回该数字,否则返回-1。我需要改进较大数组的运行时间(10^5为什么不在每次迭代输入hashmap后与长度(正在运行的第二个迭代器循环)进行比较?这是在hashmap完成时,您知道结果,并且只需进行一次比较。为什么不与长度进行比较(您正在运行的第二个迭代器循环)每次在hashmap中输入迭代后?这是在hashmap完成时,您知道结果,并且只需执行一次。此IMO更短,效率更高 public static int findResult(int ar

如果正整数数组中的数字超过数组大小的一半,则此方法返回该数字,否则返回-1。我需要改进较大数组的运行时间
(10^5为什么不在每次迭代输入hashmap后与长度(正在运行的第二个迭代器循环)进行比较?这是在hashmap完成时,您知道结果,并且只需进行一次比较。

为什么不与长度进行比较(您正在运行的第二个迭代器循环)每次在hashmap中输入迭代后?这是在hashmap完成时,您知道结果,并且只需执行一次。

此IMO更短,效率更高

public static int findResult(int arr[], int len) {
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < len; i++) {
        Integer val = map.get(arr[i]);
        if (val != null) {
            map.put(arr[i], val + 1);
        } else {
            map.put(arr[i], 1);
        }
    }
    for (Entry<Integer, Integer> e : map.entrySet()) {
        if (e.getKey() > (len / 2)) {
            return e.getValue();
        }
    }
    return -1;
}
我的用一张地图

2) 这个


性能非常差,即使是声纳或FindBugs也会立即检测到它,并建议用我提供的替代品来取代它

public static int findResult(int arr[], int len) {
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < len; i++) {
        Integer val = map.get(arr[i]);
        if (val != null) {
            map.put(arr[i], val + 1);
        } else {
            map.put(arr[i], 1);
        }
    }
    for (Entry<Integer, Integer> e : map.entrySet()) {
        if (e.getKey() > (len / 2)) {
            return e.getValue();
        }
    }
    return -1;
}
我的用一张地图

2) 这个


性能非常差,即使是Sonar或FindBugs也会立即检测到它,并建议用我提供的产品替换它

您无需地图即可完成此操作,无需装箱/拆箱:

public static int findResult(int[] arr, int len) {
    if(len == 0) return -1;
    if(len == 1) return arr[0];

    int element = arr[0];
    int count = 1;
    for(int i = 1; i < len; i++) {
        if(arr[i] == element) {
            count++;
        } else if(count > 0) {
            count--;
        } else {
            element = arr[i];
            count = 1;
        }
    }

    count = 0;
    for(int a:arr) {
        if(a == element) {
            count++;
        }
    }

    return (count > len / 2) ? element : -1;
}
public static int findResult(int[]arr,int len){
如果(len==0)返回-1;
如果(len==1)返回arr[0];
int元素=arr[0];
整数计数=1;
对于(int i=1;i0){
计数--;
}否则{
元素=arr[i];
计数=1;
}
}
计数=0;
用于(int a:arr){
if(a==元素){
计数++;
}
}
返回(计数>长度/2)?元素:-1;
}

无需地图即可完成此操作,无需装箱/拆箱:

public static int findResult(int[] arr, int len) {
    if(len == 0) return -1;
    if(len == 1) return arr[0];

    int element = arr[0];
    int count = 1;
    for(int i = 1; i < len; i++) {
        if(arr[i] == element) {
            count++;
        } else if(count > 0) {
            count--;
        } else {
            element = arr[i];
            count = 1;
        }
    }

    count = 0;
    for(int a:arr) {
        if(a == element) {
            count++;
        }
    }

    return (count > len / 2) ? element : -1;
}
public static int findResult(int[]arr,int len){
如果(len==0)返回-1;
如果(len==1)返回arr[0];
int元素=arr[0];
整数计数=1;
对于(int i=1;i0){
计数--;
}否则{
元素=arr[i];
计数=1;
}
}
计数=0;
用于(int a:arr){
if(a==元素){
计数++;
}
}
返回(计数>长度/2)?元素:-1;
}

您可以使用一个临时变量来存储最大的金额,
每次增加某个变量的计数器时,检查其是否大于您的温度,如果大于,则更换它,否则继续,这样您就可以不使用第二个循环,而只知道您的答案在温度变量中,您可以使用温度变量始终存储最大的量,
每次增加某个变量的计数器时,请检查其是否大于temp,如果大于,请将其替换,否则继续,这样您就可以在不使用第二个循环的情况下完成此操作,并且您只知道您的答案位于temp变量中,这可能应该发布到,而不是这样。此外,您的代码在O(n)时间内运行。这并不是很慢。(i)不使用containsKey+get,只需使用一个
get
并与
null
进行比较。(ii)跟踪第一个循环中的最高数字,并摆脱第二个循环(iii)调整地图的大小,以避免多次重复operations@assylias是的,我使用
if(val+1>len/2)返回arr得到了这一点[i] ;
消除了迭代器的使用。感谢您也可以提前中止循环,如果您已经遍历了一半,并且计数仍然为0,“超过一半”将不起作用。这可能应该发布到,而不是这样。此外,您的代码运行时间为O(n)。这并不算慢。(i)不要使用containsKey+get,只需使用一个
get
并与
null
进行比较即可(ii)跟踪第一个循环中的最高数字,并摆脱第二个循环(iii)调整地图的大小,以避免多次重置operations@assylias是的,我使用
if(val+1>len/2)返回arr[I]得到了这一点;
消除了迭代器的使用。感谢您也可以提前中止循环,如果您已经遍历了一半,并且计数仍然为0,“超过一半”将不起作用。虽然这仍然是O(n),但此输入的大小可能会使迭代一次与两次有所不同。此外,更改get的map.contains仍然是O(1)。虽然这仍然是O(n),但此输入的大小可能会在迭代一次和两次之间产生差异。此外,更改get的map.contains仍然是相同的O(1)。这个算法不是只有在一个项目是多数的情况下才有效吗?@assylias如果没有项目是多数,那么最终计数将是我错过了第二个循环。这是一个很好的算法解释:这个算法不是只有在一个项目是多数的情况下才有效吗?@assylias如果没有项目是多数,那么最终计数将是我错过了第二个循环。这是一个很好的算法解释:
public static int findResult(int[] arr, int len) {
    if(len == 0) return -1;
    if(len == 1) return arr[0];

    int element = arr[0];
    int count = 1;
    for(int i = 1; i < len; i++) {
        if(arr[i] == element) {
            count++;
        } else if(count > 0) {
            count--;
        } else {
            element = arr[i];
            count = 1;
        }
    }

    count = 0;
    for(int a:arr) {
        if(a == element) {
            count++;
        }
    }

    return (count > len / 2) ? element : -1;
}