2010-12-09 400 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节强大的浮点用法

相关问题