旋转算法演示
Demonstration for rotation algorithms
在许多地方,我看到 [begin, end)
范围内的数组旋转 "middle point" m
实现为:
void rotate(begin, m, end)
reverse(begin, end);
reverse(begin, m);
reverse(m, end)
其中反向函数等同于 std::reverse
,这很好用。标准库算法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
因此将 begin
...m
旋转到最后几位,并将 m+1
...end-1
旋转到第一位。
我在 youtube 上找到了一个很好的视频。轮换的解释比在编程基础中更好,像我这样的笨蛋就是不明白。
https://www.youtube.com/watch?v=7v3WRYLXjfI&index=11&list=PLHxtyCq_WDLW0NqZCcrrQUa24H_af6Mrn
在许多地方,我看到 [begin, end)
范围内的数组旋转 "middle point" m
实现为:
void rotate(begin, m, end)
reverse(begin, end);
reverse(begin, m);
reverse(m, end)
其中反向函数等同于 std::reverse
,这很好用。标准库算法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
因此将 begin
...m
旋转到最后几位,并将 m+1
...end-1
旋转到第一位。
我在 youtube 上找到了一个很好的视频。轮换的解释比在编程基础中更好,像我这样的笨蛋就是不明白。
https://www.youtube.com/watch?v=7v3WRYLXjfI&index=11&list=PLHxtyCq_WDLW0NqZCcrrQUa24H_af6Mrn