【问题标题】:Why findAncestorWidgetOfExactType is O(N) and dependOnInheritedWidgetOfExactType is O(1)为什么 findAncestorWidgetOfExactType 是 O(N) 而dependOnInheritedWidgetOfExactType 是 O(1)
【发布时间】:2020-07-09 14:49:12
【问题描述】:

在 Flutter 中有两个功能:

  • findAncestorWidgetOfExactType
  • dependOnInheritedWidgetOfExactType

他们在文档中说:findAncestorWidgetOfExactType 相对昂贵(O(N) 在树的深度)。

并且 dependOnInheritedWidgetOfExactTypeO(1) 具有一个小的常数因子。

任何人都可以解释为什么?为什么第一个比另一个贵?

谢谢

【问题讨论】:

    标签: performance flutter dart documentation inherited-widget


    【解决方案1】:

    要回答这个问题并理解为什么这两种方法在时间复杂度上存在差异,我们首先需要澄清两件事:

    1- 什么是线性搜索?

    线性搜索(称为顺序搜索)是一种用于查找的算法 列表中的目标值。它顺序检查每个元素 目标值的列表,直到找到匹配项或直到所有 已搜索元素。

    简而言之,O(1) 意味着它需要一个恒定的时间,(例如 10 纳秒)。

    另一方面,O(N) 意味着它所花费的时间与集合的大小成线性关系,因此两倍大小的集合将花费两倍的时间。您可能不想将一百万个对象放入其中之一。

    因此 (findAncestorWidgetOfExactType)的文档中的提示

    "仅当此小部件到所需的距离时才调用此方法 众所周知,祖先是小而有界的。”

    2- 每种方法搜索的通用“类型”是什么以及在哪里

    • dependOnInheritedWidgetOfExactTypeInheritedWidget >
    • findAncestorWidgetOfExactTypeWidget >

    考虑到这些,我们可以回答这个问题.. 所以为什么 ?

    因为 findAncestorWidgetOfExactType 方法在所有小部件树中搜索(因为它们默认都是 Widget 类型)

    这是通过线性搜索在小部件树上完成的,因此 => O(N)。

    感谢Mabsten回答

    ,此部分已更新

    另一方面,dependOnInheritedWidgetOfExactType
    在小部件树中搜索不是,而是在包含所有祖先 InheritedWidgets 的每个元素附带的 ma​​p 中搜索,并按它们的 type。

    所以'dependOn' - 直接 - 从这个地图中获取正确的继承小部件,这就是它是 O(1) 的原因。

    【讨论】:

      【解决方案2】:

      性能的主要区别不是因为findAncestorWidgetOfExactType() 搜索任何Widget 子类,而dependOnInheritedWidgetOfExactType() 仅搜索InheritedWidget 子类。

      dependOnInheritedWidgetOfExactType() 更便宜,因为每个小部件(更准确地说,每个元素)都保留所有祖先 InheritedWidgets 的 Map(在字段 _inheritedWidgets 中),并按它们的类型进行索引。那么dependOnInheritedWidgetOfExactType() 不会在小部件的树中搜索,而只会在这张地图中搜索。

      有用的文章:

      "How does Flutter InheritedWidget work?"

      "Widget - State - Context - InheritedWidget"(Didier Boelens,一篇文章的作者也在 flutter.dev 中引用)

      【讨论】:

      • 非常感谢,“dependOn”部分对我来说不是很清楚,中篇文章澄清了一切,再次感谢。因此,“findAncestor”对与小部件树中给定类型匹配的小部件类型进行线性搜索,这就是它为 O(N) 的原因,而“dependOn” - 直接 - 从地图中获取正确的小部件(在每个元素中) 将给定类型作为“键”,这就是它是 O(1) 的原因。
      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2012-02-23
      相关资源
      最近更新 更多