【问题标题】:Counting inversions which involves swaps between elements greater than a certain value计算涉及大于某个值的元素之间交换的反转
【发布时间】:2023-03-07 23:07:02
【问题描述】:

这是一个我花了很多时间思考的家庭作业问题。

假设我有一个未排序的整数数组和一个给定的整数 d。任务是计算涉及掉期大于 d 的反转次数。

例如,给定一个输入数组 (3, 4, 3, 1) 和 d = 2,则此类反转的数量为 1,因为仅计算 4 和 1 之间的反转。其他反演相差小于2。

当然,计算反转次数的一种简单方法是遍历列表的每个数字,并在该数字之前添加元素的数量,该数字更小,差异大于 d。但是,这是一个 n^2 算法。而是需要一个 n \log n 算法。

这里给出了另一种更有效的算法,我们对输入数组执行归并排序,然后直接从那里开始计数。 https://www.geeksforgeeks.org/counting-inversions-subarrays-given-size/

但是,我无法修改它以获得正确的答案。

我的方法是这样的:

在合并排序的“合并”步骤中,如果左子数组的第一项较小,则只需将其添加到已排序的数组中并继续。

否则,我将左子数组中的项数比右子数组的第一项大 d 来增加所需的反转次数。

不过,我仍然无法获得正确答案。

有人可以帮帮我吗?谢谢你。

【问题讨论】:

  • 你能提供你已经尝试过的代码吗?它的输出/错误是什么?我也看不到有关您正在使用的编程语言的任何信息。
  • 这看起来像一个 NUS CS3230 作业问题。如果这是针对该作业,请注意,在线询问有关作业问题的问题是违反课程政策的。如果这与该课程无关,请忽略此内容

标签: sorting


【解决方案1】:

在合并过程中,如果左子数组 A[i] 的索引 i 的元素大于右子数组 A[j] 的索引 j 的元素,就会发生 j-i 交换。

对差值大于 A[i...j-1] 的子数组中的值的最小元素进行二分搜索。那么大于该值的元素之间的交换次数将是 j 减去这个最小元素的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多