关于前端:揭秘你处理数据的底层逻辑详解公式引擎计算二

15次阅读

共计 2718 个字符,预计需要花费 7 分钟才能阅读完成。

上篇中咱们介绍了计算公式引擎的计算原理,本期咱们持续带着大家理解在 Excel 表格中公式引擎的实现原理。

背景

在上节中解决了根本运算的逻辑之后,在一些理论业务场景中,公式计算并不是繁多公式进行的独立运算。咱们常常须要将一个很大的运算分解成前后依赖的小运算;同时这些单元格之间的计算会呈现很多相互依赖,计算程序也是要思考的一个关键问题,咱们须要将一系列具备先后顺序的同类运算治理起来顺次执行。

为了实现这种计算关系之间的治理,呈现了计算链,用以对公式之间的依赖和先后顺序进行治理,解决在电子表单中盘根错节的依赖。波及到图的解决,脏值计算等内容。接下来咱们将从图计算登程,介绍不同图的计算、按需计算和脏值解决的问题,更加深层次的理解 Excel 表格计算中计算链相干问题。

计算链

让咱们先从两个表格计算问题登程。

  • 第一种简略状况:

在这一串计算公式之中,当 C1 赋值为 1 时,A1 的后果为 3。但此时如果批改 C1 的值,C1=10,此时 B1 的内容还没有批改,A1 仍旧是 3,而后 B1=10+1=11,这里就会发现 A1 内容计算出错。

  • 第二种更加简单一些的状况:

咱们用图的结点示意单元格的计算内容,箭头代表依赖关系。入度为零的节点,齐全不依赖其余节点内容,所以计算的程序应该是从不依赖其余节点的节点内容开始。单元格 A 依赖 F、E,D 依赖 C、B,C、B 又别离依赖 F、E,唯二不依赖其余节点的内容是 E、F。

这样就失去了一个稳固正确的计算程序,这个程序被称之为计算链。在这个例子中计算链是:F,C,E,A,D,B。

有向无环图和有向有环图的计算

在一张图中,如果从一个节点登程,最初能回到这个节点,咱们称之为有向有环图,反之被称作有向无环图。

左图中不管从任意一个节点登程都不能再回到该节点,所以左图是有向无环图。

右图中 A 点能够登程后回到 A 节点,所以右图是有向有环图。

咱们将计算节点和计算节点之间的关系拆解成有向图后,就能够应用计算有向图的规范办法失去一个牢靠的计算链。

有向无环图的计算

对于每一个节点存在入度和初度的概念,入度:多少箭头指向以后节点,例如对于 A 节点,入度为 1;出度:以后箭头有多箭头指出,例如对于 B 节点,入度为 2。

在对有向无环图进行计算的时候,就利用了图中入度作为优先级排序,每次运算入度为 0 的节点,而后移除。

以上图为例,残缺的计算过程如下:

1. 初始化,统计入度:A:1 B:2 C:1 D:2 E:0 F:0

2. 计算 E 节点,更新入度: A:1 B:2 C:0 D:2 F:0

3. 计算 F 节点,更新入度: A:1 B:2 C:0 D:1

4. 计算 C 节点,更新入度: A:1 B:1 D:0

5. 计算 D 节点,更新入度: A:1 B:0

6. 计算 B 节点,更新入度: A:0

7. 计算 A 节点,计算完结有向有环图的计算

有向有环图的计算

解决了有向无环图的计算问题,如果此时把上图中 B - C 之间的箭头反向调换,状况就会变的截然不同起来。此时 B -C- D 之间组成了一个环。

这时候仍旧进行计算:

1. 初始化,统计入度: A:1 B:1 C:2 D:2 E:0 F:0

2. 计算 E 节点,更新入度: A:1 B:1 C:1 D:2 F:0

3. 计算 F 节点,更新入度: A:1 B:1 C:1 D:1

4. 没有入度为 0 的节点,开始迭代计算

(迭代计算:把上一步的计算结果代入这一步的运算中去,通过多步这样的计算,能够得出一个更为靠近的后果。)

按需计算

解决这种相互依赖的简单单元格的运算时,除了图计算还能够采纳按需计算的办法。在这里应用到的是 calcOnDemand 这个函数。这个函数的外围工作原理是:压栈并且计算所须要的节点内容,该节点能够是任意内容。

以该图内容来阐明这一计算的过程:这里抉择 A 作为咱们须要的节点

  1. 压栈并计算 A,须要计算 B 的后果
  2. 压栈并计算 B,须要计算 C 的后果
  3. 压栈并计算 C,须要计算 E 的后果
  4. 压栈并计算 E,E 计算结束后出栈
  5. 计算 C,C 计算结束后出栈
  6. 计算 B,还须要计算 D 的后果
  7. 压栈并计算 D,拿到 C 的后果,还须要 F 的后果
  8. 压栈并计算 F,F 计算结束后出栈
  9. 计算 D,D 计算结束后出栈
  10. 计算 B,B 计算结束后出栈
  11. 计算 A,A 计算结束后出栈
  12. 栈空,计算结束

这个例子取了最简单的 A 作为需要节点,如果须要 D 节点,变为 D 节点入栈,C 节点入栈,E 节点入栈,计算后出栈,C 节点计算后出栈,F 节点入栈计算后出栈,D 节点入栈,这样就失去了正确的 D 的值,这种运算形式只计算须要的内容。

图计算 VS 按需计算

在这里对图计算和按需计算做一个对别,这两种算法在不同状况下效率不同。

左图中是一个从上到下的累加,应用按需计算计算的很顺畅,从上向下按程序计算即可,堆栈中存在的待计算元素不超过两个,按需计算比图的计算更放慢。

右图中是是一个逆向计算,上一行单元格的内容依赖下一行单元格的内容,按需计算须要计算 1000 步,这时按需计算会比图计算慢很多。

总体来说,图计算比按需计算更加稳固,而按需计算在不同状况下会有不同的体现,理论应用中咱们能够依据具体的应用场景采纳不同的计算策略。

脏值计算

在这个图中,如果此时批改了某节点的值,这个时候就须要依据流传路径,标记所有须要重算的节点。

举例:批改了 E 的内容

  1. 依据流传顺次将 E C B D A 标记
  2. 删去未标记的节点
  3. 开始计算残余的节点

标记实现之后,咱们就不再须要关注未标记节点,计算实现。

整个过程如下图所示:

拓展:对于运算内容几个问题

曾经介绍完计算链的全部内容,为了帮忙大家更好地了解,这里有几个思考问题:

  1. 示例中的图计算,可否可改用按需计算?
  2. 可不可以先计算 E 的值,再标记并重算 C B D A?
  3. 依据流传路径标记须要重算节点的劣势?

解答局部:

  1. 该图能够进行按需计算,因为按需计算和图计算都能够对图内容进行正确计算。
  2. 该图中不能够先算 E,而后重标 CBDA,因为一旦咱们一但先计算 E,此时 C 仍旧依赖 E 的内容,而 C 又不能先于 E 计算,这时 ABCD 节点数值都会变得不牢靠,这个计算援用链就会被齐全毁坏。
  3. 脏数据的解决中只对流传门路上的节点进行解决,在理论利用场景下,几百个单元格数据处理使,能够大大减少运算的内容。

总结

所有的单元格计算内容就全副为大家介绍结束了,咱们一起回顾一下本章节内容:计算链就是将一个个单元格计算串联起来,分为一般计算和迭代计算。而这里咱们介绍了两种不同的计算形式——图计算和按需计算,在面对不同情须要抉择采纳不同的计算策略。计算链在整个计算过程中不像单元格的计算那么显著,然而却比单元格的计算更加简单。

在理解了计算公式如何进行词法、语法分析对公式进行疾速运算,计算链是如何进行多单元格大数据量的解决,接下来将持续为大家介绍异步函数在前后算计算中的花式用法。

看到这里了点个赞吧~ 后续本葡萄也会为大家带来更多庄重或乏味的内容。

转载请注明出处:葡萄城官网,葡萄城为开发者提供业余的开发工具、解决方案和服务,赋能开发者。

正文完
 0