Algorithm 如何在多集求和中找到第K个最小元素?

Algorithm 如何在多集求和中找到第K个最小元素?,algorithm,big-o,analysis,Algorithm,Big O,Analysis,需要一些帮助来设计一个算法来解决这个问题 设a和b为带a的整数≤ b、 让[a,b]表示集合{a,a+1,a+2,…,b}。假设给我们n这样的集合[a1,b1],…[an,bn],它们的多集和是 S={a1,a1+1,…,b1,a2,a2+1,…,b2,…,an,an+1,…,bn} 例如,[5,25]、[3,10]和[8,12]的多集和是 {3,4,5,5,6,6,7,7,8,8,9,9,10,10,…,25} 给定集合[a1,b1],…,[an,bn],使得0≤ 哎,比≤ N和一个整数k>0

需要一些帮助来设计一个算法来解决这个问题

ab为带a的整数≤ b、 让[a,b]表示集合{a,a+1,a+2,…,b}。假设给我们n这样的集合[a1,b1],…[an,bn],它们的多集和是

S={a1,a1+1,…,b1,a2,a2+1,…,b2,…,an,an+1,…,bn}

例如,[5,25]、[3,10]和[8,12]的多集和是

{3,4,5,5,6,6,7,7,8,8,9,9,10,10,…,25}

给定集合[a1,b1],…,[an,bn],使得0≤ 哎,比≤ N和一个整数k>0,设计了一个有效的算法,输出S中的k个最小元素,即集合的多集和。根据n和n确定算法的运行时间。

我已经设计了两个助手算法,分别称为FindElementsBefore(x[a1,b1]…[an,bn])和FindElementsAfter(x[a1,b1]…[an,bn])。它们都接受一个元素x和每个集合,并分别返回S中小于x和大于x的元素数


我的教授告诉我,使用这两种辅助方法,我应该能够解决上述问题,但我完全被难住了。如何解决此问题?

使用二进制搜索。


您已经知道多集总和中的最大值和最小值。因此,第k个最小元素有一个上界和下界。现在,您可以简单地在上下界递归,具体取决于
FindElementsBefore(mid,…)的值。二进制搜索怎么样?在
O(n^2)
中,您的问题有一个解决方案。你想要更好吗?我不确定,但也许
O(n)
是可能的。这就是答案。以O(n log n)运行时结束,其中n是S中不同数字的数量,n是被求和的集合总数