分而治之 - 比较
Posted
技术标签:
【中文标题】分而治之 - 比较【英文标题】:Divide and Conquer - Compare 【发布时间】:2011-05-22 11:52:43 【问题描述】:如何使用分而治之的算法来确定数组中至少一半的对象是否返回 true(在某些函数上)?对象没有可枚举的值,因此对象 A 绝不大于对象 B。
为了澄清,使用该函数将所有对象相互比较。所以 funct(Obj a, Obj b) 根据某些标准返回真或假。它们可以聚集在一起,我们只想知道是否至少有一半的比较对象返回 true。
【问题讨论】:
那些会为该函数返回 true 的函数是否聚集在一起? 澄清一下,使用该函数将所有对象相互比较。所以 funct(Obj a, Obj b) 根据某些标准返回真或假。它们可以聚集在一起,我们只想知道是否至少有一半的比较对象返回 true。 您是要对所有元素对进行比较,还是要将数组的所有元素与已知值进行比较,例如如果数组是整数,你想知道一半是否是个位数? 比较所有要比较的元素对。例如:a,b,c 比较 (a,b), (a,c), (b,c) 但我需要知道是否至少有一半返回 true。这些对象是不可比较的,必须是 O(nlogn) 【参考方案1】:为什么要使用分而治之?当使用简单的算法“迭代和计数”时,回答你的问题看起来是 O(n) ......而且你不可能知道一半的对象将使用任何检查小于 O(n/2) 个对象的算法返回 true,这与 O(n) 相同。
编辑:好的,编辑显示它不是您正在应用的谓词。所以我的回答不适用。我仍然不明白您如何真正定义“对象的一半返回真”。它们与什么相比返回真实?我们拥有的是n**2
对(可能更少,不清楚一个对象是否可以与自身进行比较)。你的意思是当应用比较函数时,有一半的 n**2
对返回 true 吗?
如果是这样,与前一个非常相似的推理会得出结论,你注定要失败,不能比O(n**2)
做得更好
【讨论】:
示例:如果某个函数 FUNCTION(a, b) = true,则给出 (a, b, c, d)。然后至少有一半的对象返回 true。 返回的对象是所有可能的对? 如果是这样,你又一次注定要失败,这里没有分而治之。但正如另一张海报所建议的那样,可能存在一些可能的平行化。【参考方案2】:取决于很多事情:
有多少个对象? 他们被订购了吗? 您使用什么语言? 这是在什么机器上运行的?
我会说,如果您在一台机器上有很多随机排序的项目,而该机器的进程将从线程中受益,请创建几个线程并为每个线程分配一块数据以供使用。一旦您获得的通过或失败次数超过对象数量的一半,您就有了答案。
【讨论】:
有n个对象。总是不同的大小。它们没有排序,因此没有排序值。语言或机器无关紧要。以上是关于分而治之 - 比较的主要内容,如果未能解决你的问题,请参考以下文章