gpt4 book ai didi

arrays - 一维 “Square”数组中的旋转对称索引

转载 作者:行者123 更新时间:2023-12-03 11:39:54 25 4
gpt4 key购买 nike

我有一个长度为size * size的一维数组,表示值的平方字段。
我的目标是将数组旋转到位(previous question)。我目前在获取正确的内圈索引方面遇到问题。我的算法有什么错误?

这是我的代码,请跳过下面的说明和示例。

代码(Rust 1.41.0)

fn rotate_square_slice<T>(slice: &mut [T], size: usize) {
for r in 0..(size + 1) / 2 {
// current ring side length
let l = size - 1 - r;
for i in r..l {
let a = size * r + r+i ;
let b = size * (r+i) + l-r ;
let c = size * (l-r) + l-r-i;
let d = size * (l-r-i) + r ;

slice.swap(a, b);
slice.swap(a, c);
slice.swap(a, d);
}
}
}

解释
array = [A, B, C, D, E,
A, B, C, D, E,
A, B, C, D, E,
A, B, C, D, E,
A, B, C, D, E]

ring 0: | symmetries:
|
A B C D E | A . . . E . B . . . . . C . .
A . . . E | . . . . . . . . . E . . . . .
A . . . E | . . . . . + . . . . . + A . . . E + etc...
A . . . E | . . . . . A . . . . . . . . .
A B C D E | A . . . E . . . D . . . C . .

ring 1: | symmetries:
|
. . . . . | . . . . . . . . . .
. B C D . | . B . D . . . C . .
. B . D . | . . . . . . B . D .
. B C D . | . B . D . . . C . .
. . . . . | . . . . . . . . . .

示例迭代步骤
   0 1 2 3 4

0 . a . . .
1 . . . . b
2 . . . . .
3 d . . . .
4 . . . c .

size = 5 | position(a) = ( r , r+i ) = (0, 1)
r = 0 | position(b) = ( r+i , l-r ) = (1, 4)
l = 4 | position(c) = ( l-r , l-r-i) = (4, 3)
i = 1 | position(d) = (l-r-i, r ) = (3, 0)

示例输出

在5 * 5“正方形”数组上使用一维索引,这是所有索引元组(a,b,c,d)的期望输出和当前输出:
desired output   | current output   | parameters
| | r l i
( 0, 4, 24, 20) | ( 0, 4, 24, 20) | 0 4 0
( 1, 9, 23, 15) | ( 1, 9, 23, 15) | 0 4 1
( 2, 14, 22, 10) | ( 2, 14, 22, 10) | 0 4 2
( 3, 19, 21, 5) | ( 2, 14, 22, 10) | 0 4 3
| |
( 6, 8, 18, 16) | ( 7, 12, 11, 6) | 1 3 1 <- mistake
( 7, 13, 17, 11) | ( 8, 17, 10, 1) | 1 3 2 <- mistake
| |

我希望ASCII插图有助于演示我想要的内容。如果需要澄清,请告诉我。

最佳答案

该问题是由于完全在计算中使用l引起的。
元素的位置与环,大小和索引直接相关,但与当前环(l)上有多少个唯一索引无关。这是我在原始代码中的错误。
正如@Gene在评论中提到的那样,将i步骤左侧的i'ths行和j步骤向下旋转的j'ths列,可以实现类似的结果。我仍然相信,我在下面介绍的方法有其优点,因为可以轻松扩展它,以允许对要旋转的元素元组进行任意条件检查。

enum Rotation {
Clockwise,
Counterclockwise,
}

fn rotate_square_slice<T>(slice: &mut [T], s: usize, rotation: Rotation) {
// iterate ringwise, from outer to inner
// skip center when size % 2 == 1
for r in 0..s / 2 {
// for all unique indices under rotational symmetry ...
for i in 0..s - (2 * r) - 1{
// ... get their 4 corresponding positions ...
let a = s * ( r ) + r+i ;
let b = s * ( r+i ) + s-r-1 ;
let c = s * ( s-r-1 ) + s-r-i-1 ;
let d = s * (s-r-i-1) + r ;

//... and swap them in the correct direction.
match rotation {
Rotation::Clockwise => {
slice.swap(a, b);
slice.swap(a, c);
slice.swap(a, d);
},
Rotation::Counterclockwise => {
slice.swap(a, b);
slice.swap(c, d);
slice.swap(b, d);
}
}
}
}
}
非常感谢@Jmb!没有看到树木的树木。
由于切片的线性布局,使用 chunks() 旋转一些Vec的子切片很容易。整洁的!

关于arrays - 一维 “Square”数组中的旋转对称索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60443977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com