web-dev-qa-db-ja.com

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

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

このような表記法の意味を知りたいです。

104
Nav

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

それは 半開間隔 です。

  • 閉じた間隔[a,b]には、エンドポイントが含まれます
  • オープン間隔(a,b)excludes.

あなたの場合、間隔の開始点の終点は含まれますが、終点は除外されます。つまり、間隔「first1 <= x <last1」を意味します。

半開区間は、ループの一般的なイディオムに対応するため、プログラミングで役立ちます。

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

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

32
Mark Byers

interval notationの概念は、bothMathematics and Computer Scienceに登場します。数学表記[]()は、domain(またはを示します間隔の範囲)。

  • 括弧[および]は次を意味します。

    1. 番号はincluded
    2. 間隔のこちら側はclosed
  • 括弧(および)は次を意味します。

    1. 番号はexcluded
    2. 間隔のこちら側はopenです。

混合状態の間隔は "half-open"と呼ばれます。

たとえば、1から10までの連続した整数の範囲(両端を含む)は、notatedのようになります。

  • [1,10]

Word 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

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

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

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

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

整数

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

  • a1 = 2
  • a2 = 3
  • a10 = 29

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

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

配列インデックスは[0、N-1]の範囲にあるため、わかりやすくするために、テキストのnoiseを追加する代わりに、範囲0 .. Nに同じ数値を保持するのが「いい」だろう-1バイアスなど。

たとえば、CまたはJavaScriptでは、N個の要素の配列を反復処理するために、プログラマは、少し冗長な[0、N-1]ではなく、間隔[0、N)でi = 0, i < 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の数値です。

エンドポイントがclusiveまたはexclusiveである場合、Edgeのケースを知ることが重要です:

  • (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ビット浮動小数点数のCコードでconst float EPSILON = 1e-#イディオム(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 11Numerical Robustness、Section 11.3堅牢な浮動小数点の使用法

13
Michaelangel007

これは、角括弧が「極度の包括的」を意味し、丸括弧が「極度の排他的」を意味する、間隔の定義における数学的慣習とすることができます。

1
Eddy