本帖最后由 LonghronShen 于 2012-4-12 23:57 编辑
问题描述: 在彩票分析中最重要的一环就是对数据的频度分析。而数据样本就是历次彩票的开奖号码。有人认为可以通过统计学分析来统计出频度规律,并以此指导彩票购买。 已知:一定数量的彩票摇奖结果,格式类似于: 2007048 0211 12 15 17 28 我们可以根据空格来把这一条记录分为几个字段:开奖期号,号码1,号码2……号码6。事实上,这是一个典型的33选6的玩法得到的数据。每个号码的取值范围是1-33,在摇奖过程中将得到的是无重复的6个数字。其实,每一次的开奖结果就是一个组合中的一种。当然,这里33和6作为组合数的参数,在不同的彩票玩法中不同。虽然还有一些其它类型的彩票,但是我们目前仅仅局限于这种的数字组合类型的彩票。 彩票分析中最常见的是比较算法。常规比较对象有两种。 玩法1: 遍历数据库中的每条记录,并且和除它自身以外的所有项进行比较,统计出每条记录和当前记录有0个相同、1个相同、2个相同……n个相同的数目。根据相似度来选择较好的号码进行投注。 玩法2: 生成的全组合(),然后遍历所有可能,和数据库中所有条目进行比较。统计该子组合被包含的情况:0个相同、1个相同、2个相同……k个相同。在彩票界,如果某种组合被包含在某次的开奖结果中,则称这组合和这次的开奖结果“相生”,反之被称为“相克”。 要求: 请根据所学的C++知识(不局限于书本),实现一个类型(显然,m,n,k需要在运行时由用户给出;示例数据库包含的是33选6的10年间的所有数据)彩票数据分析的程序,以完成两种类型的分析。请勿改动数据库。 可能涉及到的知识点: 面向对象、运算符重载、模板、STL容器与STL算法、字符串处理,文件处理。 难点: 性能提示: 传统串行算法在玩法2中表现不佳。可以考虑算法的并行化。可以手工实现多线程,也可以使用OpenMP实现并行化。但是请注意OpenMP在某些编译器编译后不很稳定。请优先使用VC2010、GNU C++或者.NET的Task模型(使用.NET 4.5的Async模型更好)。 可移植性提示: 尽可能遵循ANSI/ISO C++标准,尽量减少对Windows的平台依赖性。比如在实现并行化时优先考虑使用OpenMP或者POSIX thread 线程库<pthread.h>,而非直接使用Win32 API来创建线程。 结果输出: 请将统计结果输出到CSV(Comma separated value files,逗号分隔数值文件)。形如:2007048, 02, 11, 12, 15, 17, 28为一行(一条记录)。另外还要求在控制台输出程序运行时间(以秒为单位,可以使用C标准库中的time()函数)。 执行样例:
|