约瑟夫环问题
约瑟夫环问题,网上的解答都是一堆的数学字符,看着就不舒服,演示一下直观的算法(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。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步