173

[first1,last1)とで表される数値範囲を見てき[first2,last2)ました。

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

4

4 に答える 4

284

角かっこ([または])は、範囲の終わりが含まれることを意味します。これには、リストされている要素が含まれます。括弧-(または)-は、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
于 2010-12-09T08:41:45.587 に答える
40

これは、ハーフオープン間隔です。

  • 閉区間には終点[a,b] が含まれます。
  • オープンインターバルはそれら(a,b) を除外します。

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

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

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

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

于 2010-12-09T08:41:12.167 に答える
20

区間表記の概念は、数学とコンピュータサイエンスの両方で登場します。数学表記[、、、は]、区間の定義域(または 範囲()を示します。)

  • 角かっこ[]意味:

    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ループなどの数学的アルゴリズムを実装するときに、微妙なフェンスポストエラー(別名、オフバイワンバグ)につながる可能性があります。

整数

集合または配列がある場合、たとえば最初のいくつかの素数の[ 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番目の要素のクラッジが必要になる場合があります。例: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は計算機イプシロンです。これが、32ビット浮動小数点数のconst float EPSILON = 1e-#Cコード(など)にイディオムが表示される場合がある理由です。1e-6このSOの質問EPSILONは何かを保証しますか?いくつかの予備的な詳細があります。より包括的な答えについてはFLT_EPSILON、DavidGoldbergのすべてのコンピューター科学者が浮動小数点演算について知っておくべきことを参照してください。

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

例:

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

浮動小数点の精度と間隔を使用したロバスト性の詳細については、Christer Ericsonのリアルタイム衝突検出、第11章数値ロバストネス、セクション11.3ロバスト浮動小数点の使用法を参照してください。

于 2016-05-11T19:24:01.070 に答える
1

これは、角括弧が「極値を含む」を意味し、丸括弧が「極値を除く」を意味する間隔の定義における数学的慣習である可能性があります。

于 2010-12-09T08:43:06.927 に答える