자료구조
· 22 min read
자료
- 현실세계로부터 관찰이나 측정을 통해서 수집된 사실이나 값
- 자료형태는 숫자로 표현되는 수치값이나 문자들로 구성되는 스트링을 포함
정보
- 어떤 상황에 대한 적절한 의사결정을 할 수 있게 하는 데이터의 유효한 해석이 나 상호 관계
- 자료가 처리되어 발생하는 결과
- 한시성
- 비소모성
- 공공성
- 독점성
자료구조
- 데이터를 효율적으로 사용할 수 있도록 자료의 특성에 따라 분류하여 구조를 만들어서 저장해 둔 것
- 단순 자료구조: integer, float, char 등 단일자료
- 선형 자료구조: 리스트, 스택, 큐
- 비선형 자료구조: 트리, 그래프
- 파일구조: 보조기억장치에 저장되는 대용량의 자료구조
알고리즘
- 유한한 단계를 통해 문제를 해결하기 위한 절차나 방법
- 입력, 출력, 명확성, 정확성, 유한성, 효율성, 일반성
순서도
- 사다리꼴 입출력
- 타원 터미널
- 마름모 비교, 판단
- 육각형 준비
추상
- 자세한 정보는 감추고 사용자가 자료를 사용하는 데 필요한 정보만 인터페이스를 통해 외부로 노출하는 것
프로시져
- 추상화 제공
- 재사용 가능
- 여러 프로그래머가 같은 문제를 해결할 수 있게 도와줌
- 구조 파악이 쉽다
프로시져 간 자료 전달 방법
- Call By Value: 값에 의한 호출, 프로시저를 호출하기 전에 실인수의 값을 계산하고 값을 호출시에 대응되는 국소적 변수인 가인수에 대입함으로써 전달하는 방식
- Call By Reference: 참조에 의한 호출, 주소와 포인터 등 실인수를 참조하기 위한 정보가 가인수에 전달되어 동일한 데이터를 참조하게 되어 호출된 프로시저에서 참조하는 값이 변경되면 실인수의 값도 동일하게 변경된다.
재귀
- 함수가 직접 자신을 호출하는 방식
공간 복잡도
- Space Complexity, 프로그램을 실행시켜 완료하는 데 필요로 하는 공간의 양
고정 공간
프로그램 입출력의 횟수나 크기와 관계없는 공간 요구
가변 공간
- 특정 인스턴스에 의존하는 크기를 가진 구조화 변수들이 필요로 하는 공간
시간 복잡도
- 프로그램의 기능을 수행하기 위해 프로그램이 취한 단계수로 표현하는 것
빅오
- f(n) = O(g(n))은 모든 n, n >= n0에 대해
f(n) <= cg(n)
인 조건을 만족하는 두 양의 정수 c와 n0이 존재하기만 하면 f(n) = O(g(n))이다.
배열
- 같은 자료형과 같은 크기를 가진 원소가 순서를 가지고 만들어진 집합
- 인덱스에 의해 참조
순서 리스트
- 나열한 원소들 간에 순서를 가지고 있는 리스트
- 평균 이동 횟수 (n+1)/2, 삭제 시 (n-1)/2
- 삽입 삭제시 전체를 밀어야되지만, 기억장소 효율은 가장 좋다.
연결 리스트
- 공간 제약이 없다.
- 삽입 삭제가 효율적이다.
주소 저장
- 행 우선: 시작주소 + (행 전체 열 크기 + 열) 원소 크기
- 열 우선: 시작주소 + (열 전체 행 크기 + 행) 원소 크기
희소행렬
- 행렬의 대부분 원소가 0일 경우 기억공간의 낭비가 발생하므로 0이 아닌 원소만 추출하여 [행 번호, 열 번호, 원소] 쌍으로 2차원 배열에 저장하는 방식
- 연산 측면에선 반복적인 패턴을 찾을 수 없어 비효율적
전치행렬
- 행과 열을 바꾼 것, B = A^T로 표현
- A^T = A면 대칭행렬
스택
- 한 끝에서 삽입과 삭제가 일어나는 순서 리스트
- LIFO
시스템 스택
- 함수가 호출될 때마다 프로그램은 활성 레코드 또는 스택이라는 구조를 생성하고 시스템 스택의 top pointer에 적재한다.
스택의 적용
- 부프로그램 호출 시 복귀 주소 저장
- 함수 호출의 순서 제어
- 인터럽트 복귀 주소 저장
- 중위 표기식을 후위 표기식으로 변환
- 후위 표기법으로 표현된 산술식 연산
- 0-주소 지정방식의 명령어 자료 저장소
- 재귀 프로그램의 순서 제어
- 컴파일러를 이용한 언어 번역
큐
- 리스트의 한 쪽에선 원소를 삽입하고 다른 쪽에서는 삭제만 하는 구조
- FIFO
- front pointer: 가장 먼저 삽입된 자료의 포인터
- rear pointer: 가장 나중에 삽입된 자료의 포인터
- 초기 조건: front == rear = -1
- 공백: front == rear = 1 && front == rear
- 가득참: rear = n - 1
원형큐
- 큐가 가득 찬 후에 첫 번째 큐를 Q[0]에 위치하게 조정하는 배열 이동은 시간이 많이 걸려 원형으로 만듦
- 초기 조건: front == rear == 0
- 삽입 위치: rear = (rear + 1) % n
- 삭제 위치: front = (front + 1) % n
- 공백: front == rear
- 가득참: front == (rear + 1) % n
큐의 적용
- 작업 버퍼 큐
- 프로세스 스케줄링
- 큐잉 시뮬레이션
데크
- 원소의 삽입과 삭제가 리스트의 양쪽 끝에서 이뤄지는 자료구조
- 스택과 큐의 결합
- Double Ended Queue
스크롤
- 입력 제한 테크
- 한 쪽에선 삭제만 가능
셀프
- 출력 제한 데크
- 한 쪽에선 삽입만 가능
스택 수식 계산
- 우선순위: 승제 > 가감 > 시프트 > 비교 > 등가 > 비트 > 논리
연결 리스트
순서 리스트의 문제점
- 삽입 삭제시 많은 이동
- 할당 공간 부족시 재할당
- 표현방법과 기억 공간의 크기가 달라지면 컴파일부터 다시 실행
비사용 기억공간
- 기억 공간이 필요하여 요청하는 경우 할당해 줄 수 있는 공간
연결 리스트의 응용
- 다항식 표현
이중 연결 리스트
- 링크의 방향을 양방향으로 이동할 수 있어 검색 효율성이 좋다.
원형 연결 리스트에서 헤드 노드를 사용하는 이유 모든 원소가 환형으로 연결되어 있기 때문에 무한 루프에 빠질 수 있어 헤드 노드를 두어 리스트의 시작을 알린다.
트리
- 정보의 검색 및 자료 보관을 위해 널리 사용되고 있는 자료구조
- 사이클을 포함하지 않는 연결 그래프의 일종
- 계층적 자료구조
- 노드와 각 노드를 연결하는 간선으로 구성
- 임의의 노드에서 다른 노드로의 연결은 하나만 가능하다.
- 루트 노드는 하나만 존재
- 트리의 부분 집합은 하나의 트리, 이 것을 서브 트리라고 한다.
- 노드 연결에 순환이 존재하지 않는다.