演示旋转算法

时间:2015-02-19 13:16:07

标签: c++ algorithm rotation

在很多地方,我看到[begin, end)范围的数组轮换,其中“中间点”m实现为:

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

其中反向函数相当于std::reverse,这样可以正常工作。标准库算法std::rotate更进一步,仅使用forward_iterators进行轮换(反向需要bidirectional_iterators)。

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

3 个答案:

答案 0 :(得分:2)

我会尝试提供视觉证明。

考虑这样的字符串:

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

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

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

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

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

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

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

因此旋转弦。

答案 1 :(得分:2)

考虑轴点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

从而将begin ... m转移到最后的位置并将m+1 ... end-1转移到第一个位置。

答案 2 :(得分:0)

我在youtube上发现了一个很好的视频。旋转比在编程元素中更好地解释,像我这样的愚蠢的家伙并没有得到它。

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