经济普查产品目录审核的分析及优化[11]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

根据总运行时间函数f(u)=t0+t1u,其中u是参加审核的单位个数,t0是固定的,也就是开始处理每个单位前都要用的时间,实际上主要是rplist排序和系统对数据表建立索引的时间。下面的主要工作就是如何减少每个单位处理的时间t1,达到缩短总时间的目的。

(二)查找算法的选择

每个单位处理的时间由二部分组成,一部分是形成该单位要执行的审核关系式的清单,另一部分是对清单中的审核关系式进行审核。我们要从这二方面着手减少处理的时间。

findFirstRProdIndex( rplist,cplist[i,1] )函数用来在rplist中找到第一个出现的cplist[i,1],已知元素有2568个,而且已经排好序,符合二分查找的条件,把它改为二分查找,将可以缩短查找时间为原来的大约Log2 (N)/N×2。但是二分查找无法实现对“第一个”出现的元素的查找,为此新增了数组unicodelist用来存放单个子产品代码以及它第一次出现在rplist的位置,通过对unicodelist的二分查找得到它在rplist的位置,由于rplist已排好序,所以从中顺序挑选子产品代码存入unicodelist,unicodelist自然已经排好序了。

尽管如此我们作了这些额外的事,经过测试,此项改动在单位个数为3700,大约可以使总执行时间由180秒(已改用Shell排序)进一步缩短为130秒完成。

getERProdid(prodid, erplist )函数用于查找主产品或者副产品,如果找到是副产品,返回其主产品,erplist有 440个元素,改用二分法也将有不少的收益。但原来erplist 存放需要检查计量单位同时存在的关系的产品号,不同的关系用 0分隔,排序后就失去了分隔标志,需要用一个新代码来代替,这个新代码的值应位于上一种关系最后一个产品和下一种关系第一个产品代码之间,才能在排序后保持原有的相对位置。考虑到有的上一种关系最后一个产品和下一种关系第一个产品代码是连续的,比如:3050003, 3050004, 0, 3050005, 3050006, 0。在这里,用下一种关系第一个产品代码来替代0分隔是很合适的,经过替换以后,erplist已经有序了。查找的时候,只要判断两个连续的代码是相同的,就可以确定它是主产品代码。

取得提示信息的函数有2个,它们目前也都是采用顺序查找,理论上也可以用排序后二分查找的办法提高效率,但经过实验发现,这些函数总的执行次数(时间)很少,可以忽略不计,这可能与我们采用的样本数据只有很少的错误有关。ePRAS公式的设计者在设计verify expr,ErrorMsg()语句的时候,采用了类似C语言多个条件复合表达式的短路技术(比如复合表达式(true or expr2)不管子表达式expr2的值是什么,总是返回true),如果知道前面expr的值为true,就不再调用后面ErrorMsg()函数了。

如果原始数据质量很差,错误很多,那么下面这些语句的优化还是值得的。

getErrorMsg(prodid, plist, pmsg )

本文关键:经济普查产品目录审核的分析及优化
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top