【问题标题】:2D Array to 1D array algorithm with zig zag order具有 zig zag 顺序的 2D 阵列到 1D 阵列算法
【发布时间】:2011-08-15 11:53:07
【问题描述】:

我有一个 8x8 数组,想将它转换成一个有 64 个字段的一维数组。 但是在这个特殊的曲折顺序中:

我想要聪明的方法,但我不知道。我有两种可能的理论,但它们并不聪明。有什么想法吗?

【问题讨论】:

  • 也许这会有所帮助..对于每条对角线,索引的总和将是恒定的..并且方向翻转..应该能够为此设计一个通用循环。跨度>
  • 不要以封面来判断一本书。无论如何,如果您不想贡献一些富有成效的想法,那么请避免使用此类 cmets。
  • “我有两种可能的理论,但它们并不聪明。”告诉我们他们!否则,有人可能会建议您已经拥有的相同解决方案。

标签: arrays algorithm multidimensional-array


【解决方案1】:

有一个包含 64 个条目的数组,按 zig-zag 模式访问它们的顺序保存索引。您可能会将它们用作某些缓冲区的偏移量。这是 JPEG 的东西吧?

int[] zigzag = {0, 1, 8, 16, 9, 2, ... etc};

【讨论】:

  • 这是我的想法之一,但我认为有更聪明的方法。是的,它是 jpeg 编码。
  • 很公平,但你应该小心。您可能正在涉足专利世界。我见过的任何参考代码都使用这种方法,在现实世界中这通常都是由硬件完成的。
  • 编辑后评论:这比我的两个想法要好得多。我在想另一种方式。非常感谢你。 @James:这只是一个微不足道的 PoC,不会被使用或发布给公众。
【解决方案2】:

你可以试试这个:当你开始时,你向右走 1 步,然后沿着唯一允许对角线的方向(起初是西南方向)进行对角线移动,然后一直循环直到列[0]。您向下移动 1 步(使用标志检查您之前是否向右移动了 1 步,并且只有在此标志之前为 true 时才能向下移动;您可以将此标志更改为 false 并将向下标志更改为 true)再次在唯一允许的方向(东北)上做对角线,直到你打到第 [0] 行。这在 AC[70] 之前会很好,因为没有向下移动。此时,将 right 和 down 两个标志都重置为 false 并重新启动该过程。

【讨论】:

  • 这正是我的第二个想法,但我认为另一个更好,因为它在 5 分钟内完成,您可以通过 google 找到索引数组 =) 谢谢
  • true,但另一个不能概括所有数组。如果您想对尺寸不是 8 X 8 的数组执行此操作,您会发现上述方法更好。如果您关心的是速度,那么无论如何...
  • @troll,这就是为什么你应该解释你已经抛出的两种方法。您似乎浪费了其他人的时间,因为他们发布了您拒绝的想法。
【解决方案3】:

为了帮助任何谷歌搜索但找不到答案的人,这是我想出的一个简单的 perl 算法来解决这个问题。

sub getPos{
    my ($x,$y,$size)=@_;
    my $d = $x+$y;
    my $m = $d-$size;
    my $p = (($d%2)?$x:$y);
    my $dist = ($d*($d+1))/2;
    my $index = $dist + $p;
    if($d >= $size){
        $index -= ($m+1)**2;
    }
    return $index;
}

你可以这样使用它:

for(my $x = 0; $x < $size; $x++){
    for(my $y = 0; $y < $size; $y++){
        $OneArray[getPos($x, $y, $size)] = $TwoArray[$x][$y];
    }
}

其中$OneArray 是您将$TwoArray 转换为的一维数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2012-11-23
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多