배열 인덱스가 대부분 0에서 시작하는 이유는 무엇입니까?

대부분의 언어에서 배열 인덱스가 0부터 시작하는 이유가 궁금한 적이 있습니까? 나는했다. 이 호기심을 만족시키는 길은 우리가 자주 잊기 쉬운 몇 가지 계시와 기본으로 이어졌습니다. 배열을 정의하여 시작하겠습니다.

어레이는 일반적으로 컴퓨터 메모리 내의 연속 영역입니다. 대부분의 언어에서 이 배열을 참조하는 데 사용하는 변수는 본질적으로 포인터입니다. 연속 메모리 부분의 시작 주소를 저장하는 포인터.

예를 들어, 모든 정수가 메모리의 2바이트를 차지하는 언어에 숫자 5개의 정수 배열arr이 있다고 가정해 보겠습니다. 이 배열의 연속 영역은 바이트 주소 44에서 시작하여 54까지 계속됩니다(10바이트 필요, 즉 각각 2바이트의 정수 5개 필요).

이 내에서 arr[i]를 참조할 때 우리는 기본적으로 속기 방식으로 메모리 위치를 조회합니다.

arr[i] points to a location = Start Address + Data size * Index
arr[0] points to a location = 44 + 2*0 = 44
arr[1] points to a location = 44 + 2*1 = 46
arr[2] points to a location = 44 + 2*2 = 48
arr[3] points to a location = 44 + 2*3 = 50
arr[4] points to a location = 44 + 2*4 = 52


0이 아닌 1에서 시작했다면 어떤 차이가 있었을까요?

arr[i] points to a location = Start Address + Data size * (Index - 1)
arr[1] points to a location = 44 + 2*(1-1) = 44
arr[2] points to a location = 44 + 2*(2-1) = 46
arr[3] points to a location = 44 + 2*(3-1) = 48
arr[4] points to a location = 44 + 2*(4-1) = 50
arr[5] points to a location = 44 + 2*(5-1) = 52


1에서 인덱싱을 시작하면 액세스하는 모든 인덱스에서 1을 빼야 합니다. 예리하게 살펴보면 시작 인덱스에서 오프셋하여 모든 요소를 ​​가져옵니다. 인덱스로 0을 사용하면 시작점에서 정확한 오프셋을 인덱스로 사용하는 것을 의미하지만 1을 사용하면 오프셋 자체를 계산해야 합니다.

그렇다면 왜 0을 사용합니까? 0을 사용하면 요소에 액세스하기 위한 계산이 하나 줄어듭니다. 이것이 그렇게 중요합니까? 오늘날은 아니지만 아마도 컴퓨팅 초기에는 알고리즘을 가장 효율적인 방식으로 사용하는 것이 중요했을 것입니다. 아마도 고대 컴퓨터의 효율성 해킹이었을 것입니다.

뿐만 아니라 0 기반 인덱싱을 사용하는 것도 수학적 의미가 있습니다. 나는 여기서 더 깊이 들어가지는 않겠지만 Dijkstratake home this point에게 일련의 자연수를 나타내는 규칙을 사용하도록 남겨둡니다.

0 기반 인덱싱의 간단한 선택은 프로그래머를 위한 배열에 대한 많은 수학을 단순화하고 해시 테이블, 일관된 해싱 및 이진 힙과 같은 일부 개념의 일부 우아한 구현을 허용합니다.

그럼에도 불구하고 계산 효율성이나 수학적 정확도의 결정보다 언어 선택의 문제입니다. 배열 구현을 약간 조정하면 임의의 인덱싱 작업을 수행할 수 있습니다.

좋은 웹페이지 즐겨찾기