【问题标题】:Given a number K and a set of sorted numbers. Find if there is any number in the set which divides给定一个数字 K 和一组已排序的数字。查找集合中是否有任何数字可以除
【发布时间】:2011-07-06 09:09:06
【问题描述】:

给定一个数字 k 和一组已排序的数字。查找集合中是否有任何数字可以整除这个数字。

例如,如果 k = 8,并且集合是 { 3, 4, 5},则 4 将除以 8。4 就是答案。

最坏情况的解决方案是 O(n)。

我们可以做得更好吗?

【问题讨论】:

  • 您能描述一下您的最坏情况解决方案吗?到目前为止,你对自己有什么看法?另外,集合是否总是包含连续的数字?为什么 4 是答案? 2 也可以除以 8。
  • 为什么 2 不是答案?
  • 为什么 2 不是答案?您需要任何数字或最大的数字还是刚刚找到,没有找到就行?
  • 为什么 1 不是答案?
  • 对于小于O(n) 的情况,您当然可以使用O(sqrt(k)*log(n))。生成k 的所有因子,在集合中查找每个因子。

标签: algorithm generic-programming factorization


【解决方案1】:

如何分解数字(8 给我们 4 2 1)然后搜索给定集合中的因子?您可以使用设置交集或二等分搜索您的因素列表。我认为它会给你一个更快的大型集合的答案。

【讨论】:

  • 分解数字的最佳方法是什么?
  • ...但是您必须将集合中的数字分解为,以进行适当的交集 - 除非我遗漏了什么。
  • 关于这个问题,我不这么认为,因为他说“查找集合中是否有任何数字可以除以这个数字。”。所以我们正在查找我们的因子是否在集合中。而已。考虑到集合交集,我认为它们会表现不佳,因为根据定义,它们是无序的,并且交集是 O(n)。哎哟!所以我会使用因子的二进制搜索 - en.wikipedia.org/wiki/Binary_search_algorithm
  • 哦,我在想你只想对主要因素做一个交集。但是所有的因素?这对于大量数字来说是疯狂的。低于v 的素数的数量大约是v/ln(v),它们的所有组合会给你更多。
  • @Lmwangi:问题是,数字和集合有多大?对于非常大的数量和少量的候选人,我相信分解的成本将超过简单地尝试所有因素的成本。不过我不确定,所以请随时纠正我。
【解决方案2】:

如果 k 是素数,它在集合中没有任何因子,你就完成了。否则,k = p*q 其中 p 是 k 的最小因子。对 q 进行二分搜索。如果找到,你就完成了。否则,重构 k=p'*q',其中 p' 是 p 之后 k 的下一个最大因子——如果没有,你就完成了。否则,继续对 q' 进行二分搜索——注意 q'

编辑: 嗯...我猜这不是 O(logn)。例如,如果列表包含 k 的每个因子 f 的 f-1,那么您将不得不连续搜索每个 f,每次点击 f-1 ......这将是 O(n)。

【讨论】:

    【解决方案3】:

    计算 k 的 gcd 和集合成员的乘积。例如,gcd(3*4*5,8) = 4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2021-12-23
      • 2020-05-01
      • 1970-01-01
      相关资源
      最近更新 更多