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