寻找最大的子集,其中任何一对中的每个数字都可被另一个数字整除

时间:2016-06-18 15:43:20

标签: arrays algorithm math data-structures

给定大小为 N 的数组 A 。我需要找到子集中任何一对元素的最大子集的大小,其中一个元素可以被另一个元素整除。

简而言之,找到最大的子集 S ,其中∀i,j 其中 i≠j i&lt; | S |和j&lt; | S | S i %S j = 0 S j %S <子> I = 0

问题的界限是:

  1. 1≤N≤10^ 3
  2. 1≤A i ≤10^ 9
  3. 示例输入/输出

    数组4 8 2 3 输出为3

    解释

    答案集是(4,8,2)

    该组的大小为3

1 个答案:

答案 0 :(得分:3)

我假设数组A中没有重复项。 一种方法(伪代码,假设数组索引从1开始):

def func(s: Seq[Char], idx: Int): String = 
  if(idx == s.length) "foo" else s(idx) match {
    case ')' => func(s, idx+1)
    case _ => func(s, idx+1)
  }

def func1(s: Seq[Char], idx: Int): String = 
  if(idx == s.length) "foo" else (s(idx) == '(') match {
    case true  => func(s, idx+1)
    case _ => func(s, idx+1)
  }

import scala.util.Random
def randy = Stream.continually(Random.nextPrintableChar)


def doit(n: Int)(f: (Seq[Char], Int) => String) = {
 val start = System.currentTimeMillis;       
 f(randy.take(n).toIndexedSeq, 0); 
 System.currentTimeMillis - start
}


scala> doit(1000000)(func)
res9: Long = 231

scala> doit(1000000)(func1)
res10: Long = 238

scala> doit(1000000)(func)
res11: Long = 234

scala> doit(1000000)(func1)
res12: Long = 201

这在O(n 2 )时间运行并使用O(n)额外空间。 它在数组B中计算最长除数链的长度,该除数链由A元素组成并在特定元素处结束。 B中的总体最大值必须是最长链的长度。