包含常量集的测试

时间:2009-01-02 19:04:07

标签: language-agnostic code-generation set predicate

问题陈述:

给定一组事先已知的整数,生成代码以测试集合中是否存在单个整数。测试函数的域是某个连续范围内的整数。


现在对于要测试的范围或集合没有特别了解。范围可能很小或很大(但是解决方案可以拒绝大的问题但更高的限制更好)。可能是允许范围内的极少数值在集合中,或者大多数都在或介于两者之间。该集合可以是均匀分布的或集群的。可能存在大部分仅包含/不包含的值,或者在大多数条带中可能存在至少几种类型的值。 (有点像在分析排序算法时对要排序的项目所做的假设)

目标是生成运行测试的有效代码的过程。

想到的部分解决方案包括

  • 完美哈希函数(大型集合代价很高)
  • 范围测试:foreach(b in ranges) if(b.l <= v && v <= b.h) return true;
  • 树木/索引(在某些情况下比其他树木更贵)
  • 表格查找(对于大型集合来说代价很高)
  • 这些中的任何一个的倒数(kodos到Jason S

似乎理想的解决方案是能够选择最佳选项,或者如果没有选择,则使用树将整个范围分解为多个部分,然后切换到更适合它们的子部分的其他选项。

可能有用的主题包括:


注意:这不是作业。如果它是作为博士水平以下的作业发行的,教授应该用Nerf枪射击(如果你没有得到那么重新阅读问题,这非常非常重要)

注意:这是我几天前发生的一个问题,我一直在困惑。我没有直接使用它,但认为攻击是一个很酷的问题。我想生成代码的原因是因为生成的代码不会比一般代码慢(如果需要它可以是同样的东西),并且在某些/很多情况下可能更快。

我正在发布这个问题,以澄清我的想法。如果我能提出任何合理或酷的解决方案,我计划将它们作为模板元程序实现(生成代码的另一个原因)

有些人已经注意到这个问题很普遍。这就是重点。我希望生成一个可以在非常通用的域中运行的系统:某些范围内的整数集。

3 个答案:

答案 0 :(得分:1)

previous question on dictionary/spellchecking有许多回复提及Bloom filters;也许这会有所帮助。

我认为无论如何,测试大型设备都会很昂贵。

答案 1 :(得分:1)

让我们暂时假装这是一个真正的问题:

  • 对基本集或输入集的大小没有限制

这使得“问题”在任何实际意义上都不切实际,不明确,不可解决

如果有人想要提出解决方案,这里有一些单元测试用例:

  • 单元测试1:

    • 基本集合是-1,000,000,000,000和+1,000,000,000,000之间的所有整数,除了100,000,000,000个随机删除的值
    • 输入集是在相同范围内随机生成的100,000,000,000个整数
  • 单元测试2:

    • 基本集是Fibonacci系列
    • 输入集是1T随机生成的整数,范围为0..infinity

答案 2 :(得分:1)

还有boost::dynamic_bitset,不确定它在时间上是如何缩放的,或者在原始数字的分布方面是在空间中。 (例如,如果位以8/16/32/64的块存储,则稀疏位集效率低)

或者this (compressed bit set)this (bit vector)网页(我用Google搜索“大型稀疏位集”和“压缩位集”)