[CPA340] Algorithms and Practice Youn-Hee Han

Slides:



Advertisements
Similar presentations
Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어론 2nd edition Tucker and Noonan 5 장 타입 “ 타입은 컴퓨터 프로그래밍의 효소이다 ; 프로그래밍은 타입을 통해 소화할만한 것이 된다.” 로빈.
Advertisements

어서와 Java는 처음이지! 제3장선택과 반복.
제 4 장 변수, 영역, 수명 변수 바인딩 영역 기억장소 할당과 수명 변수와 그 환경 변수 초기화 상수와 변수.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
C++ Espresso 제3장 배열과 포인터.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
7장 배열 ②.
어서와 Java는 처음이지! 제4장 배열.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Internet Computing KUT Youn-Hee Han
[INA470] Java Programming Youn-Hee Han
Ch.04 Greedy Method (탐욕적 방법)
Internet Computing KUT Youn-Hee Han
쉽게 배우는 알고리즘 5장. 검색트리
Internet Computing KUT Youn-Hee Han
Internet Computing KUT Youn-Hee Han
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
DataScience Lab. 박사과정 김희찬 (월)
12 검색.
정렬과 합병.
컴퓨터 개론 및 실습 Dept. Computer Eng. Hankuk University of Foreign Studies
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
WAP Java Seminar
Ch.06 Branch-and-Bound (분기한정법) (Ch.05-7 포함)
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
[INA240] Data Structures and Practice
제 1 장 알고리즘 : 효율, 분석, 그리고 차수.
메소드와 클래스 정의 및 문제 풀이 Method and Class Define and Problem Solve
Ch.03 Dynamic Programming (동적 프로그래밍 or 동적 계획법)
Ch.02 Divide and Conquer (분할정복)
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
[CPA340] Algorithms and Practice Youn-Hee Han
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 09. C언어의 핵심! 함수!
선택 정렬 #define SWAP(x, y, t) {(t) = (x); (x) = (y); (y) = (t);}
[INA470] Java Programming Youn-Hee Han
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Java의 정석 제 4 장 조건문과 반복문 Java 정석 남궁성 강의
[INA470] Java Programming Youn-Hee Han
제 1 장. 자료구조와 알고리즘.
자바 5.0 프로그래밍.
Chapter 02. 소프트웨어와 자료구조.
C언어 응용 제 15 주 검색.
[CPA340] Algorithms and Practice Youn-Hee Han
CHAP 12:탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
합병정렬(Merge Sort) (1/2) 문제: n개의 정수를 (비내림차순으로) 정렬하시오.
Signature, Strong Typing
Signature, Strong Typing
CHAP 9:정렬 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
Internet Computing KUT Youn-Hee Han
기술 진화와 진보.
Signature, Strong Typing
알고리즘 강의 슬라이드 2 분할정복 제 2 장 분할정복 도경구역, 알고리즘, 사이텍미디어, 1999.
강의 #11 탐색(Search).
탐색 선형 탐색, 이진 탐색, 이진 탐색 트리.
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
알고리즘(Algorithm) – Divide and Conquer (분할정복)
알기쉽게 해설한 데이터구조 고 갑 승 한남대학교
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
[CPA340] Algorithms and Practice Youn-Hee Han
배열, 포인터, 함수 Review & 과제 1, 2.
알고리즘 강의 슬라이드 7 정렬문제 알고리즘 해석 강의 슬라이드 #7
알고리즘의 분석(analysis) 공간적 효율성(Space Efficiency)과 시간적 효율성(Time Efficiency)
Report #3- 문제 1 Set(집합) 추상 데이터 타입을 정의하고, 다음과 같은 연산자들을 포함시켜라. 여기서 S, S1, S2는 집합을 나타내고, i는 집합 원소를 나타낸다. 연산 의미 create() Return {} insert(S, i) If i є S then.
Presentation transcript:

[CPA340] Algorithms and Practice Youn-Hee Han http://link.kut.ac.kr Ch.01 알고리즘 개요 (효율, 분석, 차수) [CPA340] Algorithms and Practice Youn-Hee Han http://link.kut.ac.kr

프로그램의 설계 과정 알고리즘은 주어진 문제를 논리적으로 해결하는 과정이다. 만족? 프로그램 문제 알고리즘 설계 분석 예 아니오 재설계 알고리즘은 주어진 문제를 논리적으로 해결하는 과정이다. 분석을 통해 작성한 알고리즘의 정확성을 파악할 수 있고, 효율성을 정량적으로 나타낼 수 있다. (일반적으로) 알고리즘은 프로그래밍 언어에 독립적이다.

알고리즘 과목의 학습 목표 Design(설계): 다양한 문제에 대해, 알고리즘을 설계하는 기법을 배운다. Analysis(분석): 알고리즘을 분석하여 시간/공간의 계산 복잡도를 구하는 방법을 배운다. Computational Complexity(계산 복잡도) - 시간(time): CPU - 공간(storage): 메모리

알고리즘이란? 정의: 문제에 대한 답(해결책)을 찾기 위한 단계적인 계산 절차 좀 더 구체적인 정의 알고리즘은 단계별로 주의 깊게 설계된 계산 과정이다. 알고리즘은 입력을 받아서 출력으로 전환시켜주는 일련의 계산 절차이다. 음…. 결국, 알고리즘이라는 것은 어떤 절차를 기술하는 것이다. 또 한번 음… 주어진 입력이 있을 때, 원하는 해답을 출력하기 위해서, 어떻게 계산하면 되는지 그 절차를 기술하는 것이다.

알고리즘의 예 주어진 문제: 전화번호부에서 “홍길동”의 전화번호 찾기 알고리즘(해결책) 분석: 어떤 알고리즘이 더 좋은가? 순차검색(sequential search): 전화번호부의 첫 쪽부터 홍길동이라는 이름이 나올 때까지 순서대로 찾는다. (수정된) 이진검색(binary search): 전환번호부는 “가나다”순으로 되어있으므로 먼저 “ㅎ”이 있을 만한 곳으로 넘겨본 후 앞뒤로 뒤적여가며 찾는다. 분석: 어떤 알고리즘이 더 좋은가?

문제(Problem)의 표기/표현 방법 문제: 해결책을 찾고자 던지는 질문 매개변수(파라미터, parameter): 문제에서 어떤 특정 값이 주어지지 않은 변수(variable) 문제의 사례(instance) = 입력(input): 문제에 주어진 파라미터에 특정 값을 지정한 것 사례에 대한 해답(solution) = 출력(output): 주어진 사례에 관한 질문에 대한 답

문제의 표기 예 문제: n개의 수로 된 리스트 S에 x라는 수가 있는지 알아내시오. 그 결과, x가 S에 있으면 “예”, 없으면 “아니오”로 답하시오. 파라미터: S, n, x 입력의 예1: S = [10,7,11,5,3,8], n = 6, x = 5 출력의 예1: “예” 입력의 예2: S = [10,7,11], n = 3, x = 5 출력의 예2: “아니오”

알고리즘의 표기(기술) 자연어: 한글 또는 영어 ( 부정확하고 모호함) 프로그래밍언어: C, C++, Java, Pascal 등 ( 특정 언어에 의존적이어서 일반적인 알고리즘 기술에 부적합) 의사코드(Pseudo-code): 직접 실행할 수 있는 프로그래밍언어는 아니지만, 실제 프로그램에 거의 가깝게 계산과정을 표현할 수 있는 언어 알고리즘은 보통 의사코드로 표현한다. 본 강의에서는 Java에 가까운 의사코드를 사용한다.

Java와 의사코드의 차이점 (1/3) 배열 인덱스의 범위에 제한 없음 프로시저의 파라미터에 2차원 배열 크기의 가변성 허용 의사코드는 임의의 값 사용 가능 (예: int x[5..10];) 프로시저의 파라미터에 2차원 배열 크기의 가변성 허용 예: void pname(A[][]) { … } C/C++에서는 다음과 같이 제한이 필요함: void pname(A[][10]){ … } 지역배열에 변수 인덱스 허용 예: keytype[] S = new keytype S[2..n]; S가 2부터 n까지 첨자를 가진 배열 Java에서는 0부터 시작되는 숫자 인덱스만 가능

Java와 의사코드의 차이점 (2/3) 수학 표현식 및 간단한 자연어 허용 Java 에 없는 타입 사용 가능 low <= x && x <= high (Java)  low  x  high (의사 코드) temp = x; x = y; y = temp; (Java)  exchange x and y; (의사 코드) Java 에 없는 타입 사용 가능 index: 첨자로 사용되는 정수 변수 number: 정수(int) 또는 실수(float) 모두 사용가능 bool: “true”나 “false” 값을 가질 수 있는 변수 이외에도 잘 알려진 키워드(예: record, list)는 별도 정의 없이 사용

Java와 의사코드의 차이점 (3/3) 제어 구조 프로시저와 함수의 구분 repeat (n times) { … } for 루프 while 루프 프로시저와 함수의 구분 함수: returntype fname (…) {… return x;} 알고리즘 1.1: 순차검색 (P. 5) 알고리즘 1.2: 배열의 수 더하기 (P. 7) 프로시저: void pname(…) {…} 알고리즘 1.3: 교환정렬 (P. 8) 알고리즘 1.4: 행렬곱셈 (P. 9)

순차검색 (Sequential Search) (1/3) 문제: 크기가 n인 리스트 (배열) S에 x가 있는가? (교재: 알고리즘 1.1) 입력(파라미터): (1) 양수 n, (2) 배열 S[1..n], (3) 키 x 출력: x가 S의 어디에 있는지의 위치, 만약 없으면 0 알고리즘(자연어): x와 같은 아이템을 찾을 때까지 S에 있는 모든 아이템을 차례로 검사한다. 만일 x 와 같은 아이템을 찾으면 S에서 해당 위치를 출력하고, S 를 모두 검사하고도 찾지 못하면 0을 출력한다.  자연어 알고리즘은 문제를 풀기는 하였으나, 프로그램으로 전환하기에는 용이하지 않다.

순차검색 (Sequential Search) (2/3) 알고리즘(의사코드) index seqsearch(int n, // 입력(1) keytype[] S, // 입력(2) keytype x) // 입력(3) { index location; location = 1; while (location <= n && S[location] != x) location++; if (location > n) location = 0; return location; } while-루프: 아직 검사할 항목이 있고, x를 찾지 못하였나? if-문: 모두 검사하였으나, x를 찾지 못했나?

순차검색 (Sequential Search) (3/3) 키와 같은 항목의 위치에 따라 다름 최악의 경우: n 평균의 경우: n/2 좀 더 빨리 찾을 수는 없는가? 사실상 더 이상 빨리 찾을 수 있는 알고리즘은 존재하지 않는다. 배열 S에 있는 항목에 대한 정보가 전혀 없는 상황에서, 모든 항목을 검색하지 않고 임의의 항목 x를 항상 찾을 수 있다는 보장이 없기 때문이다. 만약, 배열 S가 정렬되어 있다는 정보가 존재한다면?  이진검색

이진검색 (Binary Search) (1/3) 문제: 크기가 n인 정렬된 배열 S에 x가 있는가? (교재: 알고리즘 1.5) 입력: (1) 양수 n, (2) 배열 S[1..n], (3) 키 x 출력: x가 S의 어디에 있는지의 위치, 만약 없으면, 0 순차검색의 문제와 다른 점은 배열 S가 “정렬”되어 있다는 정보를 알고 있다는 점이다. 순차검색의 문제가 보다 일반적이므로, 순차검색을 사용하여서도 이 문제를 풀 수 있다. 그러나, 순차검색을 사용하면 “정렬”되어 있다는 정보를 사용하지 못하는 것이 된다.

이진검색 (Binary Search) (2/3) 알고리즘(의사코드) index binsearch(int n, // 입력(1) keytype[] S, // 입력(2) keytype x) // 입력(3) { index location, low, high, mid; low = 1; high = n; location = 0; while (low <= high && location == 0) { mid = (low + high) / 2; // 정수나눗셈 & floor if (x == S[mid]) location = mid; else if (x < S[mid]) high = mid – 1; else low = mid + 1; } return location; while-루프: 아직 검사할 항목이 있고, x를 찾지 못하였나?

이진검색 (Binary Search) (3/3) 최악의 경우에 대한 비교 횟수를 (개략적으로) 분석해 본다. 최악의 경우: x가 배열 S에 저장된 값보다 클 때 배열의 크기가 32라면  6번의 비교가 필요하다. 이때, 6 = lg 32 + 1이다. 그림 1.1참고 배열의 크기가 64라면  7번의 비교가 필요하다. 이때, 7 = lg 64 + 1이다. 배열의 크기가 2k라면  k+1번의 비교가 필요하다. 이때, k+1 = lg 2k + 1이다. … 이분검색 알고리즘으로 키를 찾기 위해서 S에 있는 항목을 몇 개나 검색해야 하는가? while 문을 수행할 때마다 검색 대상의 크기가 절반으로 감소하기 때문에 최악의 경우에 lg n + 1번을 비교함 상기 횟수 분석에서 n = 2k라 하면, 비교 횟수는 lg n + 1이 된다. [NOTE] lg n = log2n

순차검색 vs. 이진검색 배열의 크기 순차검색 이진검색 비고 n lg n + 1 128 8 1,024 11 1,048,576 두 방법 모두 최악의 경우에 대한 비교 횟수임 128 8 1,024 11 1,048,576 21 4,294,967,296 33

[실습 1] 순차검색과 이진검색 순차검색과 이진검색에 대한 실제 Java 프로그램을 작성해보자. SearchMain.java 를 분석하기 완성되지 않은 다음 두 함수를 작성한다. public static int sequentialSearch() public static int binarySearch() [주의] Java에서 배열의 인덱스는 0 부터 시작하여 n-1 까지 유효하다. 교재 알고리즘의 의사코드와 다르게 검색 결과 존재하지 않으면 -1을 리턴 num 변수 값을 키워가며 각 함수에 대한 수행 시간을 비교한다. num 값이 1000, 10000, 100000, 1000000 일 때의 각 함수에 대한 수행시간은?