繁体   English   中英

如何最有效地执行此递归/迭代CPU密集型android任务?

[英]How can I most efficiently execute this recursive/iterative CPU intensive android task?

一些背景信息:我编写了一个给出字母数组列表的程序,一个整数数组找到了该数组列表中可以存在的所有单词组合,其中单词长度是int数组中的整数之一(wordSizes)。 即给定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);
            }
        }
    }

}

我不太担心算法,因为这可能会引起混淆,因为它是解决文字游戏难题的更大项目的一部分。 几个问题:

我如何最快完成这样的CPU密集型任务? 现在,我从MainActivity中调用方法findWordsLimited()。 在我的桌面应用程序上(它在HelperFindWordsL中显示输出+ = Success ...),我将所有解决方案打印到控制台,但是现在我已经完成了,以便该方法添加并最终返回一个巨大的字符串(字符串)输出)返回到MainActivity,并提供所有解决方案,并且将String放在TextView内。 这是显示数据的低效率方法吗? 如果是这样,请您帮忙解释一个更好的方法?

我应该将其作为背景/前台进程或线程运行,而不是仅从MainActivity调用它吗?

我如何才能在Android上获得比台式机快20倍的运行时?

尝试用循环替换递归,并使用数组而不是列表,以避免插入等,直接访问数组成员要快得多。 要特别注意使用templetters.contains(s.charAt(j))的最内层循环,这部分代码的优化将产生主要效果。

您可以添加break; t = false;

String s1s2 = s1.concat(s2); -在这种情况下创建一个新的String对象是不好的-这会使GC不必要的工作。 我将其替换为s1 s2 2个周期

您可以使用“字母”代替ArrayList<Character> tempLetters = new ArrayList<Character>(letters); ,只需将其中的某些项目标记为已删除。 无需创建本地克隆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM