我必须实现一种解决多选问题的算法。 多选问题是:
给定从线性有序集中绘制的n个元素的集合S,以及在1和n之间的正整数集合K = {k1,k2,...,kr},多选问题是选择ki-所有i值的最小元素,1< = i< = r
我需要解决Θ上的平均情况(n log r) 我找到了一篇实现我需要的解决方案的论文,但它假设集合S上没有重复的数字。问题是我不能假设,我不知道如何调整那个算法纸张支持重复的数字。 论文在这里:http://www.ccse.kfupm.edu.sa/~suwaiyel/publications/multiselection_parCom.pdf 并且算法在第二页上。欢迎任何提示!
答案 0 :(得分:2)
对于后人:Ivan引用的算法是对K进行排序,然后按递归方式解决问题,如下所示。使用QuickSelect找到第k个最小元素x,其中i是ceil(r / 2),然后递归到K和S的较小的一半,以及K和S的较大的一半,将K绕i和S分开约为x。
找到在简并存在的情况下工作的算法(这里是相同的元素)通常不是理论工作的作者的高优先级,因为它使得常见案例的呈现更加困难,并且通常不会发挥作用确定问题的计算复杂性。这基本上是一维问题,黑盒解决方案很容易;用(yi,i)替换输入yi的第i个元素,并使用第二个组件在比较中断开关系。
在实践中,我们可以做得更好。而不是递归{y:y in S,y< x}和{y:y in S,y> x},使用关于x的三向分区算法(参见,例如,每个足够完整的QuickSort处理),然后将数组S除以索引而不是值。