この角括弧と括弧括弧の表記は、[first1、last1)とはどういう意味ですか?


136

[first1,last1)およびとして表される番号範囲を見てきました[first2,last2)

そのような表記が何を意味するのか知りたいのですが。


3
[first, last)他の人が指摘したように、半開間隔です。一部の教科書では、これもと書かれ[first, last>ており、まったく同じ意味がありますが、構文のみが異なります。
darioo

8
この質問には、math.stackexchange.comIMHO)が適しています。でも気にしないで!:)
xk0der

8
ニーモニックとして、角かっこがその値をつかむと考えてください。そして、丸括弧はより柔らかく制限が少ない意味です:「含むが含まない」。
Eric Leschinski、2016

プログラマーとして角かっこを見ると、Extended Backus-Naurフォームを思い出します-en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form
RBT

2
これをmath.SEに移行することをお勧めします
Ben Leggiero

回答:


226

ブラケットは、範囲の終わりが包括的であることを意味します-リストされた要素が含まれます。括弧は、endが排他的で、リストされた要素を含まないことを意味します。したがって、の[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

3
これは、関数f(x)および関数のドメインと範囲について学習する小学校の代数から発展します。f(x)= x ^ 2のような関数は0から正の無限大の範囲を持ち、 [0、∞)。
JohnMerlino 14年

1
@Timbo∞は数値ではありません。
JakeD 2017年

2
@pycoderあなたの数の定義は不必要に制限しているようです。 en.wikipedia.org/wiki/Surreal_number
Timbo

2
@JakeDあなたの最初のコメントに関して、あなたは無限大が数ではないという点で正しいので、なぜセット[0、∞)はそれを含まないのですか。
wjandrea 2017

1
∞は数ではなく、算術演算を行うことができます。しかし、「整数はいくつありますか?」のような質問に答えるときに有効な基数です。また、この場合のように、制限
Kevin Wright

37

それは半分開いた間隔です。

  • 閉じた間隔[a,b] は終点が含まれます。
  • 開いた間隔(a,b) それらを除外します。

あなたの場合、インターバルの開始時のエンドポイントは含まれますが、終了は除外されます。つまり、「first1 <= x <last1」という間隔を意味します。

ハーフオープン間隔はループの一般的なイディオムに対応しているため、プログラミングに役立ちます。

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

ここで、iは[0、n)の範囲にあります。


15

概念間隔表記はで起動し、両方の数学とコンピュータサイエンス。数学的表記は[]()意味ドメイン(または 範囲の間隔のを)。

  • 括弧[]意味:

    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

これは数学とコンピュータサイエンスにどのように関係しますか?

配列インデックスは、使用しているフィールドに応じて異なるオフセットを使用する傾向があります。

  • 数学は1に基づいている傾向があります。
  • C、C ++、Javascript、Pythonなどの特定のプログラミング言語はゼロベースである傾向がありますが、Mathematica、Fortran、Pascalなどの他の言語は1ベースです。

これらの違いは、forループなどの数学的アルゴリズムを実装するときに、微妙なフェンスポストエラー、別名、1つずれたバグにつながる可能性があります。

整数

最初のいくつかの素数[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]などのセットまたは配列がある場合、数学者は最初の要素を1st 絶対 要素と呼びます。つまり、添字表記を使用してインデックスを示します。

  • a 1 = 2
  • a 2 = 3
  • a 10 = 29

対照的に、一部のプログラミング言語では、最初の要素をzero'th 相対要素と呼びます。

  • a [0] = 2
  • a [1] = 3
  • a [9] = 29

配列のインデックスは[0、N-1]の範囲にあるため、わかりやすくするために、バイアスなどのテキストノイズを追加する代わりに、範囲0 .. Nに同じ数値を維持することは「良い」でしょう-1

たとえば、CまたはJavaScriptでは、N個の要素の配列を反復処理するために、プログラマーはi = 0, i < N[0、N-1]のように少し冗長ではなく、[0、N)の間隔で共通のイディオムを記述し ます。

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ベースのアルゴリズムを使用するために、ダミーの0番目の要素のkludgeが必要になる場合があります。例:Pythonインデックスの開始

浮動小数点

微妙なバグを回避するために、間隔表記は浮動小数点数にとっても重要です。

特にコンピュータグラフィックス(色変換、計算ジオメトリ、アニメーションのイージング/ブレンドなど)で浮動小数点数を扱う場合、正規化された数値がよく使用されます。つまり、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は機械のイプシロンです。これが、32ビット浮動小数点数のconst float EPSILON = 1e-#Cコード(など1e-6)でイディオムをときどき見る可能性がある理由です。このSOの質問EPSILONは何かを保証しますか?いくつかの予備的な詳細があります。より包括的な答えについてはFLT_EPSILON、David Goldbergの「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」を参照してください。

乱数ジェネレータの一部の実装でrandom()は、より便利な0.0 .. 1.0ではなく、0.0 .. 0.999 ...の範囲の値が生成される場合があります。コード内の適切なコメントは、これを[0.0,1.0)または[0.0,1.0]として文書化するため、使用方法にあいまいさはありません。

例:

  • random()色を生成したい。3つの浮動小数点値を符号なし8ビット値に変換して、それぞれ赤、緑、青のチャネルを持つ24ビットピクセルを生成します。出力される間隔によっては、random()最終的にnear-white(254,254,254)またはwhite(255,255,255)になる場合があります。
     +--------+-----+
     |random()|Byte |
     |--------|-----|
     |0.999...| 254 | <-- error introduced
     |1.0     | 255 |
     +--------+-----+

浮動小数点の精度と間隔によるロバスト性の詳細については、Christer EricsonのReal-Time Collision Detection、Chapter 11 Numerical Robustness、Section 11.3 Robust Floating-Point Usageを参照してください


1

それは、角括弧が「極値を含む」を意味し、丸括弧が「極値を含まない」を意味する間隔の定義における数学的規則である可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.