자료구조의 개념
in Devlog on DataStructure
- 자료구조? / 자료구조의 적용과 응용
- 이론/요소
- 현실 세계의 실제 자료들의 관계를 반영할 수 있는 방법을 배운다.
- 자료를 효율적으로 처리할 수 있게 표현하는 방법을 배운다.
- 실습
- 자료 구조로 표현된 자료를 처리하는 절차들의 모임인 알고리즘의 작성 예시에 대해 배운다.
- 다양한 문제들을 자료 구조로 해결해본다.
- Fundamentals of Data Structures in C++ (Horowitz, Sahni, Mehta)
- 보조 교재
- 자바로 자료구조를 설명한 모든 서적
- 국내 자료구조 관련 도서
자료구조 개요
- 자료구조란?
- 컴퓨터 프로그램을
- 논리적인 구조로 설계하고 분석
- 컴퓨터가 필요로 하는 자료 -> 표현, 저장, 처리하는 일련의 구조와 방법
- 컴퓨터로 문제를 해결하는 과정
문제 정의 = 요구사항 + 분석
- 요구사항?
- 입력 : 우리에게 주어진 정보 / 출력 : 우리가 만들어야 하는 결과
- 분석?
- 문제를 잘게 쪼개기! (해결 가능한 / 관리 가능한 수준까지)
- 방법 : 상향식(BOttom-Up) / 하향식(Top-Down)
- 분석: 상향식
- 구조화된 전략 없음
- 쪼개진 문제 단위로 먼저 해결하기
- 분석: 하향식
- 목적에 맞게 프로그램이 어떻게 동작해서 종료할 지 계획 (프로그램을 여러 단위 부분 조각으로 나눠가며 해결)
분석 후에는? 설계(DESIGN)
- 처리 대상 결정
- 데이터 객체 : 프로그램에 필요한 요소
- 어떻게 추상화하고 표현할까? -> 자료정의
- 처리 방식 결정
- 처리 : 데이터 객체를 다루기
- 알고리즘 설계 -> 알고리즘 명세에 따라 처리 -> 알고리즘 작성
- 처리 대상 결정
- 반복 정제(REFINEMENT) 후 코딩
- 선택한 데이터 객체를 표현하기
- 알고리즘에 따라 작성하기
- 순서가 중요함!
- 데이터 객체의 표현이 결정되야 -> 알고리즘을 효과적으로 작성할 수 있다.
- 마지막은 검증(VERIFICATION)
- 정확성 입증
- 선택한 알고리즘이 정확한가?
- 에러율을 줄이고 있는가?
- 테스팅
- 에러가 없는 프로그램이 목표
- 테스트 데이터 집합을 이용해 검증
- 정확성 입증
- 에러 제거
- 설계와 코딩에 따라 오류 제거의 난이도가 결정됨
- 잘 설계되고 모듈화된 프로그래밍을 하자!
결론 : 문제를 잘 해결하려면?
- 요구사항을 찾고
- 분석GKDU
- 적절한 데이터 객체(자료구조)를 선택하고 알고리즘을 설계하고
- 문제에 적합하게 정제하여 코딩한 후
- 그리고 에러 없이 문제를 잘 해결하는지 테스트하여 검증하기
- 소프트웨어 생명주기
생명주기를 잘 관리하는 방법
- 소프트웨어 공학 방법론
- 폭포수 모델 (전통적인 방법)
- 점진적 모델 : 기능을 점진적으로 증가시키는 방법, 각 기능별로 생명주기 관리
- 오픈소스 개발 방법
- 애자일 방법론 : 수시로 변경되는 요구사항에 맞춰 프로토타입을 만들고 검증하여 적용하는 방법
알고리즘
- 알고리즘?
- 유한(finite)한 명령어의 집합 -> 명령어에 따라 특정한 일(Task)를 수행
알고리즘이 가져야할 것
- 입력(Input) - 외부에서 제공하는 0개 이상의 입력이 존재해야 한다!
- 출력(Output) - 최소한 하나 이상의 출력 결과를 생성해야 한다.
- 확실성(Definiteness) - 수행할 단계와 순서를 완전하고 명확하게 명세해야한다. 각 명령어가 명확하고 애매모호하지 않아야 한다.
- 유한성(Finiteness) - 유한한 단계를 거친후 반드시 종료해야 한다.
- 효과성(Effectiveness) - 모든 명령어는 효율적으로 실행 가능해야 한다.
- 알고리즘 vs 프로그램
알고리즘을 표현할 수 있는 방법 -> 자연어, 순서도, 의사코드 (C-Style 등)
알고리즘 표현의 예시 - 선택 정렬
목표 : 1 이상의 정수 집합을 정렬하기 (정렬되지 않은 숫자들에서 가장 작은 숫자를 찾아서 정렬된 결과에 두기)
위의 목표는 확실성에 부합하지 않기에 잘못된 알고리즘 표현 방식임 - 정렬되어 있는 숫자들이 주어지면 어떻게 하나요? - 정렬된 결과에 어떻게 둬야하나요?
의사코드로 표현해보면
- 알고리즘 표현의 예시 - 이진 탐색
- 1 이상의 정수 집합이 있고
- 이 집합이 이미 정렬되어 있는 자료를 list라고 한다.
- 정수 searchnum이 이 집합에 있는 지 확인한다.
- 만약 찾으면 list 에서의 index값을 얻는다.
(예를 들어, list[i]가 searchnum가 같으면, i가 된다.) - 그렇지 않으면, -1이 된다.
- 알고리즘 표현의 예시 - 재귀 알고리즘
작성한 알고리즘(함수 등)이 자기 자신을 호출하는 알고리즘 (직접 재귀, 간접 재귀)
- 복잡한 절차를 단순하게 표현할 수 있다
- 어떤 함수도 재귀적으로 표현 가능
- 재귀적으로 정의된 문제에서는 좋음!
- 반복적(ITERATIVE) 표현을 재귀적(RECURSIVE)으로 변경하기
- 재귀적 호출을 종료하는 경계 조건을 만들기!
- 반복적 표현의 각 단계를 재귀적 호출로 바꾸기
데이터 추상화
- 현실 세계를 자료형으로 표현하여 추상화 하는 것.
- 기본 자료형 (정수, 실수, 문자 등)
- 배열 (동일한 원소들의 집합)
- 복잡한 구조 (여러가지 자료형들을 복합적으로 포함하는 원소)
- 자료형(DATA TYPE)
- 객체(의 모음)
- 이 객체에 대한 연산자
- Abstract Data Type(ADT)
- 객체의 명세에 따라 만든 자료형
- 이 자료형에 대한 연산자 (구현과는 분리됨)
- Abstract Data Type(ADT) - 예시
- ex) SET(집합) -> 연산자 (합집합, 교집합 등)
- Abstract Data Type(ADT)
- ADT는 프로그램의 일부분에 한정되도록 자료형으로 캡슐화
- ADT의 구현은 프로그래밍 언어에 맞게 작성 (구현은 ADT를 잘 나타내는 자료구조를 선택한다.) (자료구조는 기본 프로그래밍 언어에서 표현되는 기본 자료형으로 구성한다.)
Abstract Data Type(ADT) - 자연수 예시
- 겍체 : 0 ~ MAX_INT 정수의 정렬된 범위
- 연산자 : 자연수 - Zero() / Boolean - Is_Zero() / 자연수 Add(x, y) 등