Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.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 我如何才能最有效地执行这个递归/迭代的CPU密集型android任务?_Java_Android_Performance_Algorithm_Recursion - Fatal编程技术网

Java 我如何才能最有效地执行这个递归/迭代的CPU密集型android任务?

Java 我如何才能最有效地执行这个递归/迭代的CPU密集型android任务?,java,android,performance,algorithm,recursion,Java,Android,Performance,Algorithm,Recursion,一些背景信息:我制作了一个程序,给出了一个字母数组列表,一个整数数组可以找到这个数组列表中可能存在的所有单词组合,其中单词长度是int数组中的一个整数(单词大小)。 i、 e.给定h,o,p,n,c,i,e,t,k和整数5和4,解为: 电话滴答响 我现在的问题是: 输入通常为25个字符,输出通常应返回5个单词组合。 我最初为dekstop制作了一个控制台应用程序,运行时通常不到1分钟。 我决定将它移植到android上,运行时间超过35分钟。我是个初学者,不知道如何在Android上运行CPU密

一些背景信息:我制作了一个程序,给出了一个字母数组列表,一个整数数组可以找到这个数组列表中可能存在的所有单词组合,其中单词长度是int数组中的一个整数(单词大小)。 i、 e.给定h,o,p,n,c,i,e,t,k和整数5和4,解为: 电话滴答响

我现在的问题是: 输入通常为25个字符,输出通常应返回5个单词组合。 我最初为dekstop制作了一个控制台应用程序,运行时通常不到1分钟。 我决定将它移植到android上,运行时间超过35分钟。我是个初学者,不知道如何在Android上运行CPU密集型任务

public void findWordsLimited(ArrayList<Character> letters) {

    for (String s1 : first2s) {
        for (String s2 : possibleSeconds) {

            boolean t = true;

            String s1s2 = s1.concat(s2);
            ArrayList<Character> tempLetters = new ArrayList<Character>(letters);
            for (int i = 0; i < s1s2.length(); i++) {
                if (tempLetters.contains(s1s2.charAt(i)))
                    tempLetters.remove(Character.valueOf(s1s2.charAt(i)));
                else
                    t = false;
            }

            if (t) {
                helperFindWordsL(tempLetters, s1 + " " + s2, 2);
            }
        }
    }

}

public void helperFindWordsL(ArrayList<Character> letters, String prefix , int index) {

    boolean r;

    if (letters.size() <= 1) {
        output += "Success : " + prefix + "\n";
        Log.i(TAG, prefix);
    }

    else if (index < wordSizes.size()){

        for (String s : lastCheck) {

            if (s.length() == wordSizes.get(index)) {

                ArrayList<Character> templetters = new ArrayList<Character>(letters);
                r = true;

                for (int j = 0; j < s.length(); j++) {
                    if (templetters.contains(s.charAt(j)))
                        templetters.remove(Character.valueOf(s.charAt(j)));
                    else {
                        r = false;
                        templetters = new ArrayList<Character>(letters);
                    }
                }

                if (r)
                    helperFindWordsL(templetters, prefix + " " + s, index + 1);
            }
        }
    }

}
public void find或slimited(数组列表字母){
用于(字符串s1:first2s){
for(字符串s2:可能秒){
布尔t=真;
字符串s1s2=s1.concat(s2);
ArrayList tempLetters=新的ArrayList(字母);
对于(int i=0;i如果(letters.size()尝试用循环替换递归,并使用数组而不是列表,以避免插入等,则直接访问数组成员的速度要快得多。请主要注意使用
templetters.contains(s.charAt(j))
的最内部循环,这部分代码的优化将发挥主要作用

您可以在
t=false;

String s1s2=s1.concat(s2);
-在这种情况下创建一个新的String对象是不好的-它会为GC做不必要的工作。我会用两个循环来替换它,通过
s1
然后
s2


您可以使用“字母”而不是
ArrayList tempLetters=new ArrayList(字母);
,只需将其中的一些项目标记为已删除。无需创建本地克隆。

似乎您错过了许多编写速度快一到两个数量级的算法的机会。但您没有描述一件重要的事情:如何检查字母序列是否构成一个单词?此外,该示例应除了“phone”和“tick”之外,还要多写一些单词!在此运行之前,我已经准备好一个名为lastCheck的数组,该数组已经在wordlist.txt中进行了迭代。是的,除了phone和tick之外的单词(如nice和cope)也可以工作,但它的工作方式是字母的组合必须映射到特定的单词组合,以便它们的大小是整数。很多时候,多个解决方案离子确实存在。这还不是很清楚:字母的数量必须等于单词长度的总和。谢谢,这些对java语法有帮助,但我更关心的是android的逻辑。我的桌面能够相当快地运行这些,但我的android设备不能。我想看看如何执行CPU密集型的pandroid上的处理速度最快,我应该继续将结果附加到字符串中,还是用另一种方式,或者切换到进程?桌面CPU可能更强大。桌面java可能有更好的JIT优化。我认为您不需要在这方面做任何事,因为您的代码可能很容易优化以获得显著的性能bust@0x12月14日当然你的Android设备不是。台式机甚至笔记本电脑的CPU比Android设备中的任何东西都快得多。你需要优化你的算法,然后是你的代码。我们可能需要更多关于优化算法的细节,但Mixaz给了你一些优化代码的好建议。好的,我优化了我的代码和它似乎只是做了一些检查之前,大量的递归过程除了优化arraylist for loop(检查,删除)减少运行时间百倍。虽然它仍然是10倍的速度在计算机上,我能够得到可管理的运行时间通常在2分钟内在我的手机上。