블로그 이미지
기록 형식의 블로그입니다. 이브시나

카테고리

분류 전체보기 (6)
Programming Language (4)
PlayGame (0)
DataStruct (2)
OS (0)
Total
Today
Yesterday

달력

« » 2025.8
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

공지사항

최근에 올라온 글

'DataStruct'에 해당되는 글 2건

  1. 2011.11.07 순환
  2. 2011.11.07 자료구조 기본 정의

순환

DataStruct / 2011. 11. 7. 15:34

순환의 정의

- 순환이란 어떤 알고리즘이나 함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법. 


순환의 예

- 팩토리얼을 구하는 문제를 예로 설명 


 위의 그림을 보면 알 수 있듯이 n 팩토리얼을 구하기 위해서는 n=0이 아닌 이상 (n-1)!이 사용 된다. 이러한 정의를 순환적이라고 할 수 있다. 순환 알고리즘은 자기 자신을 순환적으로 호출하는 부분과 순환 호출을 멈추는 부분으로 구성되어 있다. 만약 순환 호출을 멈추는 부분이 없다면 시스템 스택을 다 사용할 때까지 순환적으로 호출되다가 결국 에러를 내면서 멈출 것이다. 만약 위 그림 중 순환을 멈추는 부분이 없다면 시스템 스택을 다 사용할 때까지 순환적으로 호출되다가 결국 에러를 내면서 멈출 것이다.

 factorial(3)을 호출하였을 경우에 위의 프로그램에서 함수가 호출 되는 순서를 살펴보면,

 factorial(3)을 수행하는 도중에 factorial(2)를 호출하게 되고 factorial(2)는 다시 factorial(1)을 호출하게 된다. factorial(1)은 파라미터 n이 1이므로 if 문이 참이 되고 더 이상 순환 호출 없이 1을 리턴하게 된다. 이 리턴 값 1은 factorial(2)로 전달되고 factorial(2)는 여기에 2를 곱한 값인 2를 factorial(3)으로 전달한다. 마지막으로 리턴 값을 받은 factorial(3)은 이 값에 3을 곱하여 6을 반환한다. 그림으로 살펴보면 아래와 같다.


 프로그래밍 언어에서 하나의 함수가 자기 자신을 다시 호출하는 것은 다른 함수를 호출하는 것과 동일하다. 즉 복귀주소가 시스템 스택에 저장되고 호출되는 함수를 위한 파라미터와 지역 변수를 스택으로부터 할당받는다. 이러한 함수를 위한 시스템 스택에서의 공간을 활성 레코드라 한다. 이러한 준비가 끝나면 호출된 함수의 코드의 시작 위치로 점프하게 되는 것이다. 호출된 함수가 끝나게 되면 시스템 스택에서 복귀 주소를 추출하여 호출한 함수로 되돌아가게 된다. 위 그림은 main()에서 factorial()을 호출하였을 때의 시스템 스택을 나타낸다. factorial()안에서 다시 factorial()이 호출되면 시스템 스택은 위와 같은 모양으로 쌓이게 된다.


순환과 반복

- 순환 : 자기 자신을 호출하여 문제를 해결.

- 반복 : for나 while등의 반복구조를 사용하여 반복시켜 문제를 해결.

- 프로그래밍 언어에서 되풀이하는 방법에는 반복과 순환이 있다. 반복이 많은 경우, 간편하고 효율적으로 되풀이를 구현할 수 있다. 하지만 반복을 사용하게 되면 지나치게 복잡해지는 문제들도 존재한다. 이런 경우에는 순환이 매우 좋은 해결책이 될 수 있다. 일반적으로 순환은 함수 호출을 하게 되므로 반복에 비해 수행속도 면에서는 떨어진다.


'DataStruct' 카테고리의 다른 글

자료구조 기본 정의  (0) 2011.11.07
Posted by 이브시나
, |

자료구조 기본 정의

DataStruct / 2011. 11. 7. 15:28


 자료구조의 중요성 혹은 필요성을 건물 건축의 비유를 통해 살펴보자.

 좌측과 같이 장난감집을 만들때는 머리속의 계획만으로도 건물을 짓는데 큰 상관이 없고 심각한 문제가 발생할 경우라도 걱정할 필요가 없다.(투입된 재료등의 비용이 높지 않아서) 하지만 우측과 같은 크고 고급스러운 집을 만든다면 머리속의 계획만으로는 건축할 수 없을 것이다.

 자료구조는 컴퓨터 프로그래밍에 잇어서 가장 기초적인 학문분야로 인식 되고 있다. 높은 건물을 짓기 전에 필요한 기초 공사와 마찬가지로 컴퓨터 프로그램이 효율적이고 안전하게 동작하기 위해서 반드시 필요한 프로그램의 기본 골격에 해당한다고 볼 수 있다.

 

 
 자료구조는 컴퓨터 프로그램을 구현하기 위해 연구된 것.


 하나의 프로그램이 정상적으로 동작하려면, 내부적으로 자료(데이터)를 저장하고 있을 뿐 아니라 이러한 자료를 처리하기 위한 명령어들의 집합을 가지고 있어야 된다.(위 그림) 위 그림은 하나의 프로그램이 자료(data)를 처리하기 위한 명령의 집합으로 구성되어 있을을 보여준다.

 여기서 자료구조는 컴퓨터에 자료를 효율적으로 저장하는 방식을 말한다.(정의)
 

 효율적인 자료구조는 컴퓨터의 메모리를 절약할 뿐만 아니라 프로그램 수행 시간을 최소화 하는 기능 수행 – 반대로 비효율적인 자료 구조는 불필요한 저장 공간필요와 느려짐

 컴퓨터 명령 자체의 효율성을 증가 시키기 위한 절차(방법)를 보통 알고리즘이라 하고 효율적인 알고리즘이 가능하기 위해서는 먼저 효율적인 자료 구조가 선행 되어야 한다. 

 


 프로그램에서 자료를 저장하는 자료를 그 형태에 따라 분류하면 크게 단순구조, 선형구조, 비선형구조, 파일구조 로 나눌수 있다.

 단순구조 – 정수, 실수, 문자, 문자열 같이 프로그래밍 언어에서 제공하는 기본적인 데이터 타입 (일반적인 자료구조라 하면 단순구조보다는 단순구조를 활용하여 만든 선형, 비선형 구조를 말한다) 

 

1. Linear


 선형 구조는 각각의 자료들 사이의 앞뒤 관계가 1:1인 경우를 말하며 리스트, 스택, 큐, 덱 등이 대표적이다. 선형 구조는 저장된 자료들 사이의 관계가 다음 그림과 같이 선형으로 연결되어 있다. 


2. Non - Linear

 비선형구조는 각각의 자료들 사이의 앞뒤 관계가 1:1이 아닌 계층 구조 혹은 망 구조를 가지는 경우를 말하며 트리와 그래프 등이 대표적이다. (1:2 OR 2:1관계)


3. 파일 구조

 파일 구조는 보조기억장치(하드)에 저장되는 파일에 대한 자료 구조를 말한다. 선형, 비선형 자료구조가 컴퓨터 메모리상에 저장된다는 가정에 의한 것이라면 파일 구조는 메모리가 아닌 디스크에 저장된다는 가정에 기반을 둔 것으로, 주로 메모리에 한 번에 올릴수 없는 대용량 자료들을 대상으로 한다. 파일의 구성 방식에 따라 순차적 파일 구조, 상대적 파일 구조, 색인 파일 구조, 다중 키 파일 구조 등이 있다.  



Algorithm

 만약 주어진 문제를 해결하기 위해 제시된 함수(절차)가 다음과 같은 5가지 특성을 만족하지 않는다면 그 함수는 알고리즘이 될 수 없다.

  1. 입력 : 외부에서 제공되는 자료가 0개 이상 있어야 한다.
  2. 출력 : 적어도 1개 이상의 결과를 만들어야 한다.
  3. 명백성 : 각 명령어는 의미가 모호하지 않고 명확해야 한다.
  4. 유한성 : 한정된 수의 단계 뒤에는 반드시 종료 된다. 무한히 동작해서는 안 된다.
  5. 유효성 : 모든 명령은 실행 가능한 연산이어야 한다. 예를 들어 0으로 나누는 연산이 포함되서는 안된다.
 이렇게 알고리즘을 설명한 이유는 자료구조와 밀접한 관련이 있기 때문이다. 같은 자료라 하더라도 어떻게 표현되고 저장되는냐에 따라 사용 가능한 알고리즘이 달라지기 때문에 효율적인 자료구조의 설계는 알고리즘의 설계에 영향을 끼쳐 프로그램의 성능을 결정짓게 하는 가장 중요한 요인 중 하나가 된다. 


시간복잡도

- 알고리즘을 이루는 연산(산술, 대입, 비교 등)들이 몇 번이나 수행 되는지를 숫자로 표시 하는 것. 즉, 알고리즘의 수행 시간 분석 !!!

- 시간 복잡도 함수란 연산의 수를 입력의 개수 n의 함수로 나타낸 것. T(n)

- 만약 동일한 조건에서, 똑같은 일을 하는데 한 쪽은 20개의 연산을 수행하고, 한쪽은 100개의 연산을 수행한다고 가정하였을 때, 당연히 연산의 수가 적은(20개의 연산) 것이 더 효율적인 알고리즘이라고 할 수 있는데, 이것이 바로 시간 복잡도 방법의 기본 개념이라고 할 수 있다. 




 연산의 개수를 이용하여 알고리즘을 비교한 결과를 통하여 가장 효율적인 알고리즘을 선택 할 수 있다. 우리가 작성한 표를 보면 n도 있고, n의 제곱도 있는 것을 볼 수 있다.




 위의 그림을 보게 되면 알 수 있겠지만 자료의 개수가 많을수록, 차수가 가장 큰 항이 가장 영향을 크게 준다는 것을 볼 수 있다. 그러므로, 차수가 가장 큰 항을 제외한 나머지 다른 항들은 상대적으로 무시해도 무마하다.


 다음으로 알아볼 것은 시간복잡도를 표시하는 방법 중 하나인 빅오 표기법이다. 빅오표기법 뿐만아니라 빅오메가와 빅세타 기법도 있긴 하지만 대부분 사용하는 시간 복잡도의 표기법이 빅오표기법이다. 이러한 표기법들은 불필요한 정보를 제거하여 알고리즘 분석을 쉽게 할 목적으로 시간 복잡도를 표시하기 위해 만들어 졌다.

- O(n)이라고 표시하고, 빅오 of n이라고 읽는다.

빅오표기법의 방법은

1. 다항식의 경우 최고차항만을 남기고 다른 항들과 상수항을 버린다.

2. 최고차항의 계수도 버리고 단지 최고차항의 차수만을 사용한다.

3. 단, log n 의 경우 없애버리면 안된다.
  

 예를 들어, 시간복잡도 함수가 2n^2 + 3n + 1 이라고 할 때, 빅오 표기법의 방법을 이용하면 O(n^2)이라는 결과를 얻을 수 있다.

 다음은 많이 쓰이는 빅오 표기법을 순서대로 표시한 것이다.

- O(1) : 상수형

- O(lon n) : 로그형

- O(n) : 선형

- O(nlong n) : 선형로그형

- O(n^2) : 2차형

- O(n^3) : 3차형

- O(2^n) : 지수형

- O(n!) : 팩토리얼형
 

그렇다면 이러한 성능 분석이 필요한 이유는 무엇일까?

 요즘의 컴퓨터는 예전의 컴퓨터에 비하여 엄청난 계산속도와 방대한 메모리를 자랑하고 있으며 또한 계속하여 발전을 거듭하고 있다. 그러나 아무리 컴퓨터의 성능이 좋아지고 있다고 하나 여전히 프로그램의 효율성은 중요하게 여겨진다. 첫 번째 이유는 최근 상용 프로그램의 규모가 이전에 비해서는 엄청나게 커지고 있기 때문에 즉, 처리해야할 자료의 양이 많아 지므로 알고리즘의 효율성이 더욱 중요하게 된다. 입력 자료의 양이 적은 경우에는 무시해도 상관없겠지만 자료의 양이 많아지면 많아질수록 그 차이도 더욱 커지게 된다. 두 번째 이유는 사용자들 또한 프로그램의 더 빠른 성능을 요구 한다는 것이다. 결과적으로 사전 프로그래밍 계획에 있어서 이러한 성능 분석을 구하는 일은 매우 중요하다.

'DataStruct' 카테고리의 다른 글

순환  (0) 2011.11.07
Posted by 이브시나
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함