如何解决如何做嵌套循环而不会导致内存泄漏
我需要使用查询列表进行嵌套循环,而不是循环所有操作,因为这会导致一些内存泄漏和崩溃。 导致冻结永远不会结束。
这是一个解释:
我有那些课程:
class Station {
String stationName;
}
class Line {
String lineName;
List<station> inLine;
}
现在我有2个Line
列表,我需要检查具有相互站的线..这是我使用的代码:
List<Station> mutualStations = [];
for (Line singleLine in listNumberOne) {
for (Station inline in singleLine.inLine){
for(line secondLine in listNumberTwo) {
for(station secondInLine in secondLine.inLine){
if (inline.name == secondInLine.name) {
Station instanceOFStation = Station(name: inLine.name);
mutualStations.add(instanceOFStation);
}
}
}
}
}
And for sure this code is a huge memory leak and am sure flutter have an easier way to do it .. anyone can help?
解决方法
我不是Flutter的专家,如果我错了,请纠正我,但是我认为这段代码正在UI线程上运行,该线程还负责呈现UI元素。因此,如果上述代码中的UI线程忙,则您的APP将冻结一段时间。
我不禁注意到您的算法是O(n^4)
的算法,速度非常慢。考虑到该列表包含10行,每行包含10个站点,则循环将迭代10 ^ 4次,即10,000次。
另外,如果有50%匹配的工作站,那么您将在循环内创建大约5,000个对象,因为您没有检查工作站是否重复。
我可以提供的优化之一是创建两组不同的工作站名称。然后遍历它们以确定相互的站点。
因此,要创建集合,您将与O(n^2)
循环两次,然后在集合O(m)
上循环一次[m->集合中的站点数]。
因此,考虑到最坏的情况,我们将使所有站点名称均为唯一,这将按以下方式解决:
2 * O(n^2) + O(m) => 2 * 100 + 200 => 400 iterations
将时间和内存消耗优化为 96%(从10,000次迭代到400次迭代)。这减少了UI线程的负担,并使您的应用对用户做出响应。 此外,通过避免分配大量对象,您可以避免内存泄漏而保存应用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。