ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

效率未知的java /数组效率低下

2019-08-30 14:00:15  阅读:132  来源: 互联网

标签:java arrays performance repeat


我正在制作一些用于查找某个数的素因子的方法.这被分解为两个使用数组的函数.但是,在这两个函数中,代码效率非常低.首先,我必须计算数组的长度,创建一个具有该长度的新数组,然后使用几乎完全相同的代码来填充数组.

有没有一种方法可以使数组未知宽度并将整数推送到数组的末尾,因为我找到它们?

这是我的代码:

public class JavaApplication7{
    public static void main(String[] args) {
        System.out.println(Arrays.toString(primeFactors(85251)));
    }
    public static int[] primeFactors(int num){
        int[] factors = primesUpTo(num);
        int originalNum = num;
        int i = 0;
        int count = 0;
        while(num != 1){
            if(num % factors[i] == 0){
                num /= factors[i];
                i = 0;
                count++;
            }else{
                i++;
            }
        }
        int[] primeFactors = new int[count];
        i = 0;
        count = 0;
        while(originalNum != 1){
            if(originalNum % factors[i] == 0){
                originalNum /= factors[i];
                primeFactors[count] = factors[i];
                i = 0;
                count++;
            }else{
                i++;
            }
        }
        return primeFactors;
    }
    public static int[] primesUpTo(int upTo){
        int count = 0;
        int num = 2;
        while(num <= upTo){
            boolean isPrime = true;
            for(int div = 2; div <= num / 2; div++){
                isPrime = num % div == 0 ? false : isPrime;
            }
            count += isPrime ? 1 : 0;
            num++;
        }
        int i = 0;
        num = 2;
        int[] primes = new int[count];
        while(num <= upTo){
            boolean isPrime = true;
            for(int div = 2; div <= num / 2; div++){
                isPrime = num % div == 0 ? false : isPrime;
            }
            if(isPrime){
                primes[i] = num;
                i++;
            }
            num++;
        }
        return primes;
    }    
} 

解决方法:

你可以使用比Arrays更动态的Arraylists.

However in both functions the code is very inefficient as first i have
to count the length of the array, make a new array of that length and
then use almost the exact same code to populate the array

然而,你会发现Arraylists确实看起来很动态,但在它们下面却做了类似的事情.它们以一个大小开始,并将基础数组的副本复制到更大的数组等.

如果你知道要存储多少个数字的上限,你可以做的另一件事就是实现你自己的容器类.它可以有一个大数组来保存数字和一个长度变量,用于循环遍历元素.

例如:

public class NumberContainer(){

    private int[] elements;
    private int numOfElements;

    public NumberContainer(int size){
        elements = new int[size];
        numOfElements = 0;
    }

    //add a number

    public void add(int x){
        elements[numOfElements] = x;
        numOfElements++;
    }

    //get length
    public int length(){
        return numOfElements;
    }

}

….等等.

这样,您不必将数组复制到新的大数组,总而言之,假设您实例化具有足够大的NumberContainer.

希望这可以帮助

标签:java,arrays,performance,repeat
来源: https://codeday.me/bug/20190830/1768782.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有