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

这与数学和计算机科学有什么关系?

数组索引倾向于使用不同的偏移量,具体取决于您所在的字段:

  • 数学倾向于以为基础。
  • 某些编程语言往往是从零开始的,例如 C、C++、Javascript、Python,而其他语言(例如 Mathematica、Fortran、Pascal)是从一开始的。

在实现数学算法(例如 for 循环)时,这些差异可能会导致细微的栅栏柱错误,也就是一个错误。

整数

如果我们有一个集合或数组,比如前几个素数[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ],数学家会将第一个元素称为1st 绝对 元素。即使用下标表示法来表示索引:

  • 一个1 = 2
  • 一个2 = 3
  • 10 = 29

相反,某些编程语言会将第一个元素称为zero'th 相对元素。

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

由于数组索引在 [0,N-1] 范围内,因此为了清楚起见,为范围 0 .. N 保持相同的数值而不是添加诸如偏差之类的文本噪声是“很好的”。-1

例如,在 C 或 JavaScript 中,要遍历一个包含 N 个元素的数组,程序员会 i = 0, i < N使用区间 [0,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 的编程语言中,您可能需要一个虚拟的第 0 个元素来使用基于 1 的数学算法。例如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 是一些机器 epsilon。这就是为什么您有时可能会const float EPSILON = 1e-#在 C 代码(例如1e-6)中看到 32 位浮点数的惯用语。这个 SO 问题EPSILON 能保证什么吗?有一些初步的细节。如需更全面的答案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 |
     +--------+-----+

有关带间隔的浮点精度和鲁棒性的更多详细信息,请参阅 Christer Ericson 的实时碰撞检测,第 11 章数值鲁棒性,第 11.3 节鲁棒浮点使用

于 2016-05-11T19:24:01.070 回答
1

它可以是区间定义中的数学约定,其中方括号表示“包含极值”,圆括号表示“极值排除”。

于 2010-12-09T08:43:06.927 回答