데이터 구조 배열 순서 저장 상세 소개

3755 단어
데이터 구조 배열 순서 저장
          최근 에 데이터 구 조 를 공부 하고 배열 의 순서 로 저장 하 는 것 을 보 았 습 니 다. 어 지 럽 고 이해 할 수 없습니다. 많은 것들 이 인터넷 에서 비교적 상세 한 자 료 를 찾 았 습 니 다. 여러분 은 주석 내용 을 잘 보 세 요.

#include  
#define MAX_ARRAY_DIM 8 //           8 
typedef struct {
 ElemType *base;  //      , InitArray  
 int dim;  //    
 int *bounds;  //      , InitArray  
 int *constants;  //          , InitArray  
}Array;

Status InitArray(Array &A,int dim,...){//     “   ”    。            。
//  :  4   ,     :4,5,6,7(         ),  ,    :
//InitArray(ar, 4, 4, 5, 6, 7);
//ar  ,ar         , 4     4 , 4, 5, 6, 7 4       
//   5  ,     :
//InitArray(ar, 5,     ,    ,    ,    ,    );
//   dim          ,        A,   OK。
if (dim<1 ||dim>MAX_ARRAY_DIM) return ERROR;
A.dim=dim;
A.bounds=(int *)malloc(dim*sizeof(int));
if (!A.bounds) exit(OVERFLOW);
//       ,   A.bounds,   A     elemtotal。
elemtotal=1;
va_start(ap,dim); //ap va_list  ,             。
for (i=0;i=0;--i)//A.constants[2] = 7,A.constants[1] = 6*7,A.constants[0] = 5*6*7
 A.constants[i]=A.bounds[i+1] * A.constants[i+1];
//    ,        :A.constants    ,       。   :  (2,0,0,0)       ,       (0,0,0,0)~(0,4,5,6) (1,0,0,0)~(1,4,5,6)    ,            5*6*7   ,     A.constants[0]        !
//        !
return OK;
}

status Locate(Array A,va_list ap,int &off){
// ap         ,       A     off。
 off=0;
 for (i=0;i=A.bounds[i]) return OVERFLOW;
 off + = A.constants[i] * ind;
 }
 return OK;

왜 A. constants [dim - 1]
bounds 는 1 차원 마다 개 수 를 저장 합 니 다. constants 는 모든 차원 에서 1 을 추가 하면 메모리 공간 에 대응 하 는 아래 표 시 를 얼마나 늘 려 야 합 니까?말하자면 추상 적 이다. 우 리 는 3 차원 이 라 고 가정 하면 쉽게 말 할 수 있다. 먼저 3 차원 을 bounds [0] 만큼 높 은 것 으로 본다. 모든 0 에서 bounds [0] - 1 의 범위 내 에서 하나의 평면 이다. 이 평면 은 bounds [1] 만큼 길 고 bounds [2] 만큼 넓다.그러면 우 리 는 높이 = 0, 길이 = 0, 너비 = 0 을 메모리 의 첫 번 째 위치 에 대응 하고 높이 = 0, 길이 = 0, 너비 = 1 을 두 번 째 위치 에 대응 합 니 다. 그러면 높이 = 0, 길이 = 1, 너비 = 0 은 어느 위치 에 두 어야 합 니까?분명히 0 + bounds [2] 이 자리 입 니 다.그러면 높이 = 1, 길이 = 0, 너비 = 0 의 그 요 소 는 어느 위치 에 있어 야 합 니까?분명히 높이 = 0 이라는 평면 을 다 놓 은 후의 그 위치 이다. 높이 = 0 이라는 평면 은 길이 * 너비 만큼 많은 요소 가 있다. 즉, bounds [1] * bounds [2] 이렇게 많은 요소 이기 때문에 높이 = 1, 길이 = 0, 너비 = 0 이라는 요 소 는 0 + bounds [1] * bounds [2] 라 는 위치 에 있어 야 한다. 그렇지?만약 에 네 번 째 차원 이 있다 고 가정 하면 우 리 는 이 차원 이 시간 을 대표 한다 고 가정 합 시다. 그 시간 = 0, 높이 = 0, 길이 = 0, 너비 = 0 의 요 소 를 메모리 의 0 번 째 위치 에 두 면 시간 = 1, 높이 = 0, 길이 = 0, 너비 = 0 의 요 소 는 0 + bound [1] * bound [2] * bound [3] 라 는 위치 에 두 어야 합 니까?이것 이 바로 A. constants [i] = A. bounds [i + 1] * A. constants [i + 1] 이다.이 공식의 내력.물론, 나 는 단지 아주 간단하게 설 명 했 을 뿐이다. 많은 세부 사항 은 네가 스스로 고려 해 야 한다. 왜냐하면 언어 표현 이 너무 복잡 해서 어떻게 표현 해 야 할 지 모르겠다.사실 A. constants [i] = A. bounds [i + 1] * A. constants [i + 1] 를 자세히 보 세 요.,이것 은 전달 공식 입 니 다. 그것 을 펼 치면 다음 에 저 는 constants [i] 를 coni, bounds [i] 를 boni 로 간략하게 쓰 겠 습 니 다. 그러면 con i = bon [i + 1] * con [i + 1] = bon [i + 1] * bon [i + 2] = bon [i + 1] * bon [i + 3] * con [i + 3] = bon [i + 1] * bon [i + 2] * bon [i + 3] *... * bon [im] 이 공식 을 보 세 요. 위 에서 말 한 높이 * 길이 * 너비 에 해당 하 는 것 아 닙 니까?아까 그 bon [dim] 은 bon [dim - 1] 이 라 고 써 야 되 는데 이 건 이해 에 영향 을 주지 않 아 요.
그리고 우 리 는 마지막 1 차원 을 봅 니 다. 예 를 들 어 위의 예 의 너비, 너비 + 1 이 바로 메모리 주소 + 1 이 아 닙 니까?따라서 너비 라 는 마지막 차원 에 대응 하여 매번 주 소 는 + 1 만 있 으 면 다음 요 소 를 방문 할 수 있 기 때문에 bon [dim - 1] 즉 마지막 1 차원 입 니 다. 그렇지 않 으 면 1 과 같 아야 합 니까?
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다. 본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기