Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 减少在列表中搜索的时间复杂性_Flutter_Dart - Fatal编程技术网

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;
}