Quiz 01Quiz 01

Posted at 2011. 4. 12. 19:50 | Posted in Computer Science/알고리즘

알고리즘 앞반 퀴즈
A에서 J도시까지 최소비용경로 구하기.

알고리즘 뒷반 퀴즈
배낭채우기 문제.

//

Algorithm, Spring 2011Algorithm, Spring 2011

Posted at 2011. 4. 11. 04:09 | Posted in Computer Science/알고리즘

Algorithm, Spring 2011

Course Description and Goals
본 과목은 컴퓨터공학에서 다루는 문제들을 해결하기 위한 가장 기본적이며 중요한 원칙들과 해결기법 및 전략에 대해서 강의한다. 컴퓨터공학부 3학년이 수강대상이며, 이에 준하는 수준에서 강의를 진행한다.

컴퓨터공학의 다양한 문제해결을 위한 전략을 설계하고 분석하는 것을 주요 강의 내용으로 다루며, 수강생들이 이를 효과적으로 습득하기 위해서 선수과목으로 프로그래밍 관련 과목과 데이터구조 분석/설계를 필히 이수하고 수강하여야 한다. 선수과목에서 다루어진 내용에 대해서는 강의를 생략할 예정이며, 선수과목을 미이수한 학생들은 수강신청 시 유의하여야 한다.

본 과목의 목표는 학생들이 한 학기 알고리즘을 수강한 후, 이후 직면할 수 있는 다양한 컴퓨터공학의 문제들을 효과적으로 해결할 수 있는 컴퓨터공학적 사고를 할수 있도록 하는 것이며, 주어진 문제에 대해서 가장 효과적인 접근방식 및 전략 (Approach and Strategy)를 설계하고, 제안한 알고리즘에 대한 수학적 분석을 통해 그 우월성을 입증할 수 있는 능력을 배양하게 된다.

본 과목에 대한 컴퓨터공학심화 프로그램 교과목 학습성과 구성은 다음과 같음: 학습성과-1(20%), 학습성과-2(30%), 학습성과-3(30%), 학습성과-4(20%)

Course Procedures and Evaluation
강의는 지도교수에 의한 이론강의를 중심으로 하며, 학생들의 수업참여도를 높이기 위한 질의응답, 토론을 적극 활용한다. 학생들은 제시된 교재의 심화된 내용을 반드시 스스로 학습하여 자신만의 알고리즘 설계 및 분석 능력을 습득할 수 있어야 한다.

또한, 학습한 내용에 대한 적극적인 습득을 위해 정기적인 숙제 및 퀴즈를 실시한다. 숙제는 워드프로세서를 사용하지 않고, 자신만의 유일한 예제를 만들고 연필을 이용하여 손으로 직접 풀어서 제출한다.

평가는 중간고사, 기말고사, PreTest, 퀴즈 및 숙제 점수를 반영하여 최종 성적을 산출함.
1. 중간고사는 30점 만점으로 실시함.
2. 기말고사는 30점 만점으로 실시함.
3. PreTest는 10점 만점으로 실시함 (2회:5점/회).
4. 퀴즈 및 숙제는 30점 만점으로 실시함 (퀴즈 2회:4점/회, 숙제 22회:1점/회)

Reference Textbooks
1. Foundations of Algorithms Using C++ Pseudocode by R. Neapolitan et al., Addison Wesley.
3. Introduction to Algorithms by T.H. Cormen et al., MIT Press.

Lecture Schedule and Homeworks
WEEK 1: Introduction and Design & Analysis of Algorithm
WEEK 2: Divide and Conquer (Binary Search and Merge Sort)
WEEK 3: Divide and Conquer (Quick Sort), Dynamic Programming (Binomial Coefficient)
WEEK 4: Dynamic Programming (Bionomial Coefficient, All-Pairs SP)
WEEK 5: Dynamic Programmin (All-Pairs SP, Chained Matrix Multiplication)
WEEK 6: Dynamic Programming (CMM) and Greedy (Minimum Spanning Trees)
WEEK 7: Greedy (Minimum Spanning Trees) and Pre-Test
WEEK 8: Mid-Term Exam
WEEK 9: Dynamic Programming vs Greedy (The Knapsack Problem)
WEEK 10: Backtracking (N-Queens/ Sum-of-Subsets/ Graph Coloring Problem)
WEEK 11: Backtracking (TSP Problem, 0/1 Knapsack Problem)
WEEK 12: Branch and Bound (0/1 Knapsack Problem), Best-First Search
WEEK 13: Theory of NP (Decision Problem, Optimization Problem)
WEEK 14: Theory of NP (NP-Complete Problem)
WEEK 15: Theory of NP (NP-Hard Problem, Approximation Algorithm) and Pre-Test
WEEK 16: Final Exam

//

HW#10 : Chained Matrix Multiplication의 구현과 예제의 동작 과정을 보이시오.HW#10 : Chained Matrix Multiplication의 구현과 예제의 동작 과정을 보이시오.

Posted at 2011. 4. 11. 04:05 | Posted in Computer Science/알고리즘
HW#10 : Chained Matrix Multiplication의 구현과 예제의 동작 과정을 보이시오.
//

HW#09 : 연쇄행렬곱셈 문제에 대해 D&C 접근 방법을 쓰지 않는 이유?HW#09 : 연쇄행렬곱셈 문제에 대해 D&C 접근 방법을 쓰지 않는 이유?

Posted at 2011. 3. 31. 15:28 | Posted in Computer Science/알고리즘
HW#09 : Chained Matrix Multiplication의 기본곱셈 횟수를 줄이는 문제에서 분할 및 정복 방법이 왜 적덜하지 못한가?
//

HW#08 : ASAP 관련된 문제HW#08 : ASAP 관련된 문제

Posted at 2011. 3. 31. 15:27 | Posted in Computer Science/알고리즘
HW#08 : ASAP 관련된 문제
//

HW#07 : APSP 문제 풀이HW#07 : APSP 문제 풀이

Posted at 2011. 3. 31. 15:26 | Posted in Computer Science/알고리즘
HW#07 : APSP 문제 풀이
//

HW#06 : Dynamic Programming을 이용한 Binomial Coefficient 문제 해결HW#06 : Dynamic Programming을 이용한 Binomial Coefficient 문제 해결

Posted at 2011. 3. 31. 00:06 | Posted in Computer Science/알고리즘
#include <stdio.h>
#include <stdlib.h>

int minimum(int i, int k)
{
	if(i < k) return i;
	else return k;
}

int bin2(int n, int k)
{
	// Valable Decaltion
	int i = 0;
	int j = 0;
	int **B = NULL;

	int returnValue = 0;
	
	// Matrix Initialization
	B = (int**)malloc(sizeof(int*) * (n+1));

	for(i = 0; i < n+1; i++)
		B[i] = (int*)malloc(sizeof(int) * (k+1));

	for(i = 0; i < n+1; i++)
		for(j = 0; j < k+1; j++)
			B[i][j] = 0;

	// Binomial Coefficient
	for(i = 0; i <= n; i++)
		for(j = 0; j <= minimum(i,k); j++)
			if(j == 0 || j == i)
				B[i][j] = 1;
			else
				B[i][j] = B[i-1][j-1] + B[i-1][j];

	returnValue = B[n][k];
	
	// Matrix Uninitialization
	for(i = 0; i < n+1; i++)
		free(B[i]);
	
	free(B);

	return returnValue;
}

int main(int argc, char argv[])
{
	printf("B[4][2] = %d\n", bin2(4,2));

	return 0;
}
//

HW#05 : Quick Sort의 구현과 예제의 동작 과정을 보이시오.HW#05 : Quick Sort의 구현과 예제의 동작 과정을 보이시오.

Posted at 2011. 3. 24. 11:05 | Posted in Computer Science/알고리즘

asd
//

HW#04 : Merge Sort의 구현과 예제의 동작 과정을 보이시오.HW#04 : Merge Sort의 구현과 예제의 동작 과정을 보이시오.

Posted at 2011. 3. 21. 22:41 | Posted in Computer Science/알고리즘

Merge Sort는 Divide and Conquer Approach의 일종으로 크게 3단계로 실행 된다.(2-Way Merge Sort 기준)

1. 리스트를 이등분 한다.(Divide)
2. 이등분된 리스트 두개를 정렬한다.(Conquer)
3. 이등분된 리스트를 병합하여 하나의 리스트로 만든다.(Combie)

다음은 Merge Sort를 C언어로 구현한 것이다.

(소스 생략)

(예제 생략)

//

HW#03 : 분할을 두 개로 하는 경우가 많다. 왜 두 개를 사용하는가?HW#03 : 분할을 두 개로 하는 경우가 많다. 왜 두 개를 사용하는가?

Posted at 2011. 3. 21. 22:38 | Posted in Computer Science/알고리즘

Divide and Conquer Approach를 보면 Binary Search와 2-Way Merge Sort와 같이 세 개가 아닌 두 개를 사용하는 경우가 많다. 왜 두개를 사용하는가?

K-Way Merge Sort를 예로 들어 보면 K값을 3으로 할 수도 있고 2로 할 수도 있다. 2-Way Merge Sort와 3-Way Merge Sort의 시간복잡도(Time Complexity)를 생각해 보아야 한다. Divide and Conquer Approach의 경우 T(n) = Divide + Conquer + Combie 시간을 생각해 보아야 한다.

K = 2 인 경우, T(n) = 0 + T(n/2) + T(n/2) + n/2 + n/2 - 1

K = 3 인 경우, T(n) = 0 + T(n/3) + T(n/3) + T(n/3) + n/3 + n/3 + n/3 - 1

결국 입력 원소의 개수가 크다면 K 값이 큰 것이 되부름(Recursion)을 적게 하여 유리하다. 또한 병렬 처리를 할 경우 K 값이 큰 것이 좋다. 하지만 3-Way Merge Sort는 병합 과정이 복잡하기 때문에 메모리의 Activation Record를 낭비해서라도 2-Way Merge Sort를 사용한다.
//