分区比分类更容易吗?

rei*_*ost 20 sorting algorithm partitioning time-complexity

这个问题一直困扰着我的脑海......

假设我有一个项目列表和它们的等价关系,并且比较两个项目需要恒定的时间.我想返回项目的分区,例如链接列表列表,每个列表包含所有等效项目.

这样做的一种方法是将等价扩展到项目的排序并对它们进行排序(使用排序算法); 那么所有等价物品都会相邻.

但它可以比排序更有效地完成吗?这个问题的时间复杂度是否低于排序?如果没有,为什么不呢?

小智 12

你似乎一口气问两个不同的问题.

1)如果只允许相等检查,它是否比我们有一些排序更容易分区?答案是不.您需要Omega(n ^ 2)比较来确定最坏情况下的分区(例如,所有不同).

2)如果允许排序,分区是否比排序更容易?答案是否定的.这是因为元素差别问题.其中说,为了确定所有对象是否都是不同的,您需要进行Omega(nlogn)比较.由于排序可以在O(nlogn)时间内完成(并且还具有Omega(nlogn)下界)并且解决了分区问题,渐近它们同样很难.

如果选择任意哈希函数,则相等的对象不需要具有相同的哈希值,在这种情况下,通过将它们放入哈希表中,您没有做任何有用的工作.

即使你确实提出了这样的哈希(相同的对象保证具有相同的哈希值),时间复杂度预期为好的哈希值O(n),最坏的情况是Omega(n ^ 2).

是否完全使用散列或排序取决于问题中不可用的其他约束.

其他答案似乎也忘记了你的问题(主要)是关于比较分区和排序!

  • @supercat:"任何不会为相等对象产生相等哈希值的哈希值都会被破坏." - 这是真的,但在这种情况下,哈希也需要为*等效*对象产生相等的哈希值.等价和平等之间存在差异."约翰史密斯"不等于"弗雷德史密斯",但如果你已经定义了只考虑姓氏的等同性,它们可能是等价的. (2认同)
  • @Dimi:甚至不知道是否存在合适的散列函数,您想建议对标题为“分区比排序更容易”的问题进行散列!?在实践中,没有人声称排序比散列更好(我在这里重复一遍)。如果您确实有一个不错的哈希函数,请使用它。如果你注意到的话,这个问题是一个理论上的问题,好坏仅取决于最坏情况的复杂性。我的回答确实提到散列是 _expected_ O(n) 且具有不错的散列。如果您看到我之前链接的答案,我希望您会同意排序可能会更好。 (2认同)

Dan*_*Dan 6

如果您可以为项目定义哈希函数以及等价关系,那么您应该能够在线性时间内进行分区 - 假设计算哈希是恒定时间.哈希函数必须将等效项映射到相同的哈希值.

如果没有哈希函数,则必须将要插入分区列表的每个新项目与每个现有列表的头部进行比较.该策略的效率取决于最终将有多少分区.

假设您有100个项目,最终将它们划分为3个列表.然后,在将其插入其中一个列表之前,必须将每个项目与最多3个其他项目进行比较.

但是,如果这100个项目最终将被划分为90个列表(即,很少有相同的项目),那么这是一个不同的故事.现在你的运行时更接近二次而不是线性.

  • 除非哈希值干净地映射到等价类(即等值哈希意味着值属于同一分区),否则哈希没有帮助. (2认同)