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
Java 算法是指数的,有没有办法使它不是指数的?_Java_Performance_Algorithm_Caching_Data Structures - Fatal编程技术网

Java 算法是指数的,有没有办法使它不是指数的?

Java 算法是指数的,有没有办法使它不是指数的?,java,performance,algorithm,caching,data-structures,Java,Performance,Algorithm,Caching,Data Structures,更新:根据rrenaud的精彩评论,我想澄清一下,尽管我生成了所有排列,但顺序并不重要(因此它并不完全像旅行推销员的问题……但仍然有点类似)。我关注我的问题的观察结果(尽管任何关于如何加快速度的见解都是受欢迎的)是,结果是相互建立的,也许有一些方法(动态规划?)可以用来建立以前的结果,而不是重复大量计算。查看这些结果,您可以看到结果是相互影响的(要执行此操作,请将项目数更改为3,并将for循环中的max更改为3): 我还在学习算法,所以我的知识库有点有限。我基本上有一个递归,当我向它添加更多的输

更新:根据rrenaud的精彩评论,我想澄清一下,尽管我生成了所有排列,但顺序并不重要(因此它并不完全像旅行推销员的问题……但仍然有点类似)。我关注我的问题的观察结果(尽管任何关于如何加快速度的见解都是受欢迎的)是,结果是相互建立的,也许有一些方法(动态规划?)可以用来建立以前的结果,而不是重复大量计算。查看这些结果,您可以看到结果是相互影响的(要执行此操作,请将项目数更改为3,并将for循环中的max更改为3):

我还在学习算法,所以我的知识库有点有限。我基本上有一个递归,当我向它添加更多的输入时,它保持指数增长,但我想知道是否有什么方法可以让它不这样做

下面是一个递归示例(java代码),它基本上获取一个项目列表,并使用0-n个数量计算出每个项目的所有组合(为简单起见,我的代码有2个项目,每个项目的数量为0到5..变量可以在循环中更改)。为了使这更有趣,我有一个名为Q的变量,它进行一些随机处理,并根据列表检查其值,然后才继续。我尽我所能对代码进行了注释,希望您能轻松阅读:

import java.util.Arrays;
import java.util.List;
//learning playground safe to delete

public class main {

    public static void main(String[] args) {
        System.out.println("Starting..");
        Integer number_of_items = 2; //how many items should we test with, over 7 or 8 takes a long time MAX is 11(based on the number of names we have below)
        long startTime = System.currentTimeMillis(); //start timer
        Integer[] integers_temp = new Integer[number_of_items]; // create a list with exactly the number of items specified above
        Arrays.fill(integers_temp, 0); // populate list with zeros 
        List<Integer> list_to_start = Arrays.asList(integers_temp); //set it as a list
        String[] name_of_list_to_start = new String[] {"Grapes", "Strawberries", "Raspberries", "Blackberries", "Pineapples", "Oranges", "Prunes", "Pears", "cherries", "Peaches", "Apples"};       
        List<Integer> numbers_to_choose_from = Arrays.asList(new Integer[] {0, 1,2,3,4,5,6,7,8,9,10}); //list of numbers program can choose from(could be anything,just learning)
        counter(list_to_start.size(), list_to_start, name_of_list_to_start, numbers_to_choose_from);
        long endTime = System.currentTimeMillis(); 
        System.out.println("Total execution time: " + (endTime-startTime));
    }

    private static void counter(int length, List<Integer> list_to_start, String[] name_of_list_to_start, List<Integer> numbers_to_choose_from) {
        // If we've gone through everything then return the results
        if (length == 0) {
            for (int i = 0; i<list_to_start.size(); i++) {
                System.out.println(name_of_list_to_start[i] + " = " + list_to_start.get(i));
            }
            System.out.println("****");
            return;
        }   
        //This part basically increments list_to_start and then the above part displays it.
        for (int i = 0; i<=5; i++) {
            int q = i +2;  //do anything here..random just for example, right now just takes the number in the loop and adds by 10
            //System.out.println(q);  // this area is looped as many times as i^items, yet seems like after the first run work is duplicated.
            if (length != 0 && numbers_to_choose_from.contains(q)) {
                list_to_start.set((length-1), q);
                counter((length-1), list_to_start, name_of_list_to_start, numbers_to_choose_from);
                list_to_start.set((length-1), 0);
            }
        }
    }
}
导入java.util.array;
导入java.util.List;
//学习操场安全删除
公共班机{
公共静态void main(字符串[]args){
System.out.println(“开始…”);
整数\u of_items=2;//我们应该测试多少项,超过7或8需要很长时间,最大值是11(基于下面的名称数量)
long startTime=System.currentTimeMillis();//启动计时器
Integer[]integers\u temp=new Integer[number\u of_items];//创建一个与上面指定的项数完全相同的列表
Arrays.fill(integers_temp,0);//用零填充列表
List List_to_start=Arrays.asList(integers_temp);//将其设置为列表
String[]name_of_list_to_start=新字符串[]{“葡萄”、“草莓”、“覆盆子”、“黑莓”、“菠萝”、“橙子”、“李子”、“梨”、“樱桃”、“桃子”、“苹果”};
列表数字_to_choose_from=array.asList(新整数[]{0,1,2,3,4,5,6,7,8,9,10});//数字列表程序可以从中选择(可以是任何东西,只是学习)
计数器(list_to_start.size()、list_to_start、name_of_list_to_start、number_to_choose_from);
long-endTime=System.currentTimeMillis();
System.out.println(“总执行时间:+(endTime-startTime));
}
私有静态无效计数器(整数长度,列表到开始,字符串[]列表的名称到开始,列表编号从中选择){
//如果我们已完成所有操作,则返回结果
如果(长度==0){

对于(int i=0;i如果你想生成所有可能的置换,这属于-完全类,比NP完全问题更难(因为它们都属于),你不能期望速度超过100^100。但可能对原始问题有一些启发,所以最好说出来。如果你的原始问题是这样的,你可以说你的老板:世界上没有人能做到这一点。你也可以使它并行,但除了使用极其强大的大型机,你没有任何机会得到结果。

ode现在正在迭代每一个组合。对于n=100,没有任何方法可以在合理的时间内运行。优化内部循环不会阻止它成为指数


您需要一种不同的方法使其可行。如何做到这一点取决于您想要解决的问题的细节。例如,一些优化问题可以通过动态规划、线性规划、最大流或二进制搜索来解决。其他问题可以通过找到近似解来解决。

您希望您的解决方案是什么要做的代码?你想解决的问题是什么?这是一个人工制造的问题,我不太想详细讨论它到底做什么/应该做什么,但粗略地看一下,它似乎是-这意味着它是NP难的,但有伪多项式动态规划算法。是否有一个非常有效的算法这在很大程度上取决于项目的组合方式以及您希望从组合中得到什么。例如,如果项目是城市,并且您通过在城市之间旅行来组合它们,那么如果您想要两个给定城市之间的最短路径,那么您将有一个快速最短路径算法。另一方面,如果您想要访问它们的最短路径总之,你会遇到一个很难解决的旅行推销员问题。@r谢谢你的宝贵意见。我更新了问题以回应你的意见。前提的顺序不必是任何特定的顺序,正如你从结果中看到的(张贴在问题中)你让我在旅行推销员问题的背景下思考这个问题(thx!)我开始越来越多地认为这是一个动态规划问题,因为结果是相互依赖的。这有意义吗?你还没有指定问题。你可能会告诉你的老板,世界上没有人可以这样做,但我告诉我的老板,如果不泄露高度敏感的专有公司,我们不能公开解决这个问题资料:)
import java.util.Arrays;
import java.util.List;
//learning playground safe to delete

public class main {

    public static void main(String[] args) {
        System.out.println("Starting..");
        Integer number_of_items = 2; //how many items should we test with, over 7 or 8 takes a long time MAX is 11(based on the number of names we have below)
        long startTime = System.currentTimeMillis(); //start timer
        Integer[] integers_temp = new Integer[number_of_items]; // create a list with exactly the number of items specified above
        Arrays.fill(integers_temp, 0); // populate list with zeros 
        List<Integer> list_to_start = Arrays.asList(integers_temp); //set it as a list
        String[] name_of_list_to_start = new String[] {"Grapes", "Strawberries", "Raspberries", "Blackberries", "Pineapples", "Oranges", "Prunes", "Pears", "cherries", "Peaches", "Apples"};       
        List<Integer> numbers_to_choose_from = Arrays.asList(new Integer[] {0, 1,2,3,4,5,6,7,8,9,10}); //list of numbers program can choose from(could be anything,just learning)
        counter(list_to_start.size(), list_to_start, name_of_list_to_start, numbers_to_choose_from);
        long endTime = System.currentTimeMillis(); 
        System.out.println("Total execution time: " + (endTime-startTime));
    }

    private static void counter(int length, List<Integer> list_to_start, String[] name_of_list_to_start, List<Integer> numbers_to_choose_from) {
        // If we've gone through everything then return the results
        if (length == 0) {
            for (int i = 0; i<list_to_start.size(); i++) {
                System.out.println(name_of_list_to_start[i] + " = " + list_to_start.get(i));
            }
            System.out.println("****");
            return;
        }   
        //This part basically increments list_to_start and then the above part displays it.
        for (int i = 0; i<=5; i++) {
            int q = i +2;  //do anything here..random just for example, right now just takes the number in the loop and adds by 10
            //System.out.println(q);  // this area is looped as many times as i^items, yet seems like after the first run work is duplicated.
            if (length != 0 && numbers_to_choose_from.contains(q)) {
                list_to_start.set((length-1), q);
                counter((length-1), list_to_start, name_of_list_to_start, numbers_to_choose_from);
                list_to_start.set((length-1), 0);
            }
        }
    }
}