【问题标题】:What does this square bracket and parenthesis bracket notation mean [first1,last1)?这个方括号和圆括号表示法是什么意思 [first1,last1)?
【发布时间】:2011-05-22 17:31:27
【问题描述】:

我见过以[first1,last1)[first2,last2) 表示的数字范围。

我想知道这样的符号是什么意思。

【问题讨论】:

  • [first, last) 是一个半开区间,正如其他人所指出的那样。在一些教科书中,这也写成[first, last>,意思完全一样,只是语法不同。
  • 这个问题更好的地方是math.stackexchange.com(恕我直言)。但是没关系! :)
  • 作为助记符,认为方括号抓住了那个值,意思是“最多并包括”。并且圆括号更柔和,限制更少:“最多但不包括”。
  • 我建议将其迁移到 math.SE
  • 另一种助记符,如果您将方括号以相反的顺序背靠背放置,则它看起来像是包含包容性的大写 I:][。或者,如果您将括号以相反的顺序背靠背放置,它看起来就像一个 X 表示排他性:)(

标签: mathematical-notation


【解决方案1】:

那是half-open interval

  • 闭区间[a,b]包括端点。
  • 开区间(a,b)排除他们。

在您的情况下,包括间隔开始的终点,但不包括终点。所以这意味着区间“first1

半开区间在编程中很有用,因为它们对应于循环的常见习语:

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

这里 i 在 [0, n) 范围内。

【讨论】:

    【解决方案2】:

    括号 - [] - 表示范围的结尾是包含 - 它包括列出的元素。括号 - () - 表示 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

    【讨论】:

    • 这是从小学预代数演变而来的,在那里您学习函数 f(x) 以及函数的域和范围,其中像 f(x)=x^2 这样的函数将具有一个范围从 0 到正无穷大,用 [0,∞) 表示。
    • @Timbo ∞ 不是数字。
    • @pycoder 您对数字的定义似乎没有必要限制。 en.wikipedia.org/wiki/Surreal_number
    • @JakeD 关于您最初的评论,您的观点是正确的,无穷大不是数字,因此为什么集合 [0, ∞) 不包含它。
    • ∞ 不是 序数 数,你可以用它进行算术运算。但在回答“有多少个整数?”之类的问题时,它是一个有效的基数。在这种情况下,它作为 limit 也是完全有效的
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      区间符号的概念出现在数学和计算机科学中。数学符号[]() 表示区间的(或范围)。

      • 括号[]表示:

        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 循环)时,这些差异可能会导致细微的栅栏柱错误,也就是 off-by-one 错误。

      整数

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

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

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

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

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

      例如,在 C 或 JavaScript 中,要遍历包含 N 个元素的数组,程序员将编写常见的 i = 0, i &lt; 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 &lt;= 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 的编程语言中,您可能需要一个虚拟零个元素的 kludge 才能使用基于 1 的数学算法。例如Python Index Start

      浮点数

      区间表示法对于浮点数也很重要,可以避免细微的错误。

      在处理浮点数时,尤其是在计算机图形学(颜色转换、计算几何、动画缓动/混合等)中,通常会使用归一化数字。即 0.0 到 1.0 之间的数字。

      如果端点是 inclusiveexclusive,了解边缘情况很重要:

      • (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)中看到 32 位浮点数的 const float EPSILON = 1e-# 习惯用法。这个 SO question 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。代码中正确的 cmets 会将其记录为 [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 的 Real-Time Collision Detection,第 11 章 数值鲁棒性,第 11.3 节 鲁棒浮点使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多