旋转算法演示

Demonstration for rotation algorithms

本文关键字:算法 旋转      更新时间:2023-10-16

在许多地方,我看到范围[begin, end)的阵列旋转,"中点"m实现为:

void rotate(begin, m, end)
    reverse(begin, end);
    reverse(begin, m);
    reverse(m, end)

其中逆函数是CCD_ 3的等价函数,并且这可以很好地工作。标准库算法std::rotate更进一步,只使用forward_iterators进行旋转(反向需要bidirectional_iterators)。

你知道我在哪里可以找到旋转算法的正式演示吗?或者如果有一个简单的演示可以适合SO答案,你能在这里向我解释一下吗

我将尝试提供一个视觉证明。

考虑这样一个字符串:

begin----->m--->end

应用reverse(begin, end)将导致:

begin<---m<-----end

应用reverse(begin, m)将导致:

begin--->m<-----end

最后reverse(m, end)将导致:

begin--->m----->end

从而旋转琴弦。

考虑轴点m:

begin----->m-1,m,m+1----->end-1

reverse(begin, end):之后

end-1----->m+1,m,m-1----->begin

reverse(begin, m):之后

m+1----->end-1,m,m-1----->begin

reverse(m, end):之后

m+1----->end-1,begin----->m-1,m

从而旋转CCD_ 14。。。m到最后一位并旋转m+1。。。CCD_ 17排名第一。

我在youtube上找到了一个很好的视频。这种旋转比在《编程元素》中更好地解释了,在那里,像我这样的傻瓜根本没有得到它

https://www.youtube.com/watch?v=7v3WRYLXjfI&index=11&list=PLHxtyCq_WDLW0NqZCcrrQUa24H_af6Mrn