안녕하세요!

FE 개발자 유진주입니다.

CS/자료구조

Data Structures 1. Introduction

ypearl 2022. 12. 26. 16:57

Computer System

# Computer System

- 소프트웨어(알고리즘과 데이터)와 하드웨어

* 알고리즘: 문제를 해결하기 위한 절차들

  데이터: 측정한 값들의 집합

 

# Definition

- 자료구조(Data Structures)란?

문제를 해결하기 위해 대량의 데이터를 효율적으로 처리하고 구성하는 방법 또는 구조

 

- 선형(리스트, 스택, 큐, 데큐) / 비선형(트리, 그래프) / 고급DS(BST, Weight networks)

  / 탐색, 정렬, 해싱 알고리즘 등을 배운다.

 

 

# Algorithm

- 특정 작업을 수행하기 위한 유한한 명령의 집합

 

- Criteria <알고리즘의 조건>

a. Input(입력): 명시적 입력(키보드, 파일 등)은 필요x (*묵시적 입력: 코드 상에서 주어지는 범위)

b. Output(출력): 적어도 하나 이상의 출력 필요

c. Definiteness(명확성): 구체적이고 모호하지 않아야 함

d. Finiteness(유한성): 유한한 수의 명령어. 프로그램이 종료되어야 함

e. Effectiveness(효과성): 불필요한 명령어 없이, 효율적으로

 

- Description <표현>

의사코드(pseudo code), 플로우 차트(flow chart)       *flow chart는 복잡할 경우 나열하기 힘듦. 간단한 알고리즘에 사용!

자연어, 프로그래밍 언어

 

 

# System Life Cycle

System Life Cycle

1. 요구사항(requirement): 개발하려는 소프트웨어의 목표 정의

사용 환경(platform), 기능(function),  입출력, 사용자 인터페이스(interface) 등

 

2. 분석(analysis): 구체적인 세부 문제들로 분할

- Devide and Conquer strategy <쪼개서  정복하는 전략>

Top-down approach(하향식): 프로그램-> 서브루틴 -> 명령어

Bottom-up approach(상향식): 하향식의 반대.

 

3. 설계(design): 각 모듈에 대한 객체와 함수 정의

4. 구현(implementation): 객체와 알고리즘을 실행가능한 코드로 만드는 코딩 과정

5. 검증(verification): 오류가 없는지 확인

- Program test

Black-box test (내부는 x) & White-box test (내부까지 o)

Program test

 

 

# Fibonacci Numbers

피보나치 수열 함수
출력 코드+결과 화면

# Prime Numbers 소수 찾기

소수 찾기 코드
출력 결과

 

 

# Data Types

Built-in data types(내장형) / Abstract data type(추상 자료형)

 

# Abstract Data Type (ADT) 추상자료형

- Object data type = 객체

속성(attributes, 멤버 변수)과 메소드(methods, 멤버 함수)

ex) 학생(틀)~ object, 홍길동(개별화)~ instance

 

- OOPL(Object Orient Programming Language) 예

: C++, C#, Java, Python

 

 

# Fraction 분수 (ADT 예제) * 컴퓨터는 정수, 실수(소수) 연산만 가능. 분수의 연산을 위해서는 별도의 처리를 해주어야 함.

- Numerator(분자), Denominator(분모)

- Addition, Multiplication, DecToFraction, Abbreviation (gcd(x,y))

 

# Performance Analysis 성능평가

- Qualitative Criteria 정성적 분석

- Quantitative Criteria 정량적 분석

   ㄴ Space complexity 공간복잡도: 프로그램이 실행을 완료하는 데 필요한 메모리 사이즈

   ㄴ Time complexity 시간복잡도: 프로그램이 실행을 완료하는 데 걸리는 시간

 

참고 <알고리즘 복잡도 계산이 필요한 이유?>

: 하나의 문제를 푸는 알고리즘은 다양할 수 있다.

이때, 다양한 알고리즘 중 어떤 알고리즘이 더 좋은지를 분석하기 위해, 복잡도를 정의하고 계산하게 된다.

 

# Space complexity 공간복잡도

S = Sc +Sv   // 고정은 무시하고 가변만 고려!

Space complexity

 

- 배열처리 방식 (크게 2가지)

◎ call by value * 비효율적이므로 최근 언어들은 이 방법을 잘 쓰지 x

  - 배열 요소가 기능에 복사됨
  - 배열 사이즈에 비례하여 추가 메모리 공간이 필요

  - Sv(sum) = n

call by reference * 원본 이외에 추가적 필요 x => Sv=0

  - 배열의 기본 주소가 함수에 전달됨

  - 추가 메모리 공간 필요 없음

  - Sv(sum) = 0

 

# Time complexity 시간복잡도

T = Tc +Te   // 컴파일 타임은 안전하기에, 실행 시간만 고려하면 됨!

- 실행시간(Execution time)은 컴퓨터 환경에 따라 변화하기에, 물리적 시간을 재는 것은 의미가 없다.

=> 따라서, 명령어의 갯수를 센다!

 

<표 작성하기>

Steps * Frequency = Total steps

- 알고리즘 시간 복잡도의 주요 요소는 반복문이다!

(입력의 크기가 커지면 커질수록 반복문이 알고리즘 수행 시간을 지배함)

 

<알고리즘 성능 표기법 3가지> "시간 복잡도 계산은 반복문이 핵심 요소임을 인지하고, 계산 표기는 최상, 평균, 최악 중, 최악의 시간인 Big-O 표기법을 중심으로 익히면 된다"

# Big O(빅-오) Notatio: n이 매우 커질 경우 최고차항만 표기!

- 최악의 실행 시간을 표기 (적어도 이것보단 빠르다!)

- 가장 많이/일반적으로 사용함

- 아무리 최악의 상황이더라도, 이 정도의 성능은 보장한다는 의미.

- 점근적 상한선

Big O Notation

※<주의> 빨리 증가한다 ≠ 수행시간이 빠르다 (반대 개념!)

ex) O(n^2) 와 O(n) 중 빠른 건 O(n)이고, 수행시간이 긴 건 O(n^2)

증가속도와 수행속도 개념 혼동 주의!

 

 

 

"Big-O Notation은 상한선 의미" ~ 이것보다는 적게 걸린다.

- 주어진 함수 f(n)은 n0보다 큰 범위에서 c*g(n)보다 작다. => 상한선 존재 시, Big-O로 표기 가능.

EX.

f(n) = n^2 + n ≤ n^2 + n^2 = 2n^2 ≤ 2g(n) = O(n^2)

f(n) = 2n2 + n ≤ 2n^2 + n^2 = 3n^2 ≤ 3g(n) = O(n^2)

 

~ c와 n0 구해라. 하지만, 답은 여러 개일 수도 있다. 이때는 f(n)과 좀 더 가까운 것이 좋다.(물론 애매한 경우도 O)

   예를 들어, 위 슬라이드의 4번째 예시처럼 3n^2와 4n 둘 다 가능한 예제가 있다. 이 경우, 그래프를 그려 둘 중 어떤 것이

   f(n)과 가까운 지 판단하면 된다.

 

# Big-Omega(오메가 Ω) Notation: 하한선 ~ 적어도 이 이상은 걸린다.

- 알고리즘 최상의 실행 시간을 표기

- 점근적 하한선

 

# Big-Theta(세타 Θ) Notation

: 아래 그래프와 같이 상한선, 하한선을 구해,

  f(n)은 상한선보다는 적게, 하한선보다는 많은 시간이 걸린다고 표현할 수 있다.

- 알고리즘 평균 실행 시간을 표기

- 점근적 상한선과 점근적 하한선의 교집합

 

# Time complexity Class

<O 표기법>

: O(1) < O(logn) < O(n) < O(n) < O() < O() < O(n!)

* 입력 n 의 크기에 따라 기하급수적으로 시간 복잡도가 늘어날 수 있다.

Time complexity Class
후자의 경우, n이 커지면 못 쓴다.

 

'CS > 자료구조' 카테고리의 다른 글

Data Structures 2. Python Data Type  (0) 2022.12.29