一些背景信息:我创建了一个程序,给出了一个字母的arraylist,并且一个整数数组找到了这个arraylist中可以存在的所有单词组合,其中单词length是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中输出+ =成功...)我会将所有解决方案打印到控制台,但是现在我已经将它设置为方法添加到最后返回一个巨大的字符串(String输出)返回MainActivity,所有解决方案和String都放在TextView中。这是显示数据的低效方式吗?如果是这样,你能帮忙解释一下更好的方法吗?
我应该将它作为背景/前台进程或线程运行,而不是仅仅从MainActivity中调用它吗?
如何在我的Android上获得当前比我的桌面速度慢20倍的运行时?
答案 0 :(得分:0)
尝试用循环替换递归,并使用数组而不是列表,以避免插入等,直接访问数组成员要快得多。主要关注使用templetters.contains(s.charAt(j))
的最内部循环,优化这部分代码将产生主要效果。
您可以在break;
t = false;
String s1s2 = s1.concat(s2);
- 为这种情况创建一个新的String对象并不好 - 它为 GC 做了不必要的工作。我会通过s1
然后s2
你可以使用'letters'而不是ArrayList<Character> tempLetters = new ArrayList<Character>(letters);
,只是将那些项目标记为已删除。无需创建本地克隆。