留言与评论(共有 0 条评论) |
发布时间:2020-04-12 09:12:40
海豚算法。按照互素性分圈移动。空间O(1), 时间O(N)。
举例: 1,2,3,4,5,6循环右移两位。
先移1->3->5->1这个圈,得到5,2,1,4,3,6。再移动 2->4->6->2这个圈,得到最终结果。分成两个圈的原因是(2, 6) =2。
说白了就是置换的分解。原题目相当于置换(345612),这个置换可以拆成(351)和(462)的乘积。
手机码字不易,代码自己写吧。
===========================
Note:
这个算法比 @bhuztez的方法运算量小,但运行起来不一定快,因为空间局部性不好(尤其是移动的位数较大时)。It is not cache friendly.
留言与评论(共有 0 条评论) |
全站搜索