【发布时间】:2015-11-02 10:42:20
【问题描述】:
我有一个Vec,它是一个循环缓冲区的分配。假设缓冲区已满,因此分配中没有元素不在循环缓冲区中。我现在想将该循环缓冲区转换为Vec,其中循环缓冲区的第一个元素也是Vec 的第一个元素。作为一个例子,我有这个(分配)功能:
fn normalize(tail: usize, buf: Vec<usize>) -> Vec<usize> {
let n = buf.len();
buf[tail..n]
.iter()
.chain(buf[0..tail].iter())
.cloned()
.collect()
}
显然,这也可以在不分配任何内容的情况下完成,因为我们已经有一个足够大的分配,并且我们有一个 swap 操作来交换分配的任意元素。
fn normalize(tail: usize, mut buf: Vec<usize>) -> Vec<usize> {
for _ in 0..tail {
for i in 0..(buf.len() - 1) {
buf.swap(i, i + 1);
}
}
buf
}
遗憾的是,这需要buf.len() * tail 交换操作。我相当肯定它可以在buf.len() + tail 交换操作中完成。对于tail 和buf.len() 的具体值,我已经能够找出解决方案,但我不确定在一般情况下如何去做。
我的递归部分解决方案can be seen in action。
【问题讨论】:
-
这通常被称为“旋转”向量,例如azillionmonkeys.com/qed/case8.html
-
啊太棒了。我的 google-fu 让我失望了。我在寻找错误的条款。
-
如果你想用一些代码添加答案,我将它移植到 Rust here。
标签: algorithm rust circular-buffer