这是我思考已久的一个问题...
假设我有一系列项目和它们之间的等价关系,并且比较两个项目的时间是恒定的。 我想返回项目的分区,例如,一个包含所有等价项目的链接列表。
一种方法是将等价性扩展为项目的排序,并对其进行排序(使用排序算法);然后所有等价项将是相邻的。
但这个问题是否可以比排序更高效地解决呢? 这个问题的时间复杂度是否低于排序的时间复杂度? 如果不是,为什么?
这是我思考已久的一个问题...
假设我有一系列项目和它们之间的等价关系,并且比较两个项目的时间是恒定的。 我想返回项目的分区,例如,一个包含所有等价项目的链接列表。
一种方法是将等价性扩展为项目的排序,并对其进行排序(使用排序算法);然后所有等价项将是相邻的。
但这个问题是否可以比排序更高效地解决呢? 这个问题的时间复杂度是否低于排序的时间复杂度? 如果不是,为什么?
您似乎一次提出了两个不同的问题。
1)如果只允许相等性检查,那么是否比我们有一些排序更容易进行分区?答案是不。在最坏情况下(例如全都不同),您需要Omega(n ^ 2)次比较才能确定分区。
2)如果允许排序,那么分区是否比排序更容易?答案还是不。这是因为元素唯一性问题。它说为了确定所有对象是否都不同,您需要Omega(nlogn)次比较。由于排序可以在O(nlogn)时间内完成(并且也具有Omega(nlogn)下限)并解决分区问题,因此从渐近意义上讲,它们同样困难。
如果选择任意哈希函数,则相等的对象不需要具有相同的哈希值,在这种情况下,将它们放入散列表中没有做任何有用的工作。
即使您确实想出了这样的哈希(保证相等的对象具有相同的哈希),好的哈希的时间复杂度也是期望的 O(n),最坏情况是Omega(n ^ 2)。
是否使用哈希或排序完全取决于问题中不可用的其他约束条件。
其他答案似乎也忘记了您的问题(主要)是关于比较分区和排序!
通常情况下,分区比排序更快,因为您无需将每个元素与每个可能相等的已排序元素进行比较,而只需要将其与您的分区的已建立键进行比较。仔细研究一下基数排序。 基数排序的第一步是基于密钥的某个部分对输入进行分区。基数排序的时间复杂度为O(kN)。如果您的数据集的密钥受到给定长度k的限制,则可以将基数排序设置为O(n)。如果您的数据是可比较的并且没有有界的键,但您选择了一个用于分区集合的有界键,则排序集合的复杂度为O(n log n),而分区的复杂度为O(n)。