2012-08-31 47 views
0

我不確定這是數學(代數)問題還是編程問題。在不使用額外內存的情況下顛倒嵌套循環的順序

我有做這樣的事情(L和B只讀)嵌套循環(在着色器程序):

for each L in (L1, L2) 
    Q=L 
    for each B in (B1, B2, B3) 
    Q *= B 
    result += Q 

所以這個循環的結果將是:

result += L1*B1*B2*B3 + L2*B1*B2*B3 

這是正確的結果,但B的訪問速度慢,L的訪問速度很快。因此,迭代內循環中的B將比在內循環中迭代L慢得多(我在上面讀取了每個B 兩次,並且每次L讀一次)。

如果我們天真地逆轉內/外循環,

for each B in (B1, B2, B3) 
    Q=B 
    for each L in (L1, L2) 
    Q *= L 
    result += Q 

當然這個結果變得

result += B1*L1*L2 + B2*L1*L2 + B3*L1*L2 

我讀每個B曾經在這裏,但這個結果是錯誤的。我需要L1*B1*B2*B3的產品。我知道我可以創建一個數組Q[2],只是做:

 
for each L 
    Q[i] = Li // save in array 

然後在B個迭代:

for each B in (B1, B2, B3) 
    for i = 1..2 
    Q[i] *= B 

result += Q[i] 

其中給出

result += Q[1]*B1*B2*B3 + Q[2]*B1*B2*B3 

這是正確的,但它是一個「位*「如果L很大(是),則浪費內存。我想知道如果沒有中間L[]數組,我可以用代數的方式做到這一點。

*雙關語意

回答

2

一個沒有嵌套循環的一種方式:

result = 0 
for each L in (L1, L2) 
    result += L 
for each B in (B1, B2, B3) 
    result *= B 

因爲

L1*B1*B2*B3 + L2*B1*B2*B3

降低到

B1*B2*B3*(L1+L2)

+0

這將是非常好的,只有我忽略提到B與每個L的關係必須首先被發現。讓我分析一下。 – bobobobo

0

我可能會得到錯誤的錯誤,但不是L1*B1*B2*B3 + L2*B1*B2*B3等於(L1+L2)*B1*B2*B3