📜  每个元素返回其初始位置所需的 shuffle 次数(1)

📅  最后修改于: 2023-12-03 15:26:53.315000             🧑  作者: Mango

Shuffle 次数计算

在计算机科学中,shuffle 通常指将元素随机排序的过程。在一个给定的数组中,我们希望每个元素返回其初始位置所需的 shuffle 次数。这个问题可能看起来很简单,但是对于初始位置和数组长度的组合存在很多不同的情况。

算法思路

我们可以通过追踪元素在 shuffle 中的移动次数来计算其在数组中的初始位置。从元素的当前位置开始,我们可以通过在 shuffle 中递归地移动元素直到它到达原始位置来追踪它。

def count_shuffle_moves(arr):
    n = len(arr)
    moves = [0] * n # 记录每个元素移动的次数

    # 循环检查每个元素
    for i in range(n):
        # 计算元素的目标位置
        dest = arr[i] - 1
        while dest != i:
            # 如果目标位置与当前位置不同,则继续移动元素
            arr[i], arr[dest] = arr[dest], arr[i]
            moves[i] += 1
            dest = arr[i] - 1
    return moves

这个算法首先初始化一个长度为 n 的 moves 数组,其中每个元素都设置为零。然后,它遍历原始数组中的每个元素。对于每个元素,它计算该元素在 shuffle 后的目标位置,并通过重复移动元素来将其移动到该位置。

在移动元素时,我们使用一个 while 循环来移动目标位置,直到它到达原始位置。

代码实现
def count_shuffle_moves(arr):
    n = len(arr)
    moves = [0] * n # 记录每个元素移动的次数

    # 循环检查每个元素
    for i in range(n):
        # 计算元素的目标位置
        dest = arr[i] - 1
        while dest != i:
            # 如果目标位置与当前位置不同,则继续移动元素
            arr[i], arr[dest] = arr[dest], arr[i]
            moves[i] += 1
            dest = arr[i] - 1
    return moves
示例

让我们看看一个实际的例子,假设我们有一个数组 [4, 2, 1, 3]。我们希望计算每个元素在 shuffle 后返回到其初始位置所需的次数。

我们可以使用上面的算法计算得到:

>>> arr = [4, 2, 1, 3]
>>> count_shuffle_moves(arr)
[1, 1, 2, 1]

这表示该数组的每个元素分别需要进行 1, 1, 2, 和 1 次操作才能恢复到原始位置。