Search

[자료구조] 배열 Array

제목
Tag
작성일

배열의 정의

배열(Array): 동일한 자료형의 데이터를 연속된 메모리 공간에 저장하는 자료구조
특징
고정된 크기
연속된 메모리 공간 사용
배열 원소들은 메모리상에서 연속적으로 배치됨
따라서 주소 계산을 통해 원하는 원소에 곧바로 접근할 수 있음
임의 접근(Random Access)
인덱스(index)를 이용해 O(1) 시간에 원하는 위치의 데이터를 읽거나 수정할 수 있음
예: arr[3] → 배열의 4번째 원소에 즉시 접근
동일한 자료형

배열의 추상 자료형 (ADT: Abstract Data Type)

추상자료형
객체와 그 객체와 관련된 연산의 정의로 구성됨
자료구조를 실제로 구현하기 전에, 설계 단계에서 먼저 정의하는 이론적 개념
자료형
메모리에 저장하기 위한 변수 선언을 의미
자료구조의 실제 구현 단계에서, 프로그래밍 언어를 통해 선언됨
ADT Array 정의
Array 객체 : <i ∈ Index, e ∈ Element> 쌍들의 집합
Bash
복사
Index 집합: 순서를 나타내는 원소의 유한 집합 (보통 0 ~ n-1)
Element 집합: 자료형이 같은 원소들의 집합
ADT 배열의 연산 정의
생성 (crate) - Array create(n)
조회 (retrieve)
Element retrieve(a, i)
배열 a의 i번째 원소를 반환
조건: i ∈ Index (인덱스 범위 안)
범위를 벗어나면 에러 반환
저장 (store)
Array store(a, i, e)
배열 a의 i번째 위치에 원소 e를 저장하고 배열을 반환
조건: i ∈ Index
범위를 벗어나면 에러 반환

배열 연산의 구현

생성
크기 n 인 배열 생성후 0으로 초기화
void create(int n) { int a[n]; for (int i=0; i<n; i++) { a[i] = 0; // 초기화 } }
C
복사
조회
인덱스가 유효하면 값 반환, 아니면 에러
int retrieve(int *a, int i) { if (i >= 0 && i < array_size) return a[i]; else { printf("Error\n"); return -1; } }
C
복사
저장
인덱스가 유효하면 값 저장
void store(int *a, int i, int e) { if (i >= 0 && i < array_size) a[i] = e; else printf("Error\n"); }
C
복사

1차원 배열

한줄 짜리 배열로 연속된 메모리 공간에 원소들이 차례대로 저장
메모리 주소 계산
배열의 첫 번째 원소 A[0]이 저장된 메모리 주소를 α (알파) 라고 가정
각 원소의 크기를 k 바이트 라고 할때
예: int 자료형은 보통 4바이트 → k = 4
배열의 i번째 원소 A[i]의 주소는 다음과 같이 계산
주소(A[i]) = α + (i × k)
Plain Text
복사
A[0] → α
A[1] → α + k
A[2] → α + 2k
A[3] → α + 3k
A[i] → α + i × k
예시
배열 int A[5] 선언
시작 주소 α = 1000
int 크기 k = 4바이트
그럼 주소는:
A[0] = 1000
A[1] = 1004
A[2] = 1008
A[3] = 1012
A[4] = 1016
주소 계산으로 i번째 원소 바로 접근가능

배열의 확장

행렬을 컴퓨텨에서 표현하면 2차원 배열이 적합
행 우선 배열
1차원 배열 여러개 쌓아놓은 형태
가로의 1차원 배열 단위로 메모리 영역을 우선 할당
열 우선 배열
1차원 배열을 여러 개 세워 놓은 형태
세로의 1차원 배열 단위로 메모리 영역을 우선 할당

희소행렬(Sparse Matrix)

원소값이 0인 원소가 그렇지 않은 원소보다 상대적으로 많은 행렬
0인 값을 모두 저장하면 메모리 낭비가 되므로, 0이 아닌 값만 따로 모아서 저장
(행, 열, 값) 형태로 압축해 저장
예시
[0, 0, 5] [0, 0, 0] [7, 0, 0]
(0, 2, 5), (2, 0, 7)