是否存在将项分区为等价类的子二次算法?

时间:2018-01-09 22:26:28

标签: algorithm partitioning

我正在寻找一种算法。输入是项目列表x和这些项目的等价关系R,其在O(1)时间内进行评估。输出是x到等价类的分区。

检查所有对的R(x[i], x[j])的直接算法在O(N ^ 2)中运行。我想知道一般情况下是否有可能做得更好。

我可以使用O(Nα(N))时间内的Union-Find跟踪等价类,因此这不是障碍。我认为我需要的是一种检查对子集的策略。

1 个答案:

答案 0 :(得分:0)

当然可以做得更好:m类的 O(Nm)是非常可能的。设cls [m] [*]是一个2D数组项,我们将其分为m个类(第二个下标是每个类的变量索引)。

new_class = 0
for item in all_items
    found = false
    for cls_idx in (0:new_class-1)
        if R(cls[cls_idx][0], item)   // if item is in this class, add it
            found = true
            cls[cls_idx].add(item)

    if not found            // start a new class
        cls[new_class] = item
        new_class += 1

您触摸每个项目一次。对于每个项目,您将与不超过m类“founder”元素(每个类的第一个元素)进行比较。复杂性取决于mN的关系。例如,如果m是常量(类的数量限制),那么这是 O(N)