2011-10-29 21 views
0

當我從教科書中學習算法時,通常僞代碼中的算法儘可能通用。將僞代碼轉換爲儘可能相似的實現

一個例子是,爲了簡化檢查或邊界情況或何時停止循環,正在使用occusionally -/+ infinity(作爲課程的簡化)。

例如:

current-sum=enter image description here

total-sum=0 
for i=x downto low 
total-sum=total-sum+A[i] 
    if(total-sum > current-sum) //so that in first iteration we will enter the if statement 

etc

確定,負無窮大可以預計不會在我們的域值實現的編程語言算法時被替換問題。

我在想,如果在具體的編程語言(例如Java)中實現算法時,是否存在更一般的方式/技巧來表示此操作,則需要執行以下操作:

current-sum = -1;
current-sum = -10000;

其中例如這些值可以在以後居然變得域值有效。

+2

我不明白僞代碼在做什麼或爲什麼。這使翻譯很難。 –

+0

僞代碼是計算最大子陣列問題算法的一部分。在這部分中,它計算數組中的總和並使用-infinity作爲起點。如果您認爲有意義,我可以發佈更多的僞代碼 – Cratylus

回答

1
int current_sum = Integer.MIN_VALUE; 

這給出current_sum最小值int可以有, - (2^31)。

1

通常情況下,您使用的數據類型最大值代表無窮大。

例如,如果您有+ inifity,則可以使用Integer.MAX_VALUE。 與-infinity相同,您可以使用Integer.MIN_VALUE

這與其他數據類型是一樣的。

2

您可以使用Integer.MIN_VALUE這是最小的32位可表示值(-2^31)。

或者,如果這實際上可能是您問題中的有效值,那麼可以將其擴展爲64位,並使用Long.MIN_VALUE

最後,總是有boolean firstTime = true;的選項,你||第一次遇到你的if條件,並立即將其設置爲false

1

Integer.MIN_VALUEInteger.MAX_VALUE壞解決方案,因爲在某些情況下,他們可以成爲你的域值。更仔細地使用Double.NEGATIVE_INFINITY

例如Double.NEGATIVE_INFINITY + 2 = Double.NEGATIVE_INFINITY

+0

這很有趣,我從來不知道這個屬性。涼。 – Cephron

3

我在想,但如果有一個更通用的方式/技巧在一個具體的編程語言

一般執行算法時沒有表示這一點。無法將「負無窮」表示爲始終有效的整數。經常使用最小的可能整數值(在Java Integer.MIN_VALUE中)。但是您需要查看特定算法以瞭解此解決方案是否有效。

因此沒有通用/通用解決方案。可以用Integer.MIN_VALUE代替「負無窮」。但是,如果算法要求您使用Integer.MIN_VALUE作爲實際值,那麼您不能使用也可以使用作爲「無值」標記。 Integer.MIN_VALUE不能用作「負無窮」代理的另一種情況是當您使用它來進行算術運算時。 (Integer.MIN_VALUE + x == Integer.MIN_VALUE只適用於x == 0。)

+0

+1用於擴大治療一般問題 – Cephron