【问题标题】:How to Randomly Shuffle a Linked List in C如何在 C 中随机打乱链表
【发布时间】:2012-07-03 18:48:48
【问题描述】:

我有一个链表,我想实现一个功能:

Random_Shuffle_List (struct node **Headptr) - 输出一个列表,使得每个节点都从其原始位置随机移动。

请帮助我用一种有效的算法来实现这一点。

【问题讨论】:

  • 试试programmers.stackexchange.com,除非你对你尝试过的实现有真正的疑问。
  • 我看到了几种解决问题的方法,但是我想知道是否有必要使用标准链表?您不想要的是移动数据,但只更改引用指针/索引。想到的下一个问题是:是否有必要对列表进行更改,或者当您需要访问列表时,您不能随机访问吗? (如果您想多次访问它可能不是首选选项)
  • 尝试归并排序;使用随机函数进行比较。确保所有节点都具有相同的先发蜂机会。 (或第二个,...)

标签: c algorithm list data-structures


【解决方案1】:

我会推荐幼稚的方法:

  1. 构建一个指向每个节点的指针数组。
  2. 随机排列数组。这比随机化链接结构要容易得多。
  3. 通过按数组顺序逐步遍历节点来“重新线程化”列表。

当然,这使用了相对少量的额外内存,但我认为与直接在链表上工作的方法相比,它在实现(和理解)时间以及可能还有运行时间方面更“有效”。

【讨论】:

  • +1。对于短列表,内存开销可以忽略不计。任何直接在列表上工作的尝试都将是 O(n^2),因此对于长列表(例如 >1000 个项目)来说,它会非常慢。
【解决方案2】:

只需反转链表并交换中间节点和结束节点。我认为这会起作用。复杂度将是 O(n)。

【讨论】:

  • 我不确定这个答案。如果你觉得它错了请告诉我
【解决方案3】:
  1. 计算链表中的节点数,比如n
  2. 0n之间生成两个随机整数(ab
  3. 交换两个节点ab
  4. 重复上述几次m 次。

这不是一个好方法,但不像@unwind 的建议那样需要额外的内存。

@unwind 的解决方案可以做的一件事是使用窗口。

  1. 修复窗口长度为w
  2. 在链表中随机选择两个节点,这样就可以形成两个不重叠的子表,长度为3.长度w(窗口)
  3. 构建两个数组,每个数组对应一个指向列表中每个音符的窗口
  4. 随机播放每个窗口
  5. 在两个窗口之间随机播放指针
  6. 重新链接节点
  7. 执行上述窗口选择、洗牌和重新链接m 次。

【讨论】:

  • a) 上面的那些方法不会生成 random_shuffle ,其中每个排列都有相等的概率。 b)第一种方法非常慢(每次选择两个节点时都必须遍历列表)。
【解决方案4】:

这样做的一种方法是初始化一个额外的字段,该字段将包含由随机函数生成的随机数。

typedef struct node
{
int data;
int random;
struct node *next;
} card;

for eg, we can give
newnode->random = rand() % (100)  
,which will give random numbers up to 100 to the field.Now Ordering the 
 linked list to ascending or descending according to the random number ,will 
help us to shuffle the nodes .

for (tempnode = start; tempnode->next != NULL; tempnode = tempnode->next)
    for (nextnode = tempnode->next; nextnode->next != NULL; nextnode = 
    nextnode->next)
    {
        if (tempnode->random > nextnode->random)
        {
            swap(tempnode, nextnode);
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2018-11-19
    相关资源
    最近更新 更多