【问题标题】:Is This an Efficient Way to Sort Multiple Linked Lists?这是对多个链接列表进行排序的有效方法吗?
【发布时间】:2012-06-24 04:31:51
【问题描述】:

你有 n 个已排序的链表,每个链表的大小为 n。链表引用 存储在一个数组中。什么是合并n个链接的有效算法 列表到单个排序的链表?

因为它们都已排序:

  1. 加入循环
  2. 检查所有已排序链表的第一个节点,并通过相互比较对它们进行排序。
  3. 继续到下一个节点并重复直到null 被命中。

这是最有效的方法吗?

【问题讨论】:

  • 缺少假设:链表中的元素是相互连续的还是交错的? {{1,2,3,5}, {4,7,9,11}} 是否有效/无效?我是否有 3 个链表,每个链表包含 3 个元素? (澄清 n.)
  • 是的,每个链表都已经排序并且具有完全相同数量的元素..
  • 那么交错也可以吗?
  • 不,我认为它们在列表中是连续的。
  • 关键字:“N-way merge”(对链表进行调整),例如stackoverflow.com/questions/5055909/algorithm-for-n-way-merge , stackoverflow.com/questions/2705366/… 应该是 O(N*K) 时间。

标签: java list linked-list


【解决方案1】:

只需将它们全部链接在一起(或将它们转储到一个列表中)并使用一般排序。这将为您提供 nlog(n) 性能。你的方式是 n^2。

【讨论】:

  • 如果您在他的示例中将所有列表转储到一个数组中,那么它是 n^2(n 个大小为 n 的列表)
  • @DavidCheung 不,将所有元素放入列表只需要线性时间。是的,列表的大小为 n^2,但排序只需 nlogn 时间。
  • 是的,但是您将读取 n 个大小为 n (n*n) 的列表来读取所有列表并形成一个大数组,完整的算法复杂度为 n^2 + nlogn,这使得它 n ^2
  • 你可以通过将第一个的最后一个链接到第二个的第一个等来非常有效地做到这一点。
  • 这可以做得更好,因为列表已经排序。这只是一个 N 路合并。
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2015-06-30
  • 1970-01-01
  • 2017-06-18
相关资源
最近更新 更多