一种非线性报表的单次遍历算法制造技术

技术编号:2837868 阅读:243 留言:0更新日期:2012-04-11 18:40
本发明专利技术属于计算机信息处理技术领域,涉及一种报表的计算方法,具体涉及一种基于非线性报表生成方法、可处理单元格间计算引用关系的高效计算方法,称为非线性报表的单次遍历算法。在报表扩展过程中单元格数量不断增加的情况下,该方法仍只需将报表上的单元格进行一次遍历即可判断出报表上是否有循环引用并在无循环引用正确完成计算,从而大幅度降低运算复杂度而提高运算效率。

【技术实现步骤摘要】

本专利技术属于计算机信息处理
,涉及一种报表的计算方法,具体涉及一种基于非线性报表生成方法、可处理单元格间计算引用关系的高效计算方法,或称为非线性报表的单次遍法算法。
技术介绍
在报表计算中需要考虑单元格之间的引用关系(显然,必须把表达式中引用到的单元格都计算出来之后才能计算本表达式的值)。对于静态报表,可以将所有单元格根据引用关系排成一个序列,使得被引用的单元格总是在引用其的单元格的前面,如果不存在这么一个序列,则可以认定报表中出现了循环引用现象而无法正常计算。然而,对于非线性报表生成方法(其它动态报表生成方案也有类似问题)中,报表中的单元格是在计算过程中不断扩展复制的,即单元格的数量在计算过程中是不断变化的,在计算之初不存在一个完整的单元格序列,这时就不可能事先对报表上单元格根据引用关系排序。目前主要有两种方法处理这个问题1.原格排序法即对原始单元格进行引用排序,然后依次计算。但是同一个原始单元格在生成后的报表中对应了多个复制出来的单元格,原始格引用时并不总意味着其对应的生成单元格也互相引用,因此这种方法只能针对计算关系较简单的报表,这样将导致有许多原始格循环引用但实际不循环引用的报表无法计算(如计算累积值会引用自身将被认为是原始格循环引用)。2.多次遍历法按某种次序计算所有单元格,当发现引用了尚未计算单元格的单元格时暂先放弃,而去计算下一个单元格,遍历过全部单元格后再从头重复这一过程,直到报表上不再有任何未计算的单元格(计算完成)或一次遍历过程中报表上单元格数量未增多(没有执行扩展操作)且未计算的单元格数并未减少(发生循环引用)时停止。多次遍历法可以处理被原格排序法遗漏的报表,但反复的遍历导致计算复杂度很高,平均复杂度为0(n2),n是生成报表的单元格数量。
技术实现思路
本专利技术的目的在于针对目前非线性报表两种计算方法的不足,提供一种新型的计算方法,称为非线性报表的单次遍次算法。该方法不仅可以正确地计算出任何没有循环引用的报表,同时有更低的计算复杂度0(n)。本专利技术的技术方案如下,非线性报表的单次遍历算法,包括如下步骤(1)记报表上第一个单元格为c;(2)检查c是否已经计算,如果已计算则转到(8);(3)记数组q=(c);(4)如果q已是空集,则转到(8);(5)设u是q中最后一个元素,试计算或扩展u,如果成功则将u从q中删除,并转到(4)重复运行;(6)u计算失败时,取出一个u引用的未计算单元格v,如果v已经在q中,则算法结束并报告报表上有循环引用。(7)将v添到加q的最后面,转到(5)继续执行;(8)在报表上取出c的下一个单元格取代c,转到(2)继续执行,如果c已是最后一个单元格,则算法结束并报告报表计算完毕。算法过程中仅对所有单元格遍历了一次,故称为单次遍历法。进一步,在上述的单次遍历法中,步骤(5)中试计算或扩展单元格u时,如果u引用的单元格均已计算,则u必然可以计算成功;只有当某个被u引用的单元格未计算时,u才会计算失败,此时必可取出一个被u引用的未计算单元格,即步骤(6)中的v。更进一步,在执行步骤(5)时,如果u是扩展格,则在成功扩展u之后,报表上的单元格数量会增多,因此不能事先将报表上的单元格全部排序,而必须在步骤(8)中计算或扩展完前一个单元格再去取出下一个单元格。进一步,可以从数学上证明上述的单次遍历法能够判断出报表上是否存在循环引用且在不存在循环引用时正确地计算出报表,整个运算的复杂度为0(n),比多次遍历法的效率提高了一个数量级,其中n是生成报表上单元格的数量。本专利技术的有益效果在于在保证正确计算任何无循环引用报表的前提下,使计算效率得到了显著提高,复杂度从0(n2)降低到0(n)。附图说明图1是本专利技术所述方法的流程图。具体实施例方式下面结合说明书附图给出本专利技术的具体实施手段。设有如下的报表模板 其中B1是纵向扩展格,A1和C1的左主格设置为B1。用下面的表格表示算法执行过程中步骤与各变量值的变化情况,其中变化中的单元格将用小写字母表示。 附表1 附表2 显然,本领域的技术人员可以对本专利技术进行各种改动和变型而不脱离本专利技术的精神和范围。这样,倘若本专利技术的这些修改和变型属于本专利技术权利要求及其等同技术的范围之内,则本专利技术也意图包含这些改动和变型在内。本文档来自技高网
...

【技术保护点】
一种非线性报表的单次遍历算法,包括如下步骤:(1)记报表上第一个单元格为c;(2)检查c是否已经计算,如果已计算则转到(8);(3)记数组q=(c);(4)如果q已是空集,则转到(8);(5)设u是q 中最后一个元素,试计算或扩展u,如果成功则将u从q中删除,并转到(4)重复运行;(6)u计算失败时,取出一个u引用的未计算单元格v,如果v已经在q中,则算法结束并报告报表上有循环引用。(7)将v添到加q的最后面,转到(5)继 续执行;(8)在报表上取出c的下一个单元格取代c,转到(2)继续执行,如果c已是最后一个单元格,则算法结束并报告报表计算完毕。

【技术特征摘要】
1.一种非线性报表的单次遍历算法,包括如下步骤(1)记报表上第一个单元格为c;(2)检查c是否已经计算,如果已计算则转到(8);(3)记数组q=(c);(4)如果q已是空集,则转到(8);(5)设u是q中最后一个元素,试计算或扩展u,如果成功则将u从q中删除,并转到(4)重复运行;(6)u计算失败时,取出一个u引用的未计算单元格v,如果v已经在q中,则算法结束并报告报表上有循环引用。(7)将v添到加q的最后面,转到(...

【专利技术属性】
技术研发人员:蒋步星
申请(专利权)人:北京润乾信息系统技术有限公司
类型:发明
国别省市:11[中国|北京]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1