Dấu ngoặc vuông và ký hiệu ngoặc đơn này có nghĩa là gì [đầu tiên, cuối1)?


136

Tôi đã thấy phạm vi số đại diện như [first1,last1)[first2,last2).

Tôi muốn biết một ký hiệu như vậy có nghĩa là gì.


3
[first, last)là một khoảng thời gian nửa mở như những người khác đã lưu ý. Trong một số sách giáo khoa, điều này cũng được viết [first, last>và có cùng ý nghĩa, chỉ có cú pháp là khác nhau.
darioo

8
Một nơi tốt hơn cho câu hỏi này sẽ là math.stackexchange.com (IMHO). Nhưng đừng bận tâm! :)
xk0der

8
Là một Mnemonic, hãy nghĩ rằng dấu ngoặc vuông lấy giá trị đó, nghĩa là "lên đến và bao gồm". Và dấu ngoặc tròn mềm hơn và ít ý nghĩa hạn chế hơn: "lên đến nhưng không bao gồm".
Eric Leschinski 6/2/2016

Là một lập trình viên bất cứ khi nào tôi thấy dấu ngoặc vuông, nó luôn mang lại cho tôi một hình thức gợi nhớ về dạng Backus-Naur mở rộng - en.wikipedia.org/wiki/Extends_Backus%E2%80%93Naur_Form
RBT

2
Tôi khuyên bạn nên chuyển cái này sang toán học.SE
Ben Leggiero

Câu trả lời:


226

Dấu ngoặc có nghĩa là phần cuối của phạm vi được bao gồm - nó bao gồm phần tử được liệt kê. Dấu ngoặc đơn có nghĩa là kết thúc là độc quyền và không chứa phần tử được liệt kê. Vì vậy [first1, last1), phạm vi bắt đầu bằng first1(và bao gồm nó), nhưng kết thúc ngay trước đó last1.

Giả sử số nguyên:

  • (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

3
Điều này phát triển từ tiền đại số của trường cấp ba, nơi bạn tìm hiểu về các hàm f (x) và miền và phạm vi của hàm, trong đó một hàm như f (x) = x ^ 2, sẽ có phạm vi từ 0 đến vô cực dương, được biểu thị bằng [0, ∞).
JohnMerlino

1
@Timbo không phải là số.
JakeD

2
@pycoder định nghĩa về số của bạn có vẻ hạn chế không cần thiết. vi.wikipedia.org/wiki/Surreal_number
Timbo

2
@JakeD Về nhận xét ban đầu của bạn, bạn đúng theo cách vô hạn không phải là một số, do đó, tại sao tập [0,) không bao gồm nó.
wjandrea

1
Không phải là số thứ tự , thuộc loại mà bạn có thể thực hiện số học. Nhưng đó là một số chính yếu hợp lệ khi trả lời các câu hỏi như "Có bao nhiêu số nguyên?". Cũng như trong trường hợp này, nó hoàn toàn hợp lệ như một giới hạn
Kevin Wright

37

Đó là một khoảng thời gian nửa mở .

  • Một khoảng thời gian đóng [a,b] bao gồm các điểm kết thúc.
  • Một khoảng thời gian mở (a,b) loại trừ chúng.

Trong trường hợp của bạn, điểm cuối ở đầu khoảng được bao gồm, nhưng điểm cuối bị loại trừ. Vì vậy, nó có nghĩa là khoảng "đầu tiên <= x <last1".

Các khoảng thời gian nửa mở rất hữu ích trong lập trình vì chúng tương ứng với thành ngữ chung để lặp:

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

Ở đây tôi nằm trong phạm vi [0, n).


15

Khái niệm ký hiệu khoảng xuất hiện trong cả Toán học và Khoa học Máy tính. Các ký hiệu toán học [, ], (, )biểu thị miền (hoặc nhiều ) của một khoảng thời gian.

  • Dấu ngoặc []phương tiện:

    1. Số lượng được bao gồm ,
    2. Bên này của khoảng được đóng lại ,
  • Dấu ngoặc đơn ()phương tiện:

    1. Số lượng được loại trừ ,
    2. Bên này của khoảng là mở .

Một khoảng với các trạng thái hỗn hợp được gọi là "nửa mở" .

Ví dụ, một loạt các số nguyên liên tiếp từ 1 .. 10 (bao gồm) sẽ được ký hiệu như vậy:

  • [1,10]

Chú ý từ inclusiveđã được sử dụng. Nếu chúng ta muốn loại trừ điểm cuối nhưng "che" cùng phạm vi, chúng ta cần di chuyển điểm cuối:

  • [1,11)

Đối với cả hai cạnh trái và phải của khoảng thực tế có 4 hoán vị:

(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

Làm thế nào điều này liên quan đến Toán học và Khoa học Máy tính?

Các chỉ mục mảng có xu hướng sử dụng một phần bù khác nhau tùy thuộc vào trường bạn đang ở:

  • Toán học có xu hướng một nền tảng.
  • Một số ngôn ngữ lập trình có xu hướng không dựa trên cơ sở, chẳng hạn như C, C ++, Javascript, Python, trong khi các ngôn ngữ khác như Mathicala, Fortran, Pascal là một nền tảng.

Những khác biệt này có thể dẫn đến tinh tế hàng rào bài lỗi , aka, off-by-one lỗi khi thực hiện các thuật toán toán học chẳng hạn như cho-vòng.

Số nguyên

Nếu chúng ta có một tập hợp hoặc mảng, nói về một vài số nguyên tố đầu tiên [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ], các nhà toán học sẽ coi phần tử đầu tiên là phần tử 1st tuyệt đối . tức là sử dụng ký hiệu đăng ký để biểu thị chỉ mục:

  • a 1 = 2
  • a 2 = 3
  • :
  • một 10 = 29

Một số ngôn ngữ lập trình, trái ngược nhau, sẽ coi phần tử đầu tiên là phần tử zero'th tương đối .

  • một [0] = 2
  • một [1] = 3
  • :
  • một [9] = 29

Vì các chỉ mục mảng nằm trong phạm vi [0, N-1] nên với mục đích rõ ràng, sẽ rất "tốt" để giữ cùng một giá trị số cho phạm vi 0 .. N thay vì thêm nhiễu văn bản như -1sai lệch.

Ví dụ, trong C hoặc JavaScript, để lặp lại một mảng các phần tử N, lập trình viên sẽ viết thành ngữ chung i = 0, i < Nvới khoảng [0, N) thay vì dài hơn một chút [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>

Các nhà toán học, vì họ bắt đầu đếm từ 1, thay vào đó sẽ sử dụng i = 1, i <= Ndanh pháp nhưng bây giờ chúng ta cần sửa lỗi bù trong một ngôn ngữ dựa trên zero.

ví dụ

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>

Ngoài ra :

Trong các ngôn ngữ được 0 dựa trên lập trình bạn có thể cần một kludge của nguyên tố một hình nộm zero'th sử dụng một thuật toán toán học 1-based. ví dụ: Python Index Bắt đầu

Điểm nổi

Ký hiệu khoảng cũng rất quan trọng đối với các số dấu phẩy động để tránh các lỗi tinh vi.

Khi xử lý các số dấu phẩy động, đặc biệt là trong Đồ họa máy tính (chuyển đổi màu sắc, hình học tính toán, nới lỏng / trộn hoạt hình, v.v.) thường sử dụng các số chuẩn hóa. Đó là, các số từ 0,0 đến 1,0.

Điều quan trọng là phải biết các trường hợp cạnh nếu các điểm cuối được bao gồm hoặc độc quyền :

  • (0,1) = 1e-M .. 0,999 ...
  • (0,1] = 1e-M .. 1.0
  • [0,1) = 0,0 .. 0,999 ...
  • [0,1] = 0,0 .. 1,0

Trong đó M là một số máy epsilon . Đây là lý do tại sao đôi khi bạn có thể thấy const float EPSILON = 1e-#thành ngữ trong mã C (chẳng hạn 1e-6) cho số dấu phẩy động 32 bit. Câu hỏi SO này Liệu EPSILON có đảm bảo được gì không? có một số chi tiết sơ bộ. Để có câu trả lời toàn diện hơn, hãy xem FLT_EPSILONvà David Goldberg Điều mà mọi nhà khoa học máy tính nên biết về số học dấu phẩy động của

Một số triển khai của trình tạo số ngẫu nhiên, random()có thể tạo ra các giá trị trong phạm vi 0,0 .. 0,999 ... thay vì thuận tiện hơn 0,0 .. 1.0. Nhận xét đúng trong mã sẽ ghi lại điều này là [0,0,1.0) hoặc [0,0,1.0] vì vậy không có sự mơ hồ về việc sử dụng.

Thí dụ:

  • Bạn muốn tạo ra random()màu sắc. Bạn chuyển đổi ba giá trị dấu phẩy động thành giá trị 8 bit không dấu để tạo pixel 24 bit với các kênh màu đỏ, xanh lục và xanh lam tương ứng. Tùy thuộc vào đầu ra khoảng thời gian của random()bạn có thể kết thúc bằng near-white(254.254.254) hoặc white(255.255.255).
     +--------+-----+
     |random()|Byte |
     |--------|-----|
     |0.999...| 254 | <-- error introduced
     |1.0     | 255 |
     +--------+-----+

Để biết thêm chi tiết về độ chính xác và độ mạnh của dấu phẩy động trong các khoảng thời gian, hãy xem Phát hiện va chạm trong thời gian thực của Christer Ericson , Chương 11 Độ mạnh của số , Phần 11.3 Cách sử dụng điểm nổi mạnh mẽ .


1

Nó có thể là một quy ước toán học trong định nghĩa của một khoảng trong đó dấu ngoặc vuông có nghĩa là "bao gồm cực trị" và dấu ngoặc tròn "độc quyền cực trị".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.