将c ++中行和/或列的所有值设置为1或0

时间:2013-02-03 11:06:20

标签: c++ algorithm memset

我遇到一个问题,需要将列中的所有值重置为0或1.我使用的代码是通过每次迭代设置值的正常天真方法。有没有更快的实施。

//Size of board n*n
i=0;
cin>>x>>y;x--;
if(query=="SetRow")
{
  while(i!=N){ board[i][x]=y;i++;}
}
else
{
  while(i!=N){ board[i][x]=y;i++;}
}

y可以是0或1

2 个答案:

答案 0 :(得分:2)

那么,除了迭代列之外,您可能想要进行的优化很少:

  1. 由于cache性能,迭代列的效率低于行(约* 4慢)。在列迭代中,每个元素都有一个缓存未命中 - 在行迭代中,您有4个元素中的1个缓存未命中(通常,它取决于数据的体系结构和大小,但通常缓存行适合4个整数)。
    因此 - 如果你经常迭代列然后行重新设计,以便更频繁地迭代行。 This thread讨论了类似的问题。
    另外,在你这样做之后 - 你可以使用memset(),我认为这是为这项任务更好地优化的。
    (注意:编译器可能会在某些情况下自动为您执行此操作)

  2. 你可以使用延迟初始化,实际上有O(1)算法初始化一个具有常量值的数组,这里有更详细的描述:initalize an array in constant time。这需要花费大约三倍的空间,以及后来更广泛的追求。

  3. 它背后的想法(2)是维护额外的堆栈(逻辑上,实现为数组+指向顶部的指针)和数组,附加数组将指示它何时首次初始化(从0到n的数字)并且堆栈将指出哪些元素已被修改。

    当您访问array[i]时,如果stack[additionalArray[i]] == i && additionalArray[i] < top数组的值为array[i]。否则 - 它是“初始化”值。

    执行array[i] = x时,如果尚未初始化(如前所述),则应设置additionalArray[i] = stack[top]并增加top

    这会导致O(1)初始化,但正如所说它需要额外的内存,每次访问都更加广泛。

    关于在O(1)中初始化数组的文章所描述的相同原则也可以在这里应用。

答案 1 :(得分:0)

问题来自于运行codechef长期竞赛....冰雹骗子..关闭此帖子