2013-02-03 95 views
-1

我有一个问题,需要将列中的所有值重置为0或1.我使用的代码是通过简单的朴素方法来设置值每次迭代。有没有更快的实施。将C++中的行和/或列的所有值设置为1或0

//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

+3

显示一些代码? – billz

+3

什么构成“专栏”? –

+2

这是哪一个? 0还是1?你如何决定做什么? (0或1?) – amit

回答

2

好,其他则迭代列有你可能要做出一些优化:

  1. 迭代列会降低效率,然后遍历行(约* 4较慢)由于cache表现。在列迭代中,每个元素都有一个缓存未命中 - 而在行迭代中,4个元素中的一个(通常取决于数据的体系结构和大小,但通常缓存行适合4个整数)会导致缓存未命中。
    因此 - 如果您更频繁地迭代列,那么行重新设计它,以便更频繁地迭代行。 This thread讨论了类似的问题。
    另外,在你做完之后 - 你可以使用memset(),我相信这个任务更适合这个任务。
    (注:编译器会自动为你在某些情况下)

  2. 您可以使用延迟初始化,实际上是O(1)算法初始化恒定值的阵列,它与这里更详细地描述: initalize an array in constant time。这是以大约三倍的空间为代价的,并且会在以后寻求更广阔的空间。

它背后的想法(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)中的数组的相同原理。

0

问题出自运行codechef长期竞赛....冰雹作弊..关闭该主题

+0

解决问题的人也从某处读了一些书,一些教程.. OP不抄袭某人的代码。 –

相关问题