约瑟夫环问题

约瑟夫环问题,网上的解答都是一堆的数学字符,看着就不舒服,演示一下直观的算法(9,5):

O                     (0+5)%2 = 0
o O (0+5)%2 = 1
O o o (1+5)%3 = 0
o O o o (0+5)%4 = 1
o O o o o (1+5)%5 = 1
O o o o o o (1+5)%6 = 0
o o o o o O o (0+5)%7 = 5
o o O o o o o o (5+5)%8 = 2
o o o o o o o O o (2+5)%9 = 7

前面的字母代表当前有多少个节点,后面的算式代表当前删除的节点在重映射后的位置。

考察约瑟夫环的变化过程,当第k个节点存在的时候,序列理应如此:1,2,3,4,5,6,7,8,9

将元素左移3次,得到3,4,5,6,7,8,9,1,2

接着删除第一个,得到4,5,6,7,8,9,1,2

继续左移3次,得到6,7,8,9,1,2,4,5

删除第一个:7,8,9,1,2,4,5

左移:9,1,2,4,5,7,8

删除:1,2,4,5,7,8

左移:4,5,7,8,1,2

删除:5,7,8,1,2

左移:8,1,2,5,7

删除:1,2,5,7

左移:5,7,1,2

删除:7,1,2

左移:2,7,1

删除:7,1

左移:7,1

删除:1

按照这个手法,不断移动并删除,元素最终会减少到1。检查某个点何时被删除的测试也可以如此进行,不断左移,排在第一个的元素就是被删除的。

因此,思考逆过程,从1个元素开始,每个元素就应该是右移k位,不断右移,最终就能找回原始的约瑟夫环的位置:

1元素:1<------------------>1,                      (1+3)%1 eq 1

2元素:1,2<---------------->7,1,                   (1+3)%2 eq 2

3元素:1,2,3<-------------->7,1,2,                (2+3)%3 eq 2

4元素:1,2,3,4<------------>1,2,5,7,             (2+3)%4 eq 1

5元素:1,2,3,4,5<---------->5,7,8,1,2,           (1+3)%5 eq 4

6元素:1,2,3,4,5,6<-------->1,2,4,5,7,8,        (4+3)%6 eq 1

7元素:1,2,3,4,5,6,7<------>7,8,9,1,2,4,5,      (1+3)%7 eq 4

8元素:1,2,3,4,5,6,7,8<---->4,5,6,7,8,9,1,2,   (4+3)%8 eq 7

9元素:1,2,3,4,5,6,7,8,9<-->1,2,3,4,5,6,7,8,9,(7+3)%9 eq 1

而做这个事情的,就是(num+k)%line_length。

转载于:https://www.cnblogs.com/huyc/archive/2011/10/21/2220754.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值