Widziałem zakresy liczb reprezentowane jako [first1,last1)
i [first2,last2)
.
Chciałbym wiedzieć, co oznacza taki zapis.
Widziałem zakresy liczb reprezentowane jako [first1,last1)
i [first2,last2)
.
Chciałbym wiedzieć, co oznacza taki zapis.
Odpowiedzi:
Nawias - [
lub ]
- oznacza, że koniec zakresu jest włącznie - obejmuje wymieniony element. Nawias oznacza, że koniec jest wyłączny i nie zawiera wymienionego elementu. Tak więc [first1, last1)
zakres zaczyna się od first1
(i obejmuje go), ale kończy się tuż przed last1
.
Zakładając liczby całkowite:
To jest półotwarta przerwa .
[a,b]
obejmuje punkty końcowe.(a,b)
wyklucza ich.W twoim przypadku punkt końcowy na początku interwału jest uwzględniony, ale koniec jest wykluczony. Oznacza to więc przedział „first1 <= x <last1”.
Przedziały półotwarte są przydatne w programowaniu, ponieważ odpowiadają popularnemu idiomowi dla pętli:
for (int i = 0; i < n; ++i) { ... }
Tutaj i jest w zakresie [0, n).
Pojęcie notacji interwałowej pojawia się zarówno w matematyce, jak i informatyce. Oznaczenie matematyczne [
, ]
, (
, )
oznacza domenę (lub zakresu ) w odstępie.
Nawiasy [
i ]
oznaczają:
Nawias (
i )
oznacza:
Przedział ze stanami mieszanymi nazywany jest „półotwartym” .
Na przykład zakres kolejnych liczb całkowitych od 1 do 10 (włącznie) byłby zapisany jako taki:
Zwróć uwagę, jak inclusive
zostało użyte to słowo . Jeśli chcemy wykluczyć punkt końcowy, ale „zakryć” ten sam zakres, musimy przesunąć punkt końcowy:
Zarówno dla lewej, jak i prawej krawędzi przedziału są w rzeczywistości 4 permutacje:
(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
Jak to się ma do matematyki i informatyki?
Indeksy tablic mają tendencję do używania różnych przesunięć w zależności od tego, w którym polu się znajdujesz:
Różnice te mogą prowadzić do subtelnych błędów słupków ogrodzenia , czyli błędów typu off-by-one podczas implementowania algorytmów matematycznych, takich jak pętle for.
Jeśli mamy zbiór lub tablicę, powiedzmy kilku pierwszych liczb pierwszych [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
, matematycy określiliby pierwszy element jako element 1st
absolutny . tj. Używanie notacji z indeksem dolnym do oznaczenia indeksu:
W przeciwieństwie do tego niektóre języki programowania odwoływałyby się do pierwszego elementu jako elementu zero'th
względnego .
Ponieważ indeksy tablicy znajdują się w zakresie [0, N-1], wówczas dla przejrzystości byłoby „miło” zachować tę samą wartość liczbową dla zakresu 0 .. N zamiast dodawać szum tekstowy, taki jak -1
odchylenie.
Na przykład w C lub JavaScript, aby iterować po tablicy N elementów, programista napisałby wspólny idiom i = 0, i < N
z interwałem [0, N) zamiast nieco bardziej rozwlekłego [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>
Matematycy, ponieważ zaczynają liczyć od 1, zamiast tego i = 1, i <= N
używaliby nazewnictwa, ale teraz musimy poprawić przesunięcie tablicy w języku zerowym.
na przykład
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>
Poza :
W języków programowania, które są oparte na 0 może trzeba kludge manekina zero'th elementu do wykorzystania algorytmu matematycznego opartego 1. np. Python Index Start
Notacja interwałowa jest również ważna w przypadku liczb zmiennoprzecinkowych, aby uniknąć drobnych błędów.
Gdy mamy do czynienia z liczbami zmiennoprzecinkowymi, szczególnie w grafice komputerowej (konwersja kolorów, geometria obliczeniowa, łagodzenie / mieszanie animacji itp.), Często używane są liczby znormalizowane. Oznacza to, że liczby od 0,0 do 1,0.
Ważne jest, aby znać przypadki skrajne, jeśli punkty końcowe są włączające lub wyłączające :
Gdzie M jest jakąś maszyną epsilon . Dlatego czasami możesz zobaczyć const float EPSILON = 1e-#
idiom w kodzie C (na przykład 1e-6
) dla 32-bitowej liczby zmiennoprzecinkowej. To TAK pytanie Czy firma EPSILON coś gwarantuje? zawiera wstępne szczegóły. Bardziej wyczerpująca odpowiedź znajduje się w FLT_EPSILON
książce Co każdy informatyk powinien wiedzieć o arytmetyce zmiennoprzecinkowej oraz w książce Davida Goldberga
Niektóre implementacje generatora liczb losowych random()
mogą generować wartości z zakresu 0,0… 0,999… zamiast wygodniejszego 0,0… 1,0. Odpowiednie komentarze w kodzie udokumentują to jako [0.0,1.0) lub [0.0,1.0], więc nie ma niejednoznaczności co do użycia.
Przykład:
random()
kolory. Konwertujesz trzy wartości zmiennoprzecinkowe na wartości 8-bitowe bez znaku, aby wygenerować 24-bitowy piksel odpowiednio z kanałami czerwonym, zielonym i niebieskim. W zależności od przedziału czasu wyjściowego random()
może zakończyć się near-white
(254,254,254) lub white
(255,255,255). +--------+-----+
|random()|Byte |
|--------|-----|
|0.999...| 254 | <-- error introduced
|1.0 | 255 |
+--------+-----+
Aby uzyskać więcej informacji na temat precyzji i niezawodności zmiennoprzecinkowej z interwałami, zobacz Wykrywanie kolizji w czasie rzeczywistym Christera Ericsona , Rozdział 11 Odporność numeryczna , Rozdział 11.3 Solidne użycie zmiennoprzecinkowe .
[first, last)
jest półotwartym odstępem, jak zauważyli inni. W niektórych podręcznikach jest to również napisane[first, last>
i ma dokładnie to samo znaczenie, tylko składnia jest inna.