- Shortest Path 문제를 풀기 위한 알고리즘

 * 구조
1. 모든 node의 dmin값을 V0부터 자신까지의 weight로 한다.
2. V0를 T에 넣고, T에 없는 node중 dmin값이 가장 작은 node를 u라 하고, u를 T에 추가.
3. T에 없는 모든 node의 dmin 값을 기존 값과 dmin(u) + g(u,w) 중에서 더 작은 값으로 보정.
4. T의 개수가 n이 될 때까지 2,3을 반복.

 * 증명
-  알고리즘이 SP문제를 정확히 풀어내는지 증명.

1. u가 T에 포함되어 있으면 dmin(u)는 global SP. ( = d(u) )
2. u가 T에 포함되어 있지 않으면 dmin(u)는 dt(u) ( T에 있는 node만 사용했을 때의 S.P)

1,2를 증명하기 위해, 수학적 귀납법 사용
base) 최초에 V0만 T에 포함되어 있을때, 1,2는 모두 성립한다.
step) T의 개수가 k 일 때 증명이 성립한다고 가정하자. 그리고 알고리즘이 T에 u를 추가하여 T'이 되었다고 하자.
- 추가되기 전의 dmin(u) = dt(u) 이다. ( 알고리즘이 dt가 아닌 dmin값을 설정하는 일이 없다.)
- dmin(u) = d(u) 이다. 즉, V0에서 u까지의 SP는 현재 T에 있는 node들 만으로 이루어져 있다.
-> 그렇지 않다면, V0와 u사이에 v라는 node가 존재한다. v는 T에 포함되지 않는 node이다.
d(u)는 dt(u)보다 작다. 그리고 dt(v)는 d(u)보다 작다. 
-> dt(u)보다 작은 dt(v)가 존재한다. 이것은 모순이다. (알고리즘은 u를 추가했으므로)
 따라서 알고리즘이 추가하는 u의 dmin(u)는 d(u)이다.
-> 1 성립.

- T'에 속하지 않는 node w를 고려해보자. 
- 알고리즘이 u를 추가하기 직전의 dmin(w) = dt(w)이다. (수학적귀납법 step과정에서 가정한 사실)
  u를 추가하고 나서는 dmin(w) = dt'(w)가 되어야 한다.
- dt'(w)는 dt(w)와 d(u) + g(u,w) 두 값중 하나로 보정된다. 
 1) dt'(w)가 dt(w)로 보정된다면, step에서 가정한 사실에 의해서 그대로 2가 성립한다. 
 2) dt'(w)가 d(u) + g(u,v)로 보정된다면, dmin(w) = dt(w)가 성립되기 위하여
V0에서 w까지의 SP에는 u가 포함되어 있어야 하며 특히 u는 w 바로 앞에 있어야 한다. 
즉, u와 w 사이에는 node가 없어야 한다. 
- 만약 u와 w사이에 x라는 node가 있다고 가정한다면, 
x는 T에 포함된 node이고 ( x가 T에 포함되지 않는 node는 고려할 필요가 없다. 여기서는 dt(w)를 증명하면 되기 때문)
x의 SP는 u를 포함하지 않는다.(u는 이번 단계에서 추가된 node이기 때문)
- 2)에서 dt'(w)가 d(u) + g(u,v)로 보정되었으므로, w의 SP에는 u가 포함되어야 한다. 여기서 모순이 생겼다.
- 따라서 u와 w사이에는 다른 node가 없다.
- 그래서 2)의 경우에도 2가 성립한다.

모든 경우에 2가 성립하므로 step은 참이다.

따라서 알고리즘은 정확히 동작함을 증명하였다.


'학부 전공 > 알고리즘' 카테고리의 다른 글

Selection  (0) 2010.10.29
Tape에 데이터 담기  (0) 2010.10.11
Job Scheduling  (0) 2010.10.08
Kruskal 알고리즘  (0) 2010.10.08
Prim 알고리즘  (0) 2010.10.07

Minimum Spanning Tree 문제를 풀기 위한 알고리즘.


 * 구조
1. 그래프의 각 node를 각각 하나의 node를 가진 tree로 만든다.
2. 모든 edge중 cycle을 만들지 않는 가장 작은 edge를 T에 추가한다.
3. 모든 edge를 볼 때까지 2를 반복한다.

(여기서 T는 edge의 집합이다.)

 * 증명
- 알고리즘이 MST문제를 정확히 풀어내는지 증명.
- 알고리즘이 만들어낸 tree가 Spanning tree인지 증명한 후, 그 tree가 minimum tree임을 증명.

1. Spanning tree를 만든다.
- T에 포함된 edge의 개수는 n-1보다 같거나 작다. ( node의 개수와 같거나 더 많으면 반드시 cycle이 생긴다. )
- weight가 적은 edge부터 cycle을 만들지 않는 모든 edge를 추가하므로, 연결되지 않은 node가 있을 수 없다.

2. Minimum tree가 된다.
- 정답이 하나라고 가정. (즉, 같은 비용인데 다른 edge를 가지고있는 정답이 없음.)
- 정답 tree를 만드는 edge의 집합을 Tmst라고 하면, 알고리즘의 모든 단계에서 T ⊂ Tmst 가 된다.
- 따라서 알고리즘이 종료되면 T = Tmst가 된다. ( 어떤 tree에 속한 tree인데 edge의 수가 같다면 두 tree는 동일한 tree이다.)

* 2번의 "알고리즘의 모든 단계에서 T ⊂ Tmst 가 된다."를 증명하기 위해, 수학적 귀납법 사용
base) 최초에 T는 공집합이다. 
step) 알고리즘이 T ⊂ Tmst 인 T에 edge인 e를 추가해서 T'가 됬다고 하자. ( T' = T ∪ {e} )
이 때 T' ⊂ Tmst가 된다.

* step의 " T' ⊂ Tmst "를 증명하기 위해, 귀류법 사용.
T'가 Tmst에 포함되지 않는다면, e 또한 Tmst에 포함되지 않는다.
( T와 T'의 차이는 e 뿐이므로 )
- Tmst ∪ {e} 는 cycle을 가진다. 
(왜냐하면 Tmst에 e를 추가하면 총 n개가 되기 때문이다. n개의 node에 n개의 edge를 가진 그래프는 cycle이 존재한다.)
- 그 cycle은 e를 포함하고 있지만, 그 cycle의 모든 edge가 T에 포함된 것은 아니다. (e는 알고리즘이 선택한 edge이기 때문에.)
- 만들어진 cycle중에서 T에 포함되지 않는 edge를 f라 하자. 
그리고 Tmst에서 f를 제거하고 e를 추가한 집합을 T''이라 하자.
- f는 e보다 weight가 더 크다.. 왜냐하면 알고리즘이 T에 e를 추가했기 때문이다.(알고리즘은 최소 weight를 가진 edge를 추가한다.)   
- 따라서 T''은 Tmst보다 더 작은 weight를 보유한 정답이다. 하지만 Tmst는 유일한 정답이다. 따라서 모순이 생겼다.

모순이 생겼으므로 가정은 거짓이다.
그래서 step의 T' ⊂ Tmst 는 참이다.

따라서 알고리즘은 정확히 동작함을 증명하였다.



'학부 전공 > 알고리즘' 카테고리의 다른 글

Selection  (0) 2010.10.29
Tape에 데이터 담기  (0) 2010.10.11
Job Scheduling  (0) 2010.10.08
Dijkstra 알고리즘  (0) 2010.10.08
Prim 알고리즘  (0) 2010.10.07

Minimum Spanning Tree 문제를 풀기 위한 알고리즘.


 * 구조
1. 최초에 하나의 node를 tree인 T에 추가.
2. 현재 tree에 인접한 edge중 가장 작은 가중치를 가진 edge를 T에 추가,(단, 그 edge는 사이클을 만들지 않음)
3. 모든 node를 추가할 때까지 2를 반복.

 * 증명
- 알고리즘이 MST문제를 정확히 풀어내는지 증명.
- 알고리즘이 만들어낸 tree가 Spanning tree인지 증명한 후, 그 tree가 minimum tree임을 증명.

1. Spanning tree를 만든다.
- 알고리즘은 매번 edge를 추가할 수 있다. (입력이 connected graph임을 가정했음)
- 알고리즘이 매번 edge를 추가할 때 마다, T는 tree임을 유지, 즉, tree의 정의 ( undirected, acyclic, connected graph )를 계속 만족함.

2. Minimum tree가 된다.
- 정답이 하나라고 가정. (즉, 같은 비용인데 다른 edge를 가지고있는 정답이 없음.)
- 정답 tree를 Tmst라고 하면, 알고리즘의 모든 단계에서 T ⊂ Tmst 가 된다.
- 따라서 알고리즘이 종료되면 T = Tmst가 된다. ( 어떤 tree에 속한 tree인데 edge의 수가 같다면 두 tree는 동일한 tree이다.)

* 2번의 "알고리즘의 모든 단계에서 T ⊂ Tmst 가 된다."를 증명하기 위해, 수학적 귀납법 사용
base) 최초에 T ⊂ Tmst 이다. (노드가 하나밖에 없으므로 포함관계 성립)
step) 알고리즘이 T에 edge인 uv를 추가해서 T'가 됬다고 하자. ( T' = T ∪ {uv} )
이 때 T' ⊂ Tmst가 된다.

* step의 " T' ⊂ Tmst "를 증명하기 위해, 귀류법 사용.
- T'가 Tmst에 포함되지 않는다면, uv 또한 Tmst에 포함되지 않는다.
( T와 T'의 차이는 uv 뿐이므로 )
- Tmst ∪ {uv} 는 cycle을 가진다. 
(왜냐하면 Tmst는 Spanning tree인데, 거기에 edge를 추가한 상황이기 때문에 반드시 cycle을 가지게 된다.)
- 그 cycle은 uv를 포함하고 있지만, 그 cycle의 모든 edge가 T에 포함된 것은 아니다. (uv는 알고리즘이 선택한 edge이기 때문에.)
- 만들어진 cycle중에서 T에 포함되지 않는 edge를 ab라 하자. 
그리고 Tmst에서 ab를 제거하고 uv를 추가한 tree를 T''이라 하자.
- ab는 uv보다 weight가 더 크다.. 왜냐하면 알고리즘이 T에 uv를 추가했기 때문이다.(알고리즘은 최소 weight를 가진 edge를 추가한다.)   
- 따라서 T''은 Tmst보다 더 작은 weight를 보유한 정답이다. 하지만 Tmst는 유일한 정답이다. 따라서 모순이 생겼다.

모순이 생겼으므로 가정은 거짓이다.
그래서 step의 T' ⊂ Tmst 는 참이다.

따라서 알고리즘은 정확히 동작함을 증명하였다.


'학부 전공 > 알고리즘' 카테고리의 다른 글

Selection  (0) 2010.10.29
Tape에 데이터 담기  (0) 2010.10.11
Job Scheduling  (0) 2010.10.08
Dijkstra 알고리즘  (0) 2010.10.08
Kruskal 알고리즘  (0) 2010.10.08


1. OpenCV 설치

2. Visual C++ 6.0 기준 세팅

* Options > Directories > Include files
C:\Program Files\OPENCV\CV\INCLUDE
C:\Program Files\OPENCV\CVAUX\INCLUDE
C:\Program Files\OPENCV\CXCORE\INCLUDE
C:\Program Files\OPENCV\ML\INCLUDE
C:\Program Files\OPENCV\OTHERLIBS\HIGHGUI
C:\Program Files\OPENCV\OTHERLIBS\CVCAM\INCLUDE
* Options > Directories > Library files
C:\Program Files\OPENCV\LIB
* Project > Setting > Link > Object/Library modules
cv.lib highgui.lib cxcore.lib cvcam.lib

* Header file include
#include "cv.h"
#include "highgui.h"
#include "cvcam.h"

* dll 에러가 날 경우
OpenCV\bin 에서 dll 파일들을 프로젝트가 있는 폴더로 복사



 * 변수 이름 규칙
- 변수 이름에는 영문자, 숫자, 밑줄(_) 만을 사용할 수 있다.
- 변수 이름의 첫 문자로 숫자는 올 수 없다.
- 변수 이름의 첫 문자로 밑줄이 두 개 오는 것은 컴파일러와 리소스가 사용하는것으로 예약 되어있다.
- 대문자와 소문자를 구별한다.
- 키워드는 변수 이름으로 사용할 수 없다.
- 이름의 길이는 제한이 없다. (단, ANSI C에서는 63번째 문자까지만 구별한다.)

 * 정수형 변수 short, int, long
- short형은 최소한 16비트 폭을 가진다.
- int형은 최소한 short만큼은 크다.
- long형은 최소한 32비트 폭을 가지며, 최소한 int만큼은 크다.

- sizeof 연산자를 데이터형 이름에 사용할 때에는 괄호를 사용해야 하지만, 변수 이름에 사용할 때에는 괄호가 없어도 상관없다.

 *진수의 표현
- 8진수는 0을, 16진수는 0x 또는 0X를 붙여서 10진수와 구별한다.
- cout은 기본으로 10진수로 출력하며, dec/oct/hex 조정자를 제공한다. 조정자로 인하여 바뀐 출력 형태는 다시 조정자를 쓸 때까지 그대로 유지된다.

- cout은 char형 변수를 자동으로 문자로 출력한다. 하지만 char형 변수 자체의 값은 정수이기 때문에, 연산을 할 수 있다. char형 변수에 저장되어 있는 정수를 보려면 printf를 사용하거나 int형에 대입시킨 다음 출력하면 된다.

- 1바이트로 표현할 수 없는 문자 세트를 처리할 때, 데이터 타입으로 wchar_t 를 쓰고, 해당 문자 앞(따옴표 앞)에 L을 붙인다.

- 키워드 const를 사용하여 변수를 상수로 만들수 있고, 이것은 안정적인 프로그래밍을 가능하게 한다.

- 부동소수형 변수는 소수부가 있는 수, 매우 큰 수, 매우 작은 수를 나타낼 수 있다.

- 부동소수형 변수의 연산은 정수형 연산보다 느리고, 정밀도가 떨어진다.

- 정수형과 부동소수형을 합쳐서 산술형 이라고 부른다.

 * 산술 연산자
- 하나의 피연산자에 두 개의 연산자가 앞,뒤로 있을 경우, 우선순위가 높은 연산자가 먼저 연산된다.
 만약 우선순위가 같은 연산자가 있으면, 결합 방향 규칙에 따라 순서가 정해진다.
- %연산자는 피연산자로 정수만 올 수 있다.
- /연산자는 피연산자 모두 정수이면 정수 나눗셈을, 둘 중 하나라도 소수이면 소수 나눗셈을 한다.

 * 데이터형 변환
- 대입 명령문에서 대입되는 값은 해당 변수의 타입으로 변환된다.
- 강제 형 변환에서는 소수부의 손실이나 값의 변조가 일어날 수 있다.



'학부 전공 > C++' 카테고리의 다른 글

2. C++ 시작하기  (0) 2010.07.19
1. C++ 첫걸음  (0) 2010.07.19

- 일반적으로 main함수는 컴파일러가 프로그램에 추가하는 시동 코드에 의해 호출된다.

- 함수에서 리턴형을 void로 할 경우, C++ 표준이 아니므로 어떤 시스템에서는 동작하지 않을 수 있다.

- 컴파일러가 리턴 명령문을 만나지 못한 채 main()의 끝에 도달하면 자동으로 return 0; 과 동일하게 동작한다.

 * Name Space
- name space는 C++의 새로운 기능이다. 이것은 프로그램을 작성할 때, 같은 이름의 함수가 존재할 때, 선택할 수 있게 한다.
using namespace std; 
이것은 C++ 컴파일러의 표준 구성 요소를 쓸 수 있게 하는 것이다.

- using 지시자는 필요한 것들만 개별적으로 선언하여 쓸 수도 있다.
using std::cout;
using std::cin;
using std::endl;

 * 조정자(manipulator) endl
- cout에 대해 특수한 의미를 지니는 키워드를 조정자라고 부른다.
- endl은 개행문자인 \n과 같은 동작을 한다.

 * 소스 코드의 모양
- 코드에서 더 이상 분리할 수 없는 기본 요소를 토큰(token)이라 한다.
- 토큰들끼리는 빈칸, 탭, 캐리지 리턴에 의하여 구분되는데 이 세 가지를 white space라 한다.
- white space는 토큰 사이사이에 얼마든지 들어가도 되지만, 코드의 가독성을 생각해야 한다.

 * 명령문
- C에서는 변수의 선언을 함수의 시작 위치에 선언해야 하지만, C++에서는 사용되기 전이라면 어디에서든지 선언해도 된다. 
- cout/cin은 연산자 오버로딩 된 객체이기 때문에, 어떤 데이터형이든지 구별않고 출력/입력할 수 있다.

- 클래스는 데이터 형식의 모든 속성을 서술한 것이고, 객체는 그 서술에 따라 실제로 생성된 구체물이다.

- C++ 프로그램은 함수라고 부르는 모듈들로 이루어진다.



'학부 전공 > C++' 카테고리의 다른 글

3. 데이터 처리  (0) 2010.07.21
1. C++ 첫걸음  (0) 2010.07.19


- C++은 절차적 언어 방식, 객체 지향 언어 방식, 일반화 프로그래밍 방식을 하나로 결합한다.

- FORTRAN이나 BASIC은 초기의 절차적 언어이다. 프로그램이 스파게티처럼 꼬여있어서 코드를 파악하고 수정하는 것이 어려웠다.
- C언어에서는 구조적 프로그래밍 언어이다. 정형화된 분기문을 사용하도록 되어있었고, 하향식 설계(모듈화)를 지향했다. 
- C++ 은 객체 지향 프로그래밍 언어이다. 클래스를 사용하여 알고리즘보다 데이터를 더 중시한다.

 *객체 지향 프로그래밍(Object-Oriented Programming)
- 절차적 프로그래밍은 알고리즘을 강조하지만, 객체 지향 프로그래밍은 데이터를 강조한다.
- 문제를 언어의 절차적 방식에 끼워맞추지 않고, 언어 자체를 문제에 맞춰서 설계한다.
- 클래스는 그것을 위한 새로운 데이터형이고, 객체는 클래스에 의해 만들어지는 특정한 구조이다.
- 클래스는 객체를 나타내는 데이터 부분과, 데이터를 대상을 수행할 수 있는 동작 부분으로 정의된다.

- OOP는 코드를 쉽게 재활용 할 수 있고, 정보를 은닉할 수 있다. 문제를 쪼개는 하향식이 아니라, 클래스부터 시작하여 문제를 완성해 나가는 상향식 프로그래밍이다.

- 프로그램 코드를 수정하지 않고 다시 컴파일하여 새로운 플랫폼에서 프로그램이 잘 작동한다면, 그 프로그램은 이식성이 있다고 말한다.

- 프로그램의 마지막에 cin.get();을 넣으면 실행시에 사용자가 enter를 누르기를 기다린다.






'학부 전공 > C++' 카테고리의 다른 글

3. 데이터 처리  (0) 2010.07.21
2. C++ 시작하기  (0) 2010.07.19

27-1 프로그래밍의 모듈화


- 일반적인 소프트웨어 공학에서 이야기하는 모듈은 하나의 파일이 될 수도 있고, 하나의 함수가 될 수도 있다.

extern int i;
- 키워드 extern은 전역 변수가 다른 파일에 이미 선언되어 있음을 알려준다.

- 키워드 static은 전역 변수가 다른 파일에서 사용될 수 없게 한다.

-링크는 파일간에 접근하는 변수가 어디에 있는지, 호출하는 함수가 어디에 있는지 연결해주는 작업이다.


27-2 헤더 파일의 구현과 유용성

- 헤더 파일은 #include 전처리기 지시가에 의해서 파일 내에 그대로 포함된다.

- < >을 사용하면 표준 디렉토리에서 표준 헤더 파일을 포함시킨다.
- " "을 사용하면 디렉토리를 직접 지정하는 것이 가능하다.(파일 이름만 적으면 현재 작업 디렉토리에서 찾는다.)

- 헤더 파일을 사용하면 파일들 사이의 변수와 함수에 extern 선언을 하지 않아도 된다.


27-3 조건부 컴파일

#if 조건1
내용1
#elif 조건2
내용2
#else
내용3
#endif

- 위의 구문으로 컴파일 할 대상을 지정할 수 있다.


#ifndef head
#define head

#endif

- 헤더 파일에 위의 구문이 삽입되어 있으면 다른 파일에서 중복 포함되더라도 한번만 포함시킨다.



'학부 전공 > C' 카테고리의 다른 글

26. 매크로와 전처리기  (0) 2010.07.16
25. 메모리 관리와 동적 할당  (0) 2010.07.16
24. 파일 입출력  (0) 2010.07.16
23. 구조체와 사용자 정의 자료형 2  (0) 2010.07.15
22. 구조체와 사용자 정의 자료형  (0) 2010.07.15

26-1 전처리기에 의한 매크로 처리

- 일반적으로 말하는 컴파일은 전처리 과정이 포함되어 있다.

- 전처리 과정은 소스코드중 #이 붙은 문장을 처리하는 과정이다.

- #이 붙은 문장을 전처리기 지시자 라고 한다.

- #define이 붙은 문장은 단순 치환 작업을 요청할 때 사용하는 지시자이다.

#define PI 3.14
- PI는 매크로 상수이고, 3.14는 대체 리스트 라고 한다.

- 이미 선언된 매크로를 다른 매크로 선언에서 사용할 수 있다.
- 대체 리스트 영역에서는 공백도 존재할 수 있다.


26-2 매크로를 이용한 함수

#define SQUARE(x) x*x
- 위와 같이 선언된 SQUARE(x)를 매크로 함수 라고 한다.

- 매크로 함수는 자료형에 독립적이며, 실행 속도가 빠르다.

- 함수의 크기가 작아야 매크로 함수로 쓰기에 적당하다.

- 단순치환이므로 괄호를 사용하지 않을 경우, 연산자 우선순위에 의해 착오가 생길 수 있다.

- 매크로에 의한 치환은 문자열 내에서는 이루어지지 않는다.
- 대체 리스트의 앞에 #을 붙이면 문자열로 치환된다.

- 토큰이란 컴파일러가 인식하는 의미를 지니는 문자나 문자열의 최소 단위 이다.

- ##은 토큰을 결합할 때 사용한다.

 * 표준 매크로
_FILE_ : 현재 소스 코드의 파일명을 나타내는 문자열
_TIME_ : 컴파일 시각을 "시: 분: 초"의 형태로 나타내는 문자열
_DATE_ : 컴파일 날짜를 "년 월 일"의 형태로 나타내는 문자열
_LINE_ : 현재 처리중인 소스파일의 행 번호를 나타내는 문자열


'학부 전공 > C' 카테고리의 다른 글

27. 모듈화 프로그래밍  (0) 2010.07.16
25. 메모리 관리와 동적 할당  (0) 2010.07.16
24. 파일 입출력  (0) 2010.07.16
23. 구조체와 사용자 정의 자료형 2  (0) 2010.07.15
22. 구조체와 사용자 정의 자료형  (0) 2010.07.15


25-1 C언어의 메모리 구조

- 프로그램이 실행되면 메모리에 데이터영역, 스택영역, 힙영역이 생긴다.

- 데이터 영역 : 전역 변수와 static변수가 저장 된다. 프로그램이 종료될 때까지 유지된다.
- 스택 영역 : 지역변수와 매개 변수가 저장된다. 해당하는 함수가 종료될 때까지 유지된다.
- 힙 영역 : 프로그래머가 관리하는 메모리 영역이다. 

- 배열 선언시 상수를 써야 하는 이유 : 스택과 데이터 영역에 할당될 메모리의 크기는 컴파일타임에 결정되어야 한다.

- 할당해야 할 메모리의 크기를 런타임에 결정해야 하는 경우, 힙 영역을 사용한다.


25-2 메모리 동적 할당

- 힙에 메모리를 할당하는 것을 동적 할당이라 한다.

void* malloc(size_t size);
- size만큼 메모리를 할당한다. 실패하면 NULL포인터를 리턴한다.

- 힙에 할당된 메모리 공간에는 포인터를 사용해서 접근해야 한다.

int* i = (int*)malloc(sizeof(int));
- void포인터로 리턴하고 있기 때문에 사용하기 전에 위처럼 형 변환을 해주어야 한다.

void free(void* ptr);
-해당하는 메모리 공간을 해제한다.

void *calloc(size_t elt_count, size_t elt_size);
- elt_size 크기의 변수를 elt_count 개수만큼 할당.



'학부 전공 > C' 카테고리의 다른 글

27. 모듈화 프로그래밍  (0) 2010.07.16
26. 매크로와 전처리기  (0) 2010.07.16
24. 파일 입출력  (0) 2010.07.16
23. 구조체와 사용자 정의 자료형 2  (0) 2010.07.15
22. 구조체와 사용자 정의 자료형  (0) 2010.07.15

+ Recent posts