我有一组按特定顺序排列的数字。订单很重要,需要维护。我需要找到符合条件的最大连续数字。
示例 :
条件:素数
输入数据:1,3,2,4,7,5,3,11,2,4,6, 3,7,3,5,1,3,7,5 ,4
Answer : 8
答案 0 :(得分:2)
此解决方案要求您知道输入的每个元素的位置i。这不一定容易,但现在就假设它。
首先,想象一下将每个值映射到列表中的索引i,然后只保留原始值n满足条件的值。然后,只需要在输入中找到最长的连续序列。
首先,对于输入中的每个值,在位置i处,取i的前几位,可能是前8位,作为输出键。这将导致附近的值转到256中的相同reducer。输出此值作为键,如果原始值满足条件,则输出值。
在每个reducer中,只需遍历索引并记录您看到的最长连续序列。将其作为(开始,结束)发出。
最后,您将从reducer中读取所有这些值,并注意两个不同Reducer的两个序列实际上一起运行的情况(一个结束于n,另一个结束于n + 1)。折叠那些,然后只报告最长的那个。
这在Spark中也很简单。
答案 1 :(得分:0)
因为订单是重要的,所以你应该专注于找到符合条件的长和连续范围的问题。
这样的事情:
您可以将输入数据并行化,包括另外5个字段到系列中的每个元素:
所以:
输入数据:
1,3,2,4,7,5,3,11,2,4,6,3,7,3,5,1,3,7,5,4
会变成:
输入数据:(1,1,1,,true,false),(3,2,2,,false,false),(2,3,3,,false,false),(4,4,4,,false,false),(7,5,5,,false,false),(5,6,6,,false,false),(3,7,7,,false,false),(11,8,8,,false,false),(2,9,9,,false,false),(4,10,10,,false,false),(6,11,11,,false,false),(3,12,12,,false,false),(7,13,13,,false,false),(3,14,14,,false,false),(5,15,15,,false,false),(1,16,16,,false,false),(3,17,17,,false,false),(7,18,18,,false,false),(5,19,19,,false,false),(4,20,20,,false,true)
因此,通过这种方式,您可以并行化保持对订单的引用并具有明确的停止条件。
对于缩减阶段,你必须验证2个条件,并且只减少满足这两个条件的元素元组,其他方式,不减少,但可能更新第4,第5,第6个附加字段,然后保持迭代直到达到停止条件。
1)要恢复的元素是连续的(邻居) 2)元素满足特定条件,对于您的情况:两个元素都是素数
如果:你减少了 其他情况:继续进行reduce阶段,直到数据中的连续元组仍然没有被评估,换句话说,当任何一个元素在其第4或第5个字段中保持false值时。
减少的案例:
a)您收到要减少的元素(3,12,12,,false,false)
和(7,13,13,,false,false)
:
然后,您将返回:("3,17",12,13,true,false,false)
b)您收到要缩减的元素(6,11,11,,false,false)
和("3,17",12,13,true,false,false)
:
然后,您将返回:("3,17",12,13,true,true,false)
和(6,11,11,false,false,true)
c)您收到要减少的元素(1,1,1,,true,false)
和(3,2,2,,false,false)
:
然后,您将返回(1,1,1,false,true,*true*)
和(3,2,2,false,*true*,false)
d)您收到要减少的元素(5,15,15,,false,false)
和(3,17,17,,false,false)
:
然后,您将同时返回(5,15,15,*true*,false,false)
和(3,17,17,*true*,false,false)
e)您收到要减少的元素(5,15,15,true,false,false)
和(1,16,16,,false,false)
:
然后,您将返回("5,1",15,16,true,false,false)
最后你会得到8个元素:
("1,2,3",1,3,true,true,true)
(1,1,1,,true,false),(3,2,2,,false,false),(2,3,3,,false,false)
(4,4,4,false,true,true)
(4,4,4,,false,false)
("7,5,3,11",5,8,true,true,true)
(7,5,5,,false,false),(5,6,6,,false,false),(3,7,7,,false,false),(11,8,8,,false,false)
(2,9,9,true,true,true)
(2,9,9,,false,false)
(4,10,10,false,true,true)
(4,10,10,,false,false)
(6,11,11,false,true,true)
(6,11,11,,false,false)
("3,7,3,5,1,3,7,5",12,19,true,true,true)
(3,12,12,,false,false),(7,13,13,,false,false),(3,14,14,,false,false), (5,15,15,,false,false),(1,16,16,,false,false),(3,17,17,,false,false),(7,18,18,,false,false),(5,19,19,,false,false)
(4,20,20,false,true,true)
(4,20,20,,false,true)