我正在寻找一种算法。输入是项目列表x
和这些项目的等价关系R
,其在O(1)时间内进行评估。输出是x
到等价类的分区。
检查所有对的R(x[i], x[j])
的直接算法在O(N ^ 2)中运行。我想知道一般情况下是否有可能做得更好。
我可以使用O(Nα(N))时间内的Union-Find跟踪等价类,因此这不是障碍。我认为我需要的是一种检查对子集的策略。
答案 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”元素(每个类的第一个元素)进行比较。复杂性取决于m
与N
的关系。例如,如果m
是常量(类的数量限制),那么这是 O(N)。