2013-02-03 137 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不抄襲某人的代碼。 –

相關問題