在很多地方,我看到[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答案,你可以在这里向我解释一下吗?
答案 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