我有一个由许多有理数组成的集合,每个有理数的分子和分母都存储为一个大的(数百或数千位)无符号整数。我希望能够有效地测试集合中任何给定的有理数a/b
是否等于集合中的任何其他有理数c/d
。
当然,最直接的方法是测试a*d == b*c
,但我想要比计算完整产品更有效的方法。
关于我的特定用例的一些注意事项:
我认为这在理论上可能是不可能的,但为了以防万一,把它抛给蜂群头脑。
发布于 2016-11-29 01:49:11
通过比较位长度,可以过滤出许多不相等的分数对。设l( a ) = floor(log2(a)) +1 a的位长,若a/b = c/d,则l(a) + l(d) = l(c) + l(b)。
只有在长度之和相等的情况下,才可以在第一次比较长度和比较产品时使用此选项来加快速度。
发布于 2016-11-29 04:16:27
第二次尝试;)如果您必须重复检查新数字以进行集合包含,则应将相对质数小数存储在有序集合中。如果计数器相等,则集合的比较函数应首先比较计数器,然后再比较分母。比较可以在线性时间内完成,因此在具有M个项的有序集合中找到一个元素需要O(N log )步。减少分数的成本为O(N²)。因此,测试一个数字的容纳性需要O(N²+N log M)个步骤,并计算集合O(MN²)。
编辑:与使用排序或树集不同,您可以使用哈希集,从而将搜索所需的步骤减少到O(N²+ N) = O(N²)。
https://stackoverflow.com/questions/40727929
复制相似问题