CS/자료구조론
자료구조의 기본 개념, 순차 데이터 표현(배열, 구조체)
망재이
2024. 2. 1. 18:28
자료 구조
- 자료 구조 : 자료들의 상호 연관 관계 -> 어떤 연관 관계를 가지냐에 따라 선형구조와 비선형구조로 구분
- 선형구조
- 데이터의 항목 사이의 관계가 1:1이며, 선후 관계가 명확한 1개의 선의 형태를 갖는 리스트 구조
- 배열, 리스트(연결 리스트, 선형 리스트), 스택, 큐, 덱으로 나뉨 - 비선형구조
- 데이터의 항목 사이에 1:n 또는 n:m의 관계를 갖는 그래프적 특성을 갖는 형태
- 트리, 그래프가 이에 속함
- 그래프는 사이클을 허용하며, 트리는 사이클을 허용하지 않음
알고리즘
- 컴퓨터로 문제를 풀기 위한 단계적인 절차
- 특정한 일을 수행하는 명령어들의 집합
- 알고리즘의 특성
- 입력 (Input) : 외부에서 제공되는 자료가 있을 수 있음
- 출력 (Ouput) : 반드시 한 개 이상의 결과를 생성해야함
- 명확성 : 각 명령들은 명확하고, 모호하지 않아야 함
- 유한성 : 어느 한정된 수의 단계 뒤에는 반드시 종료
- 실제성 : 알고리즘의 모든 명령은 실행 가능
- 유효성 : 원칙적으로 모든 명령들은 종이와 연필만으로 수행될 수 있게 기본적이어야 함
배열 (Array)
- 배열의 특성
- 배열은 정의(선언)될 때 이름, 크기, 데이터 타입이 결정
- <인덱스, 원소> 쌍의 집합으로, 각 쌍은 어느 한 인덱스가 주어지면 그와 연관된 원소 값이 결정되는 대응 관계를 나타냄
- 원소들이 모두 같은 타입이고 크기도 같음
- 반드시 유한성을 가짐
- 배열의 접근 방법은 순서에 따라 접근하지 않고 인덱스에 따라 직접 접근함
- 배열의 주된 연산은 정보를 저장하고 탐색하는 연산
- 기준주소에서부터 시작하여 연속적인 메모리 주소를 할당하여 배열의 논리적 순서와 메모리의 물리적 순서가 같도록 표현한 것 - 1차월 배열
int A[6];
A[0] | A[1] | A[2] | A[3] | A[4] | A[5] |
배열 요소 | 메모리 주소 |
A[0] | 기본 주소 A |
A[1] | A + 1 * sizeof(int) |
A[2] | A + 2 * sizeof(int) |
A[3] | A + 3 * sizeof(int) |
A[4] | A + 4 * sizeof(int) |
A[5] | A + 5 * sizeof(int) |
* A[i]의 주소 : 배열 A의 시작주소 + 첨자 * int형 기억장소 크기(바이트) = A + i
- 2차원 배열
- 가로줄을 행(row), 세로줄을 열(column)
- 전체 배열의 크기가 A(m, n)이고 시작 주소가 A(k, l)일 때, 현재 위치 A(i, j)의 주소를 구한다고 할 때,
-> 행우선 순서로 접근(행의 변수가 정해지고 열의 변수가 전체적으로 변하는 접근 방식) : base + ((i - k)n + (j - l)) * byte 크기
-> 열우선 순서로 접근(열의 변수가 정해지고 행의 변수가 전체적으로 변하는 접근 방식) : base + ((j - l)m + (i - k)) * byte 크기
* 3차원 배열
- p개의 2차원 배열로 구성되며 면, 행, 열로 표시
- 3차원 배열 A(p, m, n)에서 A(k, i, j)의 주소를 구한다고 할 때(시작 위치 A(1, 1, 1) = base이고 한 원소의 크기는 1byte)
-> 행우선 순서로 접근 : base + (k - 1)mn + (i - 1)n + (j - 1)
-> 열우선 순서로 접근 : base + (k - 1)mn + (j - 1)m + (i - 1)
더보기
Q. int a[5][6]으로 선언되는 2차원 배열이 열우선 순서로 저장되고 a[0][0]의 주소가 1000이며 정수 크기는 4byte라고 가정했을 때 a[2][3]의 주소는?
A. 1068
-> 1000 + ((3 - 0) * 5 + (2 - 0)) * 4 = 1068
구조체 (structure) -> JAVA에서는 존재하지 않는 개념
- 구조체의 정의
- 배열이 타입이 같은 데이터의 모임이라면 구조체는 타입이 다른 데이터를 묶는 방법으로 사용자 정의 데이터형
- typedef을 사용하면 구조체 변수들을 보다 쉽게 만들 수 있음
typedef struct person {
char name[10];
int age;
} person
person a;
- 자기 참조 구조체 (self-referential structure)
- 특별한 구조체로서 구성 요소 중에 자기 자신을 가리키는 포인터가 한 개 이상 존재하는 구조체
- 연결리스트나 트리를 구성할 때 많이 등장
- 일반적으로 항목의 개수를 미리 예측할 수 없는 경우에 자기 참조 구조체를 정의해놓고 동적으로 기억장소를 할당받아서 이들을 포인터로 연결하여 자료 구조를 구성 (구조체 안에 구조체 자체를 참조할 수는 없음)
typedef struct ListNode {
char data[10];
struct ListNode *link;
} ListNode;
728x90