2

问题陈述:

给定一组预先知道的整数,生成代码来测试集合中是否有单个整数。测试函数的域是某个连续范围内的整数。


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

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

想到的部分解决方案包括

  • 完美的散列函数(大集合成本高)
  • 范围测试:foreach(b in ranges) if(b.l <= v && v <= b.h) return true;
  • 树/索引(在某些情况下比其他更昂贵)
  • 表查找(大集合成本高)
  • 这些中的任何一个的倒数(杰森 S的科多斯)

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

可能有用的主题包括:


注意:这不是家庭作业。如果它是作为低于博士水平的家庭作业发布的,教授应该用 Nerf 枪射击(如果你没有得到那个然后重新阅读问题,这非常重要)

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

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

有些人注意到这个问题非常普遍。这就是我想说的。我希望生成一个可以在一个非常普遍的领域工作的系统:某个范围内的整数集。

4

3 回答 3

1

让我们暂时假设这是一个真实的问题:

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

这使得“问题”在任何实际意义上都是不切实际的、未指定的和无法解决的

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

  • 单元测试1:

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

    • 基集是斐波那契数列
    • 输入集是 0..infinity 范围内的 1T 个随机生成的整数
于 2009-01-02T20:10:45.117 回答
1

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

或者也许这个(压缩位集)这个(位向量)网页(我搜索了“大型稀疏位集”和“压缩位集”)

于 2009-01-02T20:49:59.123 回答
1

之前关于字典/拼写检查的问题有许多提到Bloom 过滤器的回答;也许这会有所帮助。

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

于 2009-01-02T19:46:38.707 回答