簡體   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