【问题标题】:Best sorting algorithm - Partially sorted linked list最佳排序算法 - 部分排序的链表
【发布时间】:2017-05-11 07:07:03
【问题描述】:

问题- 给定一个排序的双向链表和两个数字 C 和 K。您需要将包含数据 K 的节点的信息减少 C 并在其正确位置插入形成的新节点,以使列表保持不变排序。

对于这样的问题,我会考虑 插入排序,因为,任何实例的插入排序看起来都像,显示一堆卡片,

部分排序的。对于插入排序,交换次数等于反转次数。比较次数等于交换次数 + (N-1)。

因此,在给定的问题(上图)中,如果数据为 K 的节点减少了 C,则已排序的链表变为部分排序的。 插入排序是最合适的

另外一点是,在排序算法的选择中,如果应用于数据的数组表示的排序逻辑最适合,那么相同的排序逻辑应该最适合相同数据的链表表示。

对于这个问题,我的思路在选择插入排序时是否正确?

【问题讨论】:

  • 也许this 回答会有所帮助?
  • decrease(int nodeWithK, int decreaseByC) 操作是一次性操作吗?
  • @Richard 你是说,如果问题中给出的数据是数组表示,那么 插入排序 是最好的。如果此数据在链表中,那么 合并排序 最适合部分排序的数据?
  • @CahitGungor 是 decrease(int nodeWithK, int decreaseByC) 是 O(1) 操作
  • 如果这是一副纸牌(52 个物品或 54 个百搭牌)或双层(104-108),哪种算法最快是没有实际意义的。数据集大小 N 是固定的,而且相当小。

标签: algorithm sorting insertion-sort


【解决方案1】:

也许你的意思是别的,但插入排序并不是最好的算法,因为你实际上不需要对任何东西进行排序。如果只有一个元素的值为 K,那么它不会产生很大的影响,否则会产生很大的影响。

所以我建议使用以下算法 O(n),为简单起见忽略边缘情况:

  1. 在列表中前进,直到当前节点的值> K - C。
  2. 保存这个节点,所有缩减的节点都会插入到这个节点之前。
  3. 在当前节点的值为时继续前进
  4. 当当前节点的值为 K 时,删除节点,将值设置为 K - C 并将其插入到保存的节点之前。这可以进一步优化,这样您只需对值为 K 的整个节点子列表执行一次删除和插入操作。

【讨论】:

  • 所以这只是 O(L) 继续前进并在保存节点之前进行 O(1) 替换。它是否正确?假设节点之前的 L 节点具有值 K
  • 您的意思是 O(n),其中 n 是节点数,那么它是正确的。 K 是节点值,你不知道它在列表中的哪个位置,K 可能比 n 大得多。如果您想查找值并获取相应的节点,那么哈希映射可能是一个不错的选择,如果 K 的可能值非常有限,则数组可能是一个不错的选择。
  • 使用skipList 进行快速搜索怎么样?
【解决方案2】:

如果这些递减操作可以在排序列表必须可用之前进行批处理,那么您可以简单地从列表中删除所有递减节点。然后,对它们进行排序,并在列表中执行双向合并。

如果在每个节点递减后必须按顺序维护列表,则别无选择,只能删除递减的节点并按顺序重新插入。

对一副纸牌进行线性搜索可能是可以接受的,除非您正在运行一些涉及纸牌的怪物蒙特卡罗模拟,该模拟运行数小时或一天,因此优化很重要。

否则,我们处理需要维护顺序的方法将是使用有序序列数据结构:平衡二叉树(红黑,splay)或跳过列表。将节点从结构中取出,调整值,重新插入:O(log N)。

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多