上篇中我们介绍了计算公式引擎的计算原理,本期我们继续带着大家了解在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. 脏数据的处理中只对传播路径上的节点进行处理,在实际应用场景下,几百个单元格数据处理使,可以大大减少运算的内容。

总结

所有的单元格计算内容就全部为大家介绍完毕了,我们一起回顾一下本章节内容:计算链就是将一个个单元格计算串联起来,分为普通计算和迭代计算。而这里我们介绍了两种不同的计算方式——图计算和按需计算,在面对不同情需要选择采用不同的计算策略。计算链在整个计算过程中不像单元格的计算那么明显,但是却比单元格的计算更加复杂。

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

看到这里了点个赞吧~后续本葡萄也会为大家带来更多严肃或有趣的内容。

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

揭秘你处理数据的“底层逻辑”,详解公式引擎计算(二)相关推荐

  1. 【中级02】Java Class字节码文件底层逻辑详解

    Java的class文件是什么 Class文件是jvm认识的一种字节码文件,里面的地址都是逻辑的地址.最后需要运行在操作系统中,操作系统只能识别真实的物理地址.此时需要动态链接(这个过程就是将逻辑地址 ...

  2. 我赢助手详解抖音推荐算法的底层逻辑,视频是怎样从零开始到爆款的?

    我赢助手详解抖音推荐算法的底层逻辑,视频是怎样从零开始到爆款的? 话不多数,直接上干货,看看抖音推荐机制是怎么处理视频的. 1.视频上传 视频上传后,第一时间先经过机器审核,主要包括:图像识别.音频识 ...

  3. C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解

    这里写目录标题 C语言的底层逻辑剖析函数篇(其二),0基础搞定函数,初识函数递归,超详解 开篇语 函数的调用(嵌套调用和链式访问) 1.嵌套调用 2.函数的链式访问 函数的声明和定义 函数声明和定义分 ...

  4. 微信被误封号怎么办?详解微信封号的底层逻辑

    最近,不少电商客户跟我反映微信被腾讯封号了.如下图所示: 首先,腾讯对微信管控的颗粒度更细了,以前是直接封号,现在,如限制私聊.朋友圈,限制加人等等. 但这些客户有个疑问就是:自己没有做任何违规活动, ...

  5. 对话行癫:解密阿里云顶层设计和底层逻辑 1

    几十个问题,万字长文,阿里云新任总裁行癫履新后首次出面与钛媒体独家深入讨论了一下阿里云对云计算未来的判断,深度解读未来阿里云生态战略,揭秘阿里技术委员会和阿里中台思想的原生思考.转载自钛媒体,作者:刘 ...

  6. 【云周刊】第213期:对话行癫:解密阿里云顶层设计和底层逻辑

    欢迎订阅云周刊 本期头条 对话行癫:解密阿里云顶层设计和底层逻辑 几十个问题,万字长文,阿里云新任总裁行癫履新后首次出面与钛媒体独家深入讨论了一下阿里云对云计算未来的判断,深度解读未来阿里云生态战略, ...

  7. 【云周刊】第213期:对话行癫:解密阿里云顶层设计和底层逻辑...

    欢迎订阅云周刊 本期头条 对话行癫:解密阿里云顶层设计和底层逻辑 几十个问题,万字长文,阿里云新任总裁行癫履新后首次出面与钛媒体独家深入讨论了一下阿里云对云计算未来的判断,深度解读未来阿里云生态战略, ...

  8. 转载|网络编程中阻塞式函数的底层逻辑

    逛知乎看到的,觉得写的挺透彻的,转载一下,原文链接:Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗? 原文以阻塞式的recv函数作为讲解,但是所有阻塞式的api底层逻辑基本相通. ...

  9. 【elasticsearch】 Elasticsearch集群规模和容量规划的底层逻辑

    1.概述 转载:https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484628&idx=1&sn=666e41 ...

最新文章

  1. 【用深度学习搜索相似服饰】《Using Deep Learning to Find Similar Dresses》by Luis Mey
  2. 配置腾讯云服务器-2021-3-27
  3. 实现php a标签文件,HTML_如何点击a标签实现弹出input file上传文件对话框,html 复制代码代码如下: SPAN - phpStudy...
  4. MPLS 典型应用场景——Vecloud
  5. word一键生成ppt 分页_如何一键把Word转换为PPT?
  6. 细数Android开发者的艰辛历程,全网最新
  7. 领域驱动设计:软件核心复杂性应对之道_人人都可以领域驱动设计(一)
  8. Asp.net系列--基础篇(二)
  9. 名片识别信息分类python_名片识别API接口_免费数据接口 - 极速数据
  10. 使用STM32或GD32解析xml格式数据
  11. php页面跳底部,监控页面滑到底部加载事件的jq
  12. UCOS 杂项 笔记
  13. 《和码中文》第一册词组(共25课)
  14. 阿里巴巴 Excel工具easyExcel
  15. API 每日一图API
  16. PHM寿命预测内容定稿
  17. 计算机网络速度怎么改,教你调网速让电脑速度更快-怎么让电脑速度变快
  18. 【微信小程序】全局分享和页面分享
  19. nest.dll_每日新闻摘要:再见Nest.com,您好Google Store
  20. 逆向直播盒子Green-iOS客户端

热门文章

  1. win10wifi间歇性断网重启后恢复_win10间接性断网怎么解决_win10电脑网络老是间歇性断网如何恢复-win7之家...
  2. gm修改爆率需要重启服务器吗,传奇GM教程 传奇私服如何调整爆率
  3. java导出表格vsd_java - 如何使用Apache POI将vsd / vsdx文件转换为图像(例如jpg png) - 堆栈内存溢出...
  4. 公司实际控制人和控制人的计算(内容在不断完善中。。。)
  5. java高并发程序设计1-线程停下来(stop,wait,suspend,await,interrupt,join,yield,sleep)的操作
  6. 明尼苏达量表结果分析_明尼苏达满意度量表+【长式量表100题】+【稀缺资源】+【免费分享】...
  7. ocr 哪个好 外文_ocr英文识别软件哪个好 好用的ocr英文识别软件推荐
  8. [RK3288][Android6.0] PWM backlight 驱动流程小结
  9. STM32应用开发实践教程:基于 CAN 总线的多机通信应用开发
  10. mac 中通过终端快速用 VsCode 打开当前目录,出现 command not found: code 问题解决方案