algorithm - n个对象的等价性测试

标签 algorithm recursion divide-and-conquer

假设我们有“n”个对象和一个子程序,该子程序接受两个输入并判断它们是否相等(例如,如果它们相等,它可以输出 1)。

我需要想出一个算法来调用上述函数 O(n log n) 次,并确定输入是否有超过“n/2”个彼此等价的项目。

最佳答案

您可以使用 Boyer-Moore 多数表决算法,该算法最多进行 n-1 次比较。

function find_majority(A)
    majority = None
    count = 0
    for a in A:
        if count == 0
            majority = a
        else if a == majority
            count += 1
        else
            count -= 1
    return majority

如果在数组中出现超过 n/2 次,则返回最常见的元素。

如果您需要知道是否有多数项,那么您可以第二次遍历数组,计算从 find_majority 函数返回的值出现了多少次。这又增加了 n 个比较。

关于algorithm - n个对象的等价性测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26157855/

相关文章:

java - 查找已排序循环整数数组的起点索引

algorithm - 只能递归解决的问题示例

c# - 更新线段树中的一项

python - python 中递归基本运算的计算器

java - 给定一个旋转排序数组,如何找到该数组中的最大值?

algorithm - 查找大部分无法订购的商品

python - 如何像使用嵌套 for 循环一样迭代任意数量的列表?

ruby - 比 Ruby 编码(marshal)更快/更有效的替代品?

java - 如何在Java中的arraylist中递归所有子级

c - 如何使用递归打印出 C 中一系列数字的所有排列?