一个班有n个学生,每个人都有一个不同的有趣故事。由于学生们在课堂上感到无聊,他们决定想出一个游戏来打发时间。他们想通过发送电子信息相互分享有趣的故事。假设发件人包括他或她在发送消息时知道的所有有趣故事,并且一条消息可能只有一个收件人。他们需要发送的最少消息数是多少才能保证他们每个人都能收到所有有趣的故事?
解决方案:最小消息数等于 2n – 2。有几种方法可以做到这一点。
方法 1 :学生可以指定一名学生,例如学生 1,其他所有人都向他发送带有他们知道的有趣故事的消息。收到所有这些消息后,学生 1 将所有有趣的故事与他或她的有趣故事组合在一起,并将此组合消息发送给其他 n-1 名学生中的每一个。可以通过下图来理解。将 n 个学生表示为 S1、S2、S3、…………..、Sn。学生指定 S1,其他每个学生都将他们知道的有趣故事发送给 S1。
收到所有这些消息后,学生 1 将所有有趣的故事与他或她的有趣故事组合在一起,并将此组合消息发送给其他 n-1 名学生中的每一个。因此,最小消息数等于 2n – 2。
方法二(贪心算法):将1到n的学生编号为S1、S2、S3、………………、Sn,发送前n-1条消息如下:从S1到S2,从S2到S3,然后依此类推,直到结合了学生 S1、S2、… 最初知道的有趣故事的消息。 . . , Sn – 1 被发送到人 n。然后将结合了来自学生 n 的所有 n 个有趣故事的消息发送给学生 S1,S2,…。 . . , Sn – 1。
因此,最小消息数等于 2n – 2。
注意: 2n – 2 条消息是解决难题所需的最小数字这一事实源于这样一个事实:学生人数增加 1 需要至少两条额外的消息,即,发送给和来自额外学生的消息,究竟是什么以上方法提供。
参考 : 算法谜题 – Anany Levitin, Maria Levitin
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。