Flutter 减少在列表中搜索的时间复杂性
我有一个函数,它基本上使用对象的成员变量来查找对象。 代码如下:Flutter 减少在列表中搜索的时间复杂性,flutter,dart,Flutter,Dart,我有一个函数,它基本上使用对象的成员变量来查找对象。 代码如下: RecipeModel returnRecipe(String? suggestion) { for (int i = 0; i < _appData.recipeCategories!.length; i++) { for (int j = 0; j < _appData.recipeCategories![i].recipes!.length; j++) { if (_app
RecipeModel returnRecipe(String? suggestion) {
for (int i = 0; i < _appData.recipeCategories!.length; i++) {
for (int j = 0; j < _appData.recipeCategories![i].recipes!.length; j++) {
if (_appData.recipeCategories![i].recipes![j].recipeName! ==
suggestion) {
return _appData.recipeCategories![i].recipes![j];
}
}
}
return recipe;
}
RecipeModel返回配方(字符串?建议){
对于(int i=0;i<\u appData.RecipecCategories!.length;i++){
对于(int j=0;j<\u appData.RecipecCategories![i].recipes!.length;j++){
如果(_appData.RecipecCategories![i]。配方![j]。recipeName==
(建议){
return _appData.recipeCategories![i].recipes![j];
}
}
}
返回配方;
}
_appData是一个类的对象,该类负责在应用程序启动后获取所有数据。appData的内部内容
_appData保存整个json文件
如何降低搜索的时间复杂度?我认为不可能降低时间复杂度,但您可以使用一些函数式编程来提高效率:
RecipeModel?返回配方(字符串?建议){
return\u appData.recipecategatories
//把所有的食谱放在同一个表格里
.expand((类别)=>category.recipes)
//找到第一个食谱
.第一个在哪里(
//谁的名字和这个建议相同
(recipe)=>recipe.recipeName==建议,
//如果你找不到任何东西,请归还其他东西
orElse:()=>null);
}
使用单for循环也可以找到结果。时间复杂度为O(n)
RecipeModel返回配方(字符串?建议){
int recCategoriesLen=\u appData.recipeCategories!.length;
int i=0
对于(int j=0;j<\u appData.RecipecCategories![i].recipes!.length;){
如果(_appData.RecipecCategories![i]。配方![j]。recipeName==
(建议){
return _appData.recipeCategories![i].recipes![j];
}
j++
if(_appData.RecipecCategories![i].recipes!.length==j&&i
尽管在另一个循环中嵌套了一个for
循环,但您当前的方法相对于配方总数是O(n)。如果你需要检查每一个元素,那么你做得再好不过了
如果您只关心精确的相等性,那么您可以创建一个Map
来预先将配方名称映射到RecipeModel
s。创建Map
仍然是O(n),但是每次查找都是O(1)而不是O(n)。这根本不会降低复杂性。最终,它仍然迭代相同的次数(因为它必须在相同的元素上进行迭代),但代码现在更加复杂。即使原始代码中有一个for
循环嵌套在另一个循环中,但就配方总数而言,它仍然是O(n)。将数据转换为具有相同复杂度的映射是没有意义的。@ChandanKumar在每次查找时创建map
是没有意义的,但是如果数据很少更改,然后创建一个持久的映射
来执行许多查找将是一个胜利。实际上,访问数据的频率要比添加数据的频率高得多。这很有意义,因此减少了比较。我想如果我将AppData中的所有recipemodel
存储在一个列表中,时间复杂度将保持不变。因为我必须迭代相同数量的RecipeCategories,然后将每个recipeModel存储在一个列表中,对吗?
RecipeModel returnRecipe(String? suggestion) {
int recCategoriesLen = _appData.recipeCategories!.length;
int i = 0
for (int j = 0; j < _appData.recipeCategories![i].recipes!.length;) {
if (_appData.recipeCategories![i].recipes![j].recipeName! ==
suggestion) {
return _appData.recipeCategories![i].recipes![j];
}
j++
if (_appData.recipeCategories![i].recipes!.length == j && i < recCategoriesLen - 1) {
i++
j = 0
}
}
return recipe;
}