- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的问题是关于 Motivation用于实现启发式 O(n) 算法。
There are some generic solutions to this algorithmic problem ofgenerating the minimum number of operations to transform one tree intoanother. However, the state of the art algorithms have a complexity inthe order of O(n^3) where n is the number of elements in the tree.
If we used this in React, displaying 1000 elements would require inthe order of one billion comparisons. This is far too expensive.Instead, React implements a heuristic O(n) algorithm based on two assumptions:
- Two elements of different types will produce different trees.
- The developer can hint at which child elements may be stable across different renders with a key prop.
最佳答案
React 的 diff 算法之所以如此,有很好的理由,但记录的“动机”并没有足够的意义成为真实的事实。
首先,虽然最佳“树差异”确实需要 O(N3) 时间,但“树差异”算法并不是 React 实际所做的唯一最佳替代方案,并且事实上,will 根本不适合 React 的渲染过程。这主要是因为,在最坏的情况下,渲染一个 react 组件会产生一个 react 元素的列表(而不是树),这些 react 元素需要与预先存在的列表相匹配组件。
执行 diff 时没有新树,因为新列表需要在呈现新元素的子元素之前与预先存在的树进行匹配。事实上,需要 diff 的结果来决定是否重新渲染子项。
所以...在匹配这些列表时,我们可能会将 React diff 与标准最长公共(public)子序列算法进行比较,后者是一种 O(N2) 算法。这仍然很慢,并且有一个性能参数需要提出。如果 LCS 和 React diff 一样快,那么它肯定会在渲染过程中占有一席之地。
但是,濒海战斗舰不仅速度慢,而且没有做正确的事情。当 React 将新元素列表与旧树进行匹配时,它会决定每个元素是一个新组件,还是只是对预先存在的组件的 prop 更新。 LCS 可以找到最大可能匹配的元素类型,但最大可能匹配不一定是开发人员想要。
因此,LCS(或树差异,如果你真的想强调这一点)的问题不仅在于它很慢,而且它很慢并且它提供的答案仍然是只是对开发人员意图的猜测。当算法仍然会出错时,速度慢的算法就不值得了。
虽然有很多其他快速算法,React 开发人员可以使用它们在大多数情况下会更准确,但问题是“它值得吗?”通常,答案是否定的,因为没有任何算法可以很好地猜测开发者的意图,而猜测开发者的意图实际上没有必要。
如果开发人员认为他的新元素与其先前存在的组件正确匹配以便它们不必重新呈现很重要,那么开发人员应该确保是这种情况。这非常简单——他只需要在呈现列表时提供关键 Prop 。开发人员在呈现列表时应该几乎总是这样做,以便组件匹配可以完美,并且他们不必满足于任何猜测。
如果您没有在需要使匹配明确的地方放置关键 Prop ,React 将发出警告,这比更好的差异更有帮助。当您看到它时,您应该通过添加适当的关键 Prop 来修复您的组件,然后匹配将是完美的,并且没有其他算法可以在编写糟糕的组件上做得更好。
关于reactjs - React 的 "diffing"启发式算法背后的动机是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56110260/
这个问题在这里已经有了答案: Is floating point math broken? (31 个答案) 关闭 4 年前。 我正在尝试编写一个程序,将分数 m/n 写为不同埃及分数 (EF) 的
我正在创建一个业务选项表单(我知道粗略的描述,但这里是)。我希望弹出的第一个 select 是选择实体类型(即:Corporation、LLC、LLP 等)。选择其中一个后,我想.show() 下一个
我正在寻找一个可以读取从 Excel 保存的 *.dif 文件的 Java 库 http://en.wikipedia.org/wiki/Data_Interchange_Format 有什么可以帮助
这是在现实世界中出现的,我想我会分享它,因为它可能会导致一些有趣的解决方案。本质上,该算法需要区分两个列表,但让我给你一个更严格的问题定义。 数学公式 假设您有两个列表,L 和 R,每个列表都包含来自
我知道 shouldComponentUpdate() 在返回 false 时会阻止调用 render() 方法。如果我在 render() 方法中使用一些昂贵的逻辑,那么 shouldCompone
Apache 正在做一些非常奇怪的事情。起初,我的浏览器似乎总是在加载缓存副本。我通过禁用缓存、使用新浏览器和使用 curl 排除了这种情况,我 100% 确信这不是客户端缓存问题。 我有一个内容非常
我的问题是关于 Motivation用于实现启发式 O(n) 算法。 There are some generic solutions to this algorithmic problem ofge
我正在学习“Prolog by Example”一书中的一个例子(Helder Coelho 和 Jose C Cotta)。 Write a program for designing an arc
站等待以检测信道是否空闲 DIFS,然后开始传输。我的问题是为什么只等待 DIFS 而不是 SIFS。 它可能导致什么问题(对 SIFS 而不是 DIFS 的意义)? 最佳答案 简短回答: SIFS不
我这里有一个小型聊天应用程序。 我可以有两种类型的消息: - 文本 - 视频 我在解码 JSON 时使用多态性,如下所示: import Foundation enum MessageType: In
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正在谈论reactJS中的协调 我阅读了 React Documentation 上的这一部分,react 说 -> 当比较两棵树时,React 首先比较两个根元素。根据根元素的类型,行为会有所不同
使用 msysgit在 Windows 上,每当我在具有一个或多个子模块的存储库上执行 git diff 时,命令提示符(以及 PowerShell)都会崩溃。 这是已知问题吗?是否有修复/解决方法?
这有什么区别: X \= Y 和这段代码: dif(X, Y) 我认为他们应该表现得一样,但他们没有。这是示例: n_puta(L, N, X) :- nputa(L, N, 0, X). nputa
是否可以在 git diff --color-words 的同时不区分大小写 git diff?或者我是否需要在执行 git diff --color-words 时使用外部差异程序? (注意:如果你
我正在尝试一个新的分层线性模型,但数据结构让我想知道这在 R 中是否可行。我之前对模型的尝试被错误地指定(哎呀),现在我不知道如何处理这部分工作。我的 HLM 类(class)涵盖了多级模型和交叉分类
今天多次成功编译清理构建后,突然出现Netbeans 8.0.2错误: Unable to delete file C:\Users\Dov\Google Drive\NetBeansProjects
我是一名优秀的程序员,十分优秀!