2019년 7월 25일 목요일

[독학사] 자료구조 내용정리 4편 (스택, 큐)



스택(Stack)이란



한 끝에서 삭제와 삽입이 이루어지는 순서 리스트를 뜻하며 삭제와 삽입이 이루어지는 부분을 TOP이라고 한다.

수식으로는 S = (a0, a1, ... an)으로 표현하며 오른쪽에 있을수록 윗쪽에 있는 원소로 표현되며 TOP이된다.

제일 나중에 들어온 원소가 제일 먼저 삭제되기 때문에 후입선출(Last In First Out)구조하고도 부른다.

Top Pointer에서 삭제는 POP 연산이라 하고, 삽입은 PUSH 연산이라고 표현한다.

삽입과 삭제 구조가 간단함으로 어떤 내용을 기억시켰다가 다시 신속히 사용할때 많이 사용되어 컴퓨터 알고리즘에 중요한 자료구조이다.




시스템 스택



운영체제에 기본적으로 구현된 스택을 시스템 스택이라고 부른다.

시스템 스택은 프로그램의 레지스터 크기와 일치하며 (32bit 컴터면 4byte 길이) 내부는 함수나 서브프로그램이 호출되어 호출된 지역변수와 매개변수, 함수 수행 후 복귀할 주소들이 담겨져 있다.

함수 호출 시 프로그램은 함수에 대한 스택을 생성하고 함수를 실행한 뒤 복귀한 주소를 만들어 시스템 스택 Top에 PUSH를 한다.

만약에 해당 함수가 다른 함수를 호출하는 경우에는 필요한 지역 변수와 함께 새롭게 호출한 함수의 스택과 실행 후 복귀할 주소를 함께 생성하여 시스템 스택에 PUSH를 한다.

예)
함수가 실행될 때 : 함수 실행 - 함수스택 + 복귀 주소 생성 - 시스탬 스택에 저장.
내부에서 다른 함수를 실행 할 때 : 함수 스택 + 복귀 주소와 호출한 함수의 스택 + 복귀주소 + 지역변수 몽땅 시스탬 스택에 저장.

자기자신을 호출하는 순환 호출이라도 각 호출에 대한 스택을 따로 만들어 계속 쌓기 때문에 무한 반복되는 경우엔 메모리를 초과할 가능성이 있다.




스택 추상화



스택의 추상화 자료구조 표현은 일자원 배열 표현법을 사용하여 stack[N]으로 표현한다.
여기서 N은 스택이 허용할 수 있는 최대 엔트리 수이며 0부터 시작한다.
스택의 초기 상태는 빈 공간임으로 top pointer는 -1로 표현하며 공백 스택이라고 부른다.




POP, PUSH



스택의 삽입과 삭제는 스택의 크기가 제일 큰 고려사항이다 이를 위해선 가장 마지막 윈소의 위치를 나타내는 top pointer를 기준으로 여분 공간 크기를 파악한 후 연산 유무를 결정한다.

할당 공간이 가득차서 더이상의 원소 삽입이 불가능한 경우를 오버플로우라고 부른다.

삽입이 가능할 경우엔 top pointer를 증가 시킨 후 해당 위치에 원소를 저장한다.
삭제의 경우엔 top pointer의 원소를 삭제한 후 top pointer를 감소 시킨다.

스택의 원소가 하나도 없어서 삭제 연산이 불가능한 경우를 언더플로우라고 부른다.

삽입시엔 오버플로우검사, 삭제시엔 언더플로우 검사를 먼저 진행 후 해당 연산을 진행함.




적용 분야



순서대로 적재됨과 후위 선출의 특성을 살린 분야로

위에서 언급한 시스템 스택과 같은 복귀 주소를 저장하는 경우나
함수 순서 제어
중위 표기식을 후위 표기식으로 변환할때
후위 표기법의 산술식 연산
0-주소지정방식 명령어의 자료 저장소
재귀 프로그램 순서 제어
컴파일러 언어 번역 등에 사용된다.




큐(Queue)란?



출구와 입구가 하나인 스택과 달리 전용 출구와 전용 입구 모두를 보유한 순서 리스트를 의미한다.

가장 먼저 삽입된 원소가 가장 먼저 삭제됨으로 선입선출 (First In First Out)이라고 한다.

가장 최근에 삽입된 위치를 가르키는 포인트를 rear라고 부르며, 윈소중 가장 오래된 원소의 위치를 가르키는 포인트는 front라고 한다.

큐가 처음 생성되고 원소가 없는 초기 상태일땐 rear와 front 모두 -1로 표현하며, rear와 front가 동일한 경우는 공백, rear = n-1일 경우엔 가득찬 상태로 표현된다.

스택이 연산시 오버,언더 플로우를 검사했듯 큐또한 연산시 rear와 front의 값으로 오버,언더플로우 검사를 진행한다.

큐 삽입 과정은 rear가 n-1인지 확인하고 동일하면 가득찬 상태, 아니면 rear + 1를 하고 원소 저장을 하고, 큐 삭제는 front가 rear와 비교해 동일하면 공백 상태, 아니면 front + 1를 하고 원소를 삭제한다.




원형 큐



큐의 가장 보편적인 이용 방법으로 운영체제에 의한 작업 큐 관리 방식에 대표적으로 사용된다.

일반 선형 리스트일 경우엔 큐 삽입과 삭제를 반복하다보면 rear와 front값은 계속 증가하여 나중에는 큐의 내부는 공백이지만 주소값이 포화 상태가 되어 사용이 불가능한 경우가 발생한다.
이럴 경우에 전체 큐를 감소 시켜 공백만큼 rear와 front값을 줄여야 하는데 선형일 경우 시간이 많이 걸리지만 원형일 경우엔 공백을 초기화 하는데 큰 부담이 없어진다.

원형 큐에선 rear와 front값은 0이 초기값이며 front는 첫번째 원소보다 시계 반대 방향으로 하나 앞의 위치를 지정한다.

rear = front일 경우 공백이며 삽입 위치는 rear = (rear+1) mod n으로 결정되며 삭제 위치는 front = (front+1) mod n으로 한다.

mod 연산은 나누기를 한 뒤 나머지 값을 의미한다.

(선형과 원형 큐 상태 비교)
공백일 경우 둘다 rear == front

선형의 포화는 rear = n-1 (최근 삽입 위치가 한계 위치)
원형의 포화는 front = (rear+1) mod n (새로 삽입할 위치가 삭제 위치와 같음)

선형의 삽입 위치는 rear = rear + 1 (최근 삽입 위치 다음 위치)
원형의 삽입 위치는 rear = (rear+1) mod n (최근 삽입 위치 다음 위치)

선형의 삭제 위치는 front = front + 1 (최근 삭제 위치 다음 위치)
원형의 삭제 위치는 front = (front+1) mod n (최근 삭제 위치 다음 위치)




적용 분야



원형 큐를 활용한 끊이지 않는 구조의 장점과 선입 선출의 장점으로 반드시 순서대로 실행과 종료를 관리해야할 분야에서 많이 사용된다.

대표적인게 순서가 핵심인 작업 버퍼나 프로세스 스케줄링이다.

프로그램들이 프린터보단 작업 속도가 빠르니 프린터 작업을 프로그램들이 큐에 던져두면 프린터가 큐의 순서대로 작업하도록 하는 방식으로 사용되는 예.




데크(Deque)란?



원소의 삽입과 삭제가 양방향 모두 일어나는 리스트로 스택과 큐가 결합된 구조이다.

이름부터 Double Ended Queue로 스택과 큐의 장점을 취해 구성되었다고 한다.

데크는 양쪽에서 삽입 삭제 모두 이루어짐으로 큐와 같이 두개의 포인터를 가지는데 둘 다 삽입 삭제를 하다보니 관리에 어려움이 있어서 어느 한쪽에는 삽입이나 삭제 하나만 되도록 제한을 두는 제한 데크로 운영된다.

한쪽에 삽입 제한을 두어 삽입은 한 곳에서만 되도록 한 데크는 입력 제한 데크, 또는 스크롤이라고 부르며, 삭제 제한을 두어 한 곳에서만 삭제가 되는 데크는 출력 제한 데크, 또는 셀프라고 부른다.




스택을 통한 수식 계산법



연산자 우선순위를 기준으로 수식 표기법인 전위, 중위, 후위에 따른 계산법.

연산자의 우선순위는 연산의 순서를 결정하는 기준이며 일반적으로 C언어 기준을 따른다.

우선 순위는
1. 괄호 (), []
2. 단항식 ++,--
3. 승제 *, /
4. 가감 +,-
5. 시프트 <<,>>
6. 비교식 <,>
7. 등가 ==, !=
8. 비트 &,^,|
9. 논리 &&, ||
10. 조건 ?
11. 대입 +=, -=
12. 콤마 ,
로 나열되며 같은 우선 순위일 경우 왼쪽이 우선 순위를 가진다.

표기법은 연산자를 기준으로 표기 순서를 정하는 것으로 (A+B 를 기준으로)

전위 표기 : 연산자가 피연산자 앞. (+AB)
중위 표기 : 연산자가 피연산자 사이. (A+B)
후위 표기 : 연산자가 피연산자 위. (AB+)
로 표기하는 방식을 의미한다.

따라서 기존에 수식을 표기하던 표준 방식은 중위 표기를 따른것이다.

사람은 중위 표기법이 익숙하지만 컴파일러의 경우 효율이 떨어지기 때문에 컴파일러 기준으론 후위 표기법에 괄호를 사용하지 않는다.

후위 표기법으로 스택에 저장하면 피연산자를 차례로 저장하고 연산이 나오면 모두 합쳐 연산 하여 한 자리에 저장하는 과정을 반복하기 때문에 항상 top pointer를 유지하여 연산이 가능하다.

이를 위해 후위 연산법으로 변환 과정을 알아둬야 한다.

중위 -> 후위 표기법 변환 과정

0. 각 연산자별 우선순위에 따라 괄호 표시
1. 왼쪽 괄호 무시
2. 피연산자이면 바로 출력
3. 연산자면 스택에 삽입
4. 오른쪽 괄호가 나오면 스택에서 연산자 출력
5. 출력된 값이 없을 경우 스택이 공백이 될때까지 출력
6. 괄호 모두 읽으면 완료

중위 -> 후위 표기법 변환 예)

중위 : A / B * C - D * (E + F)

1. 연산자 우선순위에 따라 괄호 표시 : (((A / B) * C) - (D * (E + F)))
2. 연산자 우선순위 하나씩 변환
(A / B) -> AB/
AB/ * C -> AB/C*
(E + F) -> EF+
D * EF+ -> DEF+*
AB/C* - DEF+* -> AB/C*DEF+*-

3 결과 : AB/C*DEF+*-




다중 스택 & 큐



다중 스택이란



둘 이상의 스택을 하나의 스택 공간으로 표현한걸 말한다.

예를 들어 두개의 스택을 표현할땐 스택의 최하단 최상단을 각각 하위 스택들의 top pointer로 지정하여 중간 지점에서 만나도록 지정을 한다.

이럴 경우 스택의 포화 지점은 top1 = top2가 된다.

이런식으로 하면 다중의 스택을 하나의 스택 공간에 사용하여 공간 효율을 증가 시키는 장점이 있음.

N개의 다중 스택을 하나의 스택에서 구현할 경우 당연히 공간 분할도 N개로 나누어 각 스택을 배당한다.

다중 스택의 가장 첫 공간을 B[i]로 표현하며 Top은 T[i]으로 표현한다. (Bottom, Top)
따라서 B[i] == T[i+1]일 경우에는 i번째 스택은 포화 상태를 의미 하고, B[i] == T[i]일 경우에는 공백 상태를 의미함.

이 수식은 n개의 스택이 구현된 다중 스택에서 i번째 스택에 원소를 삽입할때 오버플로우 검사와 i번째 스택에 원소 삭제시 언어플로우 검사에 사용된다.



그 외 (진도와는 상관없는 용어나 설명)

서브루틴은 주로 조건문이나 반복문에서 조건에 맞을 경우 실행할 로직 부분을 부르는거 같음..

예)
if (조건) then
 서브루틴
else
 또다른 서브루틴

이런식
Share:

2019년 7월 17일 수요일

[독학사] 자료구조 내용정리 3편 (배열)



배열(Array)이란



같은 자료형에 같은 크기를 가진 원소들을 순서를 정해 나열시킨 집합을 배열이라고 함.
원소들간 순서는 인덱스라고 부르고 참조의 기준도 된다.

배열을 만들어 관리할 경우 선언과 변수명을 반복해 정할 필요가 없어지고 관리와 사용성이 올라간다.

원소를 나열하는 순서의 갯수에 따라 ~차원 배열로 표현함 (2차원 배열 같은거)

언어에 따라 인덱스 시작 숫자가 다른데 C는 0부터 시작되고, 베이직이나 포트란은 1부터 시작한다.

C에서 배열 선언 예시)
- int intArray[3]; - 인트형 3개 배열 선언 (1차원)
- int intArray[2][2]; - 인트형 2개 1차원 배열이 2개 있는 배열 선언 (2차원)





다차원 배열



배열의 인덱스가 차원을 구분하는 기준.

1차원 배열
- 위의 int intArray[3];을 선언할 경우 3개의 메모리 공간을 할당 받고 4바이트씩 3개, 총 12바이트를 사용한다.

2차원 배열
- 두개의 인덱스가 존재하고 각각의 인덱스는 열과 행을 표현한다.
- 메모리의 공간은 행과 열의 우선순위에 따라 실제 순서가 결정된다.
([2][2] 배열일 경우 행우선으로 하면 [0][0] [0][1] [1][0] [1][1] 이런 순서로 저장되고, 열우선이면 [0][0] [1][0] [0][1] [1][1] 요런 순서로 저장)

3차원 배열
- 2차원 배열을 한 편으로 부르고 이 편들이 복수개로 저장되는 개념.
- 인덱스 순서는 [편][행][열]로 정의한다.
- 물리적 저장은 항상 편을 우선순위로 하며, 각 편들은 행,열 우선순위에 따라 다르게 저장된다.(2차원 배열 저장 참조)





리스트(LIST)란



- 리스트는 자료를 나열한 목록을 의미함.

- 나열한 원소들간 순서가 있을 경우 선형이나 순서 리스트라고 함.

- 배열과 같이 동일한 기억공간에 저장된 경우 선형(순서) 순차 리스트, 각각의 기억 공간을 가지고 위치를 알릴 포인터가 있을 경우 선형(순서) 연결 리스트라 한다.

(결론: 리스트는 배열의 개념을 포함한 더 큰 범위의 개념)

- 원소의 크기를 확실히 알수 없으니 크기 할당에 낭비나 어려움이 있음.

- 표현방법은 자료를 기준으로 할 경우 집합으로 하고 순서를 기준으로 할 경우엔 배열 방식을 따르며, 연결 리스트는 자료형 상황에 따라 맞춰 다르게 표현된다.

1. 집합형
- 표현식은 A = {원소1, 원소2, 원소3} 와 같음.
- 단순 집합임으로 원소간 순서는 없음.
- 순서가 없음으로 삽입 삭제가 간편하지만, 원소간 순서 나열이 어려움.

2. 배열형
- 순서를 가짐으로 선형, 순서 리스트라고 불림.
- 순서 특성을 따름으로 배열의 특성과 비슷함.
- 연속된 공간에 원소가 저장되어 삽입이나 삭제시 자리 이동이 많이 발생하는 단점.
- 리스트가 공간 할당에 어려움이 있지만 순서 덕분에 참조의 효율이 증가함.
- 자료가 n개일때 삽입시 평균 이동 횟수는 (n+1)/2이며, 삭제시엔 (n-1)/2이다.
- 자리 이동이 많더라도 이용 효율은 밀도가 1일때 가장 좋다고 한다.
- 삽입 연산시에 추가 공간이 필요함으로 공간 할당에 따라선 삽입 연산에 제한이 올 수 있음.

3. 연결 리스트
- 각각의 공간에 따로 저장되어 있음으로 삽입, 삭제 연산이 효율적.
- 구현 방법은 복잡.
- 할당 공간의 제한이 없음.
- 연산 시간 복잡도는 상수 시간만 존재.





배열 표현법 (C 기준)



- 각 원소의 크기는 자료형에 따라 결정된다.

- 각 원소의 위치는 시작 주소가 a일 때 a + (n * type) byte로 결정된다.
(n은 인덱스, type은 자료형 크기)
(int형 3개짜리 배열일 경우 각 원소의 주소는 a, a+4, a+8 바이트가 된다)

- 2차원 이상일 경우 행과 열의 우선순위에 따라 물리적 저장 순서가 결정된다.
(다차원 배열 중 2,3 차원 배열 참조)

- 2차원 배열 A[n1][n2]에서 A[i][j]의 주소값은
행우선시 a + (i*n2+j) * type
열우선시 a + (j*n1+i) * type
으로 계산된다.
(n은 인덱스, type은 자료형 크기)





희소 행렬



- 행렬의 표준 표현은 2차원 배열로 A[MAX_ROWS][MAX_COLS] 로 표현되고 보통 행은 i, 열은 j로 사용되어 원소를 가르키는 표현은 A[i][j]로 사용된다.

- 행과 열이 동일할 경우 정방 행렬이라 부른다.

- 행렬의 내용 중 빈 값이 있는 경우 희소 행렬이라 한다.

- 희소 행렬의 경우 원소값 추출을 통한 새로운 행렬을 만들어 표현하는게 일반적이다.

- 원소값 추출이란 행렬중 빈 값이 아닌 원소의 좌표를 모으는걸 의미한다.

- 원소값 추출을 통해 도출된 좌표는 <행 열 값>의 순서를 가지며 이 좌표로 새 2차원 행렬을 만들어 희소 행렬을 표현한다.

예시)
A[4][4]인 희소 행렬에 빈 값이 아닌 원소가 2개일 경우 원소값 추출을 하면
<2,1,9>, <3,3,2> 좌표 2개가 나오며
(2행 1열에 9값) (3행 3열에 2값)
희소 행렬의 상태를 표현할 좌표값 <4,4,2> (4행 4열의 행렬이며 빈 값이 아닌 원소 2개)
을 추가하여 최종적으로
[4 4 2]
[2 1 9]
[3 3 2] 와 같은 B[3][3] 행렬로 새롭게 표현되는걸 희소 행렬의 표현방식이다.

(결론은 그냥 빈 값 다 빼고 좌표로 행렬을 만들어 공간 낭비를 줄이는것)

- 공간 효율은 증가했으나 좌표값을 통한 값을 찾아 가는 과정이 필요함으로 연산 효율은 떨어진다.





전치 행렬



- 보수의 개념같이 행렬의 행과 열을 바꾸는것.

- A행렬의 전치 행렬은 A𝞣로 표현한다.

- a[2][3]의 전치 행렬은 b[3][2]

- 전치 행렬과 본래 행렬이 동일할 경우 대칭 행렬이라 부른다.

- 희소 행렬일 경우엔 빈 값은 전치 연산을 하지 않는다.

- 전치 연산 알고리즘 예시
for(i=0; i<=m-1; i++)
   for(j=0; j<=n-1; j++)
      b[j][i] = a[i][j];

- 시간 복잡도는 반복 수행 결과값과 같음으로 O(mn)이 된다.

Share:

2019년 7월 16일 화요일

[독학사] 자료구조 내용정리 2편 (기본개념)



자료 추상화



은닉성의 기본 개념인 추상화는 전체 내용 중 필요한 부분만 외부로 노출 시키고 나머지는 감추는걸 의미한다.

자료형에 추상화를 시키면 추상 자료형(ADT: Abstract Data Type)이라고 하며 추상 자료형은 객체와 연산만 정의하는걸 의미한다.

추상 자료형은 언어마다 형식과 지원되는 연산의 갯수가 차이남.

추상 자료형 예시) createStack(S) : S라는 공백 스택을 생성한다는 뜻.

C언어에서 추상 자료형은 사용자와 구현자의 구분이고, 객체지향 언어인 C++과 Java는 각각 ADT 타입으로 지원되며 각각 스택과 힙에 할당되는 차이점이 있다.

스택이란 일정한 갯수의 데이터를 가진 리스트의 일종이며 고유한 연산으론 CreateStack(), Push(), Pop(), isEmpty()와 같은 연산들이 존재함.

연산의 집합을 일컬을때 일반적으로 알고리즘이라고 하고 객체 지향에서는 메서드, C++에서는 멤버 함수라고 하낟.

데이터 집합을 일컬을때 일반적으로 자료구조라고 하고 객체 지향에서는 인스턴스, C++에서는 멤버 데이터라고 한다.





SPARKS (Structured Programming A Reasonably Komplete Set )



SPARKS란 알고리즘을 기술하는 언어이다.

알고리즘 기술에 필수인 선언, 지정, 조건, 입출력문을 정리함.

선언문 : 변수 선언에 쓰이는 문장이며 자료형을 사용한다.

지정문 : 변수나 결과값을 변수에 할당하는 문장.

조건문 : 조건에 따라 판단한 결과값에 따라 참, 거짓 두가지 경우로 나눠 수행 여부를 결정하는 문장.

CASE문 : 조건에 따라 결정되지만 결과값이 참, 거짓 두가지 경우가 아닌 특정 조건을 찾아 많은 경우로 분기가 가능한 문장. 중첩된 IF문과 기능은 동일.

반복문 : 특정 문장을 여러 번 수행할때 사용되는 문장.
반복문의 종류로는 for문, while~do문, repeat~until문이 있다.

Procedure문 : 프로그램을 기능이나 특정 기준에 따라 나누어진 단위를 프로시저나 모듈, 서브루틴, 함수, 매서드라고 부른다.

프로그램을 나누어서 얻는 장점은 추상화 적용이 가능해지고, 다수의 인원이 참여가 용이하고, 재사용성과 빠른 구조 파악이 있다.

테스트도 체계적으로 쉽게 할 수 있겠네.

프로시저 형식은 프로시저 이름 선언과 함께 필요한 매개변수 목록을 적으면 되고 반환값이 있을 경우 활용할 수 있게 지정문도 함께 활용한다.

Call문 : 프로시저들 간 자료 전달을 위해 사용되는 문장.

프로시저 내부에서 다른 프로시저를 호출하는 방식으로 사용

call by value = 값의 의한 호출로 함수를 호출할 때 실제 값을 매개변수로 넘기고 받는걸 의미한다
call by reference = 주소에 의한 호출로 함수를 호출할 때 해당 변수의 주소 값을 매개변수로 넘기거나 받는걸 의미한다.

값의 의한 호출을 할 경우 실제 값만 복사해서 주고 받으니깐 다른 프로시저의 결과에 따라 값에 영향을 받지 않게 하는게 가능하지만 참조에 의한 호출은 해당 주소를 넘기기 때문에 다른 프로시저의 결과에 따라 주소 값이 바뀜으로 값에 영향을 무조건 주게 된다.

입출력문 : Read와 Print문으로 입력과 출력을 담당하는 문장.





순환 알고리즘



알고리즘이 자기자신을 호출하여 반복하는걸 의미함.

자기자신을 직접 호출할 경우 직접 순환. 제 3의 함수를 호출하고 그곳에서 다시 원래 함수를 호출하는 형식을 간접 순환이라고 한다.

복잡한 문제를 부분으로 나눠 해결할때 많이 사용된다.

예) 팩토리얼 계산이나 피보나치 수열 구하는 알고리즘, 이진 탐색이 대표적





성능분석



문제를 해결하기 위해 알고리즘이 사용된 시간.
문제를 해결하기 위해 알고리즘이 사용한 메모리 양.

시간은 시간 복잡도로도 불리고, 메모리는 공간 복잡도로 불림.

공간 복잡도는 무조건 일정하게 사용되는 고정공간과 변수들의 사용에 따라 잠시 빌려 사용할 가변 공간 두가지로 구분되며 고정 공간은 변수나 상수를 위한 공간이고, 가변공간은 인스턴스가 필요로 하는 공간이다.

임의의 프로그램이 사용한 총 공간 요구량을 수식으로 나타내면

총 공간 요구량 S(P) = c + Sp(I) 로 표현된다.

c는 고정 공간이고, Sp(I)는 인스턴스 작업시 요구되는 공간.

시간 복잡도는 프로그램이 소요한 실행 시간과 컴파일 시간 모두를 합한 값으로 컴파일은 고정 공간과 유사하지만 한번만 수행되기 때문에 대부분 프로그램 실행 시간만 고려한다.

연산 시간을 표기하는 방법인 Bic-Oh, Bic-Omega, Bic-Theta는 수식이 어려워서 사실 이해를 하진 못했음;; 이거 계산하는 문제 나옴 다 틀리겠다...

Share:

2019년 7월 15일 월요일

[독학사] 자료구조 내용정리 1편 (기본개념)

독학학위제 컴퓨터과학부 4단계 전공 과목 중 자료구조 과목을 학습하며 정리한 내용을 작성한 포스트입니다.

국가평생교육진흥원에서 제공한 시험 영역을 기준으로 학습했습니다.



자료(Data)와 정보(Imformation).



자료는 현실에서 관찰이나 측정으로 수집한 결과 값이나 수치들을 의미하며 표현하는 방법은 논리값 (True, False)과 수치, 문자열 세가지로 구분된다.

수치 자료는 컴퓨터에서 2진수로 적용.
문자열 자료는 문자코드를 사용하여 숫자로 변환되어 컴퓨터에 적용.
(ASCII, BCD, EBCDIC 코드 들)
논리 자료는 가 부 값을 0 , 1로 변환하여 컴퓨터에 적용.

수치와 문자 자료는 표현 방식에 따라 값의 범위가 결정되어짐
(수치에서 부호의 포함여부 같은)

정보는 어떠한 현상이나 상황에 필요한 의사결정에 도움이 되는 자료의 해석이나 프로그램으로 처리된 결과 값을 의미한다.

정보는 시간에 따라 가치가 바뀌는 한시성을 가지거나, 많은 이들이 공유함으로써 가치가 상승하는 공공성이나, 소유한 개체가 적을수록 가치가 상승하는 독점성과, 사용 횟수에 가치가 변하지 않는 비소모성 네가지의 특성으로 구분한다.

특성들은 서로간에 모순점이 있으니 전부를 포함하긴 어려울듯 싶다.





자료구조(Data Structure)



자료구조란 자료를 더 사용하기 편하게 하기 위해 특성에 따라 분류한 구조체를 의미함.

구조체는 또한 그 자체가 컴퓨터에 저장되는 단위이자 방법이기 때문에 자료 구조를 파악하는건 자료의 특성과 저장 방식을 파악하는것과 동일한 의미이다.

자료구조의 분류는 다음과 같음

1. 단순 자료구조 : 정수나 실수 문자열 등 단일 형태의 자료를 저장할 때 메모리 공간과 자료를 다루는 연산자들의 모음.

2. 선형 자료구조 : 자료간 1:1로 짝을 맷는 형식 (리스트, 스택, 큐 같은거)의 자료를 저장할 때 메모리 공간과 자료를 다루는 연산자들의 모음.

3. 비선형 자료구조 : 자료간 1:N으로 대응되는 자료들 (트리나 그래프 등)를 저장할 때 메모리 공간과 자료를 다루는 연산자들의 모음.

4. 파일 : 메인메모리가 아닌 보조기억장치에 저장될 대용량 자료구조를 의미. 파일은 구성에 따라 인덱스, 해싱, 순차, 상대적 파일 구조로 구분된다.

자료를 저장하거나 정보로 만들기 위해선 자료를 적절한 자료구조로 저장하는게 우선이다.

자료구조는 자료의 크기, 사용 횟수나 방법, 관계 특성들을 고려하여 적절하게 선택되어야 한다.





알고리즘(Algorithm)



알고리즘이란 문제를 해결하기 위한 절차나 방법들을 단계로 구분하여 정의한 일정의 단계들이다.

알고리즘을 통하여 문제를 유한한 단계의 과정으로 풀어낼 수 있다.

알고리즘은 문제 해결을 위한 입력과 출력이 필요하며, 명령이 명확해야 하고, 무한한 단계를 거치지 않고 종료가 되어야 한다.

알고리즘의 요구 조건

1. 입력 : 문제 해결의 기본 자료가 될 입력값.
2. 출력 : 입력값을 알고리즘을 통해 도출된 결과 값.
3. 명확성 : 각 단계는 모호한 명령이 없어야 함.
4. 정확성 : 각 단계는 입력값에 대한 정확한 출력값을 도출해야함.
5. 유한성 : 무한 루프로 영원히 해결되지 않는 알고리즘이 되지 않아야함.
6. 효율성 : 알고리즘은 최대한 간소한 단계로 수행되어야 함.
7. 일반성 : 문제가 요구하는 모든 형태의 입력값에 대응 할 수 있어야 함.

자료 구조와 알고리즘이 결합, 조합되면 프로그램이 됨.

예)
배열 자료구조 + 최대값 찾는 알고리즘 = 순열중 최대값을 찾는 프로그램





알고리즘 기술 방법



1. 자연어
2. 순서도

자연어는 작성자의 의도와 다른 해석이 가능하여 알고리즘의 요구 조건 중 명확성을 위반할 가능성이 높으며, 순서도는 직관적이고 이해가 빠르지만 복잡한 단계의 표현이 어렵다는 단점이 있다.

그래도 모호한 내용보다는 복잡한게 더 낫기 때문에 둘 중에선 알고리즘은 순서로도 작성하는게 일반적이다.

(순서도 기호는 따로 정리하지 않음)

3. 의사 코드

자연어와 순서도의 장점을 섞은 방식으로 순서도를 매서드와 시켜 코딩하듯 나열하는 방법.
자연어보다 구조적인 표현이 가능하고 프로그래밍 언어로 변환이 용이한 장점이 있음.
순서도에 비해 매우 간단하게 표현이 가능.

(의사 코드를 따로 작성하진 않겠음)


Share: