返回第一百四十六章:算法瓶颈  四合院:谢採购的科技帝国首页

关灯 护眼     字体:

上一章 目录 下一页

最新网址:m.92yanqing.net

“yh-calc”表格程序的设计,如同一座刚刚打好地基的建筑,蓝图宏伟,但真正开始砌墙架梁时,才发现內部结构的复杂远超想像。软体组在实现了最基本的网格显示、数字和文本输入后,便一头撞上了坚硬的“算法瓶颈”——公式的解析与依赖关係的动態管理。

最初的方案简单粗暴:每当任何一个单元格的值发生变化时,就遍歷整个表格的所有单元格,检查其公式中是否引用了发生变化的单元格,如果有,则重新计算该公式。这个方法在谢明华看来,无异於用高射炮打蚊子,效率低下得令人髮指。在一个10x10的微小网格上尚可勉强运行,但一旦表格规模扩大,比如到100x100,计算量將呈指数级增长,足以拖垮目前原型机那有限的性能。

调试间里,徐工和几位核心软体工程师围在原型机前,屏幕上显示著那个10x10的测试网格。徐工在a1单元格输入数字10,在b1单元格输入数字20,然后在c1单元格输入公式“=a1+b1”,屏幕上立刻显示出正確的结果30。

“现在,改变a1的值为5。”谢明华在一旁说道。

徐工照做。只见屏幕短暂地凝固了一下,虽然时间很短,但能明显感觉到迟滯,然后c1单元格的值才刷新为25。

“感觉到了吗?这仅仅是三个单元格。”谢明华指著屏幕,“如果我们有一百个、一千个单元格,其中几十个单元格都含有复杂的公式,並且相互引用,这样的全局遍歷重算,会让系统瞬间卡死。”

眾人沉默。他们都明白问题的严重性。这不仅仅是速度问题,更关乎程序的可用性。

“我们必须找到一种方法,只重新计算那些『真正受到影响』的单元格。”谢明华走到旁边的小黑板前,画了一个简单的示意图,“我们需要建立一套『依赖关係图』。”

他画出几个节点,代表单元格,用箭头表示引用关係。“比如,c1 依赖於 a1 和 b1,d1 的公式是 『=c1*2』,那么 d1 就依赖於 c1。当我们改变 a1 的值时,受影响的单元格是 a1 -> c1 -> d1,是一条链。我们不需要去检查与 a1 无关的 e1、f1 等单元格。”

“谢主任,这个思路我们討论过,”一位负责核心算法的工程师面露难色,“难点在於,如何动態地建立和维护这个依赖关係图?公式是可以隨时编辑修改的,可能这一刻c1引用a1,下一刻用户就把公式改成引用e1了。依赖关係是在不断变化的。”

“还有循环引用的问题,”徐工补充道,“如果用户在a1输入 『=b1+1』,在b1输入 『=a1+1』,系统必须能检测到这种循环依赖,並报错,而不是陷入死循环导致崩溃。”

问题一个接一个,如同纠缠在一起的线团,找不到那个可以轻易抽出的线头。软体组尝试了几种不同的数据结构来存储依赖关係,但在处理动態更新和循环检测时,要么逻辑过於复杂容易出错,要么计算开销依然很大。

连续几天的討论和尝试,进展甚微。实验室里瀰漫著一种熟悉的焦灼感,与之前攻克磁碟格式化难题时如出一辙。徐工等人的脸上又掛上了熬夜后的疲惫和苦苦思索的痕跡。

记住我们101看书网

谢明华的压力同样巨大。他拥有超越时代的见识,知道后世成熟的电子表格软体是如何处理这些问题的,比如使用拓扑排序来安排计算顺序,使用脏位標记(dirty flag)来避免不必要的计算。但如何用当下这个时代有限的程式语言和硬体资源,优雅而高效地实现这些思想,却是一个巨大的挑战。他不能直接给出答案,那样太过惊世骇俗,他必须引导团队自己去思考,去发现。

这天晚上,他带著一身的疲惫和满脑子的依赖关係图回到家中。已是华灯初上,四合院里飘散著各家各户的饭菜香气。

本章未完,点击下一页继续阅读。(1 / 2)

『加入书签,方便阅读』

上一章 目录 下一页