2010-12-09 327 views
75

我已經看到數字範圍表示爲[first1,last1)[first2,last2)這個方括號和括號括號是什麼意思[first1,last1]?

我想知道這樣的符號是什麼意思。

+3

`[first,last]`是其他人已經注意到的半開區間。在一些教科書中,這也被寫爲`[first,last>`並且具有完全相同的含義,只有語法不同。 – darioo 2010-12-09 08:49:39

+7

這個問題的更好的地方是http://math.stackexchange.com/(恕我直言)。但是不要緊! :) – xk0der 2010-12-09 09:28:31

回答

129

括號表示範圍的末尾是包括 - 它包括列出的元素。圓括號表示末尾是獨佔並且不包含列出的元素。因此,對於[first1, last1),範圍從first1開始(包括它),但在last1之前結束。

假設整數:

  • (0,5)= 1,2,3,4
  • (0,5] = 1,2,3,4,5
  • [0, 5)= 0,1,2,3,4
  • [0,5] = 0,1,2,3,4,5
26

這是一個half-open interval

  • 閉區間[a,b]包括端點。
  • 開放間隔(a,b)不包括他們。

在你的情況下,包括間隔開始的結束點,但結束被排除。所以它意味着間隔「first1 < = x < last1」。

for (int i = 0; i < n; ++i) { ... } 

這裏i是在範圍[0,N):因爲它們對應於共同成語用於循環

半開間隔在編程有用。

1

它可以是在一個區間的定義的數學慣例方括號表示「極端包括」和圓括號「極端排他」。

11

概念間隔符號出現在數學和計算機科學。數學符號[],(,)表示區間的(或範圍)。

  • 托架[]手段:

    1. 包括
    2. 的間隔是關閉的這側上,
  • 的括號()種手段:

    1. 數爲排除
    2. 的間隔的此方開放

的間隔與混合態被稱爲「半開」

例如,連續整數的範圍1 .. 10(含)。將譜寫這樣:

  • [1,10]

通知如何字inclusive被使用。如果我們想排除末點,但「捂」相同的範圍內,我們需要移動的終點:

  • [1,11)

對於左,右邊緣間隔實際上有4個排列組合:

(1,10) = 2,3,4,5,6,7,8,9  Set has 8 elements 
(1,10] = 2,3,4,5,6,7,8,9,10 Set has 9 elements 
[1,10) = 1,2,3,4,5,6,7,8,9  Set has 9 elements 
[1,10] = 1,2,3,4,5,6,7,8,9,10 Set has 10 elements 

這與數學和計算機科學有什麼關係?

數組索引傾向於使用不同取決於哪場抵消你在:

  • 數學往往是一個爲基礎的。
  • 某些編程語言往往是-based,如C,C++,Javascript,Python,而其他語言如Mathematica,Fortran,Pascal是基於一個的。

這些差異可能導致一些圍欄柱子錯誤,又名,實現數學算法,如for循環時off-by-one錯誤。

整數

如果我們有一組或數組,說的第幾個質數[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]的,數學家將參照第一元素作爲1st絕對元素。即,使用下標符號來表示指數:

  • 一個 = 2
  • 一個 = 3
  • 一個 = 29

一些編程語言相反,將第一個元素稱爲zero'th相對元素。

  • 一個[0] = 2
  • 一個[1] = 3
  • 一個[9] = 29

由於陣列索引是在範圍[0 ,N-1],那麼爲了清楚的目的,對於範圍0 ... N保持相同的數值將是「很好的」,而不是增加文本噪音,例如-1偏差。例如,在C或JavaScript中,爲了遍歷N個元素的數組,程序員將使用區間[0,N)編寫i = 0, i < N的常見慣用法,而不是略微更詳細的[0,N-1] :

function main() { 
 
    var output = ""; 
 
    var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]; 
 
    for(var i = 0; i < 10; i++) // [0,10) 
 
     output += "[" + i + "]: " + a[i] + "\n"; 
 

 
    if (typeof window === 'undefined') // Node command line 
 
     console.log(output) 
 
    else 
 
     document.getElementById('output1').innerHTML = output; 
 
}
<html> 
 
    <body onload="main();"> 
 
     <pre id="output1"></pre> 
 
    </body> 
 
</html>

數學家,因爲他們從1開始計數,將改用i = 1, i <= N命名,但現在我們需要糾正數組中從零開始的語言抵消。

例如

function main() { 
 
    var output = ""; 
 
    var a = [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]; 
 
    for(var i = 1; i <= 10; i++) // [1,10] 
 
     output += "[" + i + "]: " + a[i-1] + "\n"; 
 

 
    if (typeof window === 'undefined') // Node command line 
 
     console.log(output) 
 
    else 
 
     document.getElementById("output2").innerHTML = output; 
 
}
<html> 
 
    <body onload="main()";> 
 
     <pre id="output2"></pre> 
 
    </body> 
 
</html>

除了

在是基於0的,你可能需要一個虛擬的第零元素的雜牌使用基於1數學編程語言算法。例如Python Index Start

浮點

間隔符號也是浮點數重要的是避免微妙的錯誤。

特別是在計算機圖形學(顏色轉換,計算幾何,動畫緩和/混合等等)中處理浮點數時。)通常使用標準化數字。也就是說,數字在0.0到1.0之間。

  • (0,1)= 1E-M .. ... 0.999
  • (0:

    知道邊緣情況下,如果端點包括獨家是非常重要的,1] = 1E-M .. 1.0

  • [0,1)= 0.0 .. 0.999 ...
  • [0,1] = 0.0 .. 1.0

其中M是一些machine epsilon。這就是爲什麼您有時可能會在C代碼(例如1e-6)中看到const float EPSILON = 1e-#成語的32位浮點數。這個SO問題Does EPSILON guarantee anything?有一些初步的細節。爲了更全面的答案見FLT_EPSILON和David Goldberg的What Every Computer Scientist Should Know About Floating-Point Arithmetic

一個隨機數生成器的某些實現,random()可能產生介於0.0 .. 0.999值...而不是更方便的0.0 ... 1.0。代碼中的適當註釋將記錄爲[0.0,1.0)或[0.0,1.0],因此用法沒有歧義。

例子:

  • 要生成random()顏色。將三個浮點值轉換爲無符號的8位值,分別生成帶有紅色,綠色和藍色通道的24位像素。根據random()輸出的時間間隔,您可能會以near-white(254,254,254)或white(255,255,255)結束。

+--------+-----+ |random()|Byte | |--------|-----| |0.999...| 254 | <-- error introduced |1.0 | 255 | +--------+-----+

有關浮點精度和穩定性與時間間隔的詳細信息請參見克里斯特埃裏克森的Real-Time Collision Detection,第11章數值魯棒性 11.3節強大的浮點用法

相關問題