알고리즘의 명세
이다.2차 세계대전 이전에, 컴퓨터는 알고리즘을 수행하는 사람을 의미했다..!
아래의 코드는 기본적인 의사코드 선언문을 정리한 것이다.
procedure
name(argument: type)
variable := expression
informal statement
begin statements end
{comment}
if condition then
statement [else
statement]
for variable := initial value
to final value
statement
while condition statement
procname(arguments)
Not defined in book:
return expression
다음의 문장들을 선언
예시:
procedure maximum(L: list of integers)
[statements defining maximum... ]
아래처럼 선언문들을 묶는 역할을 한다.
begin
statement 1
statement 2
⋯
statement n
end
자연어
이다.remark
라고도 불린다if 조건 then 선언문1 else 선언문2
에서 조건이 거짓이면, 선언문1을 스킵하고 선언문2로 넘어간다.명제적인 표현식으로 나타난 조건(condition)을 검사한다.
만약 조건이 참이라면, 선언문(statement)을 실행한다.
조건을 검사했을 때 거짓이 될 때까지 위 두 과정을 계속해서 반복한다; 그 후, 다음 선언문으로 넘어간다.
ex) while은 if조건문을 엄청나게 써서 구현할 수도 있다. but, 설마~?
if condition
begin
statement
if condition
begin
statement
⋯(계속 중첩된 if문을 사용)
end
end
begin
variable := initial
while variable ≤ final
begin
statement
var := var + 1
end
end
procedure call 선언문은 procedure로 명명된 함수를 call 한다. (단 인자값(argument)를 입력값으로 먼저 준 후에)
다양한 프로그래밍 언어들이 procedure를 다음과 같이 부르기도 한다.
ex ) 최댓값 찾는 프로시저를 의사코드로 표현
procedure max(a_1,a_2,⋯,a_n: integers)
v := a_1 {지금까지 가장큰 요소로 가정한 a_1}
for i:=2 to n {요소의 나머지들에 대해..}
if a_i > v then v := a_i {더 큰수를 찾았다면??}
{이 시점에서 변수v의 값은 리스트 중 가장큰 정수값일 것이다.}
return v
리스트의 첫 번째 요소부터 차례대로 검색하는 방법
ex) Find '12' in {3, 6, 9, 12, 15, 18, 21, 24}
procedure linear search
(x: 찾을 정수, a_1, a_2, ⋯, a_n : 서로 다른 정수)
i := 1
while (i≤n ∧ x≠a_i)
i := i+1
if i≤n then index := i
else index := 0
return index {찾은 인덱스 혹은 찾아지지 않은 인덱스 0을 반환}
procedure binary search
(x: 찾을 정수, a_1, a_2, ⋯, a_n : 서로 다른 정수)
i := 1 {왼쪽 끝 지점}
j := n {오른쪽 끝 지점}
while i<j begin {while interval이 한개이상의 요소를 가지고 있는 동안}
m := (i+j)/2 {midpoint}
if x>a_m then i:=m+1 else j:=m
end
if x=a_i then index:=i else index:=0
return index
프로그래밍에서 Search 다음으로 많이 마주치는 문제!
또한 data-processing 알고리즘에서 subroutine으로서 많이 쓰인다.
두가지 쉬운 sorting algorithm
Bubble sort
Insertion sort
// but, 이 알고리즘은 효율적이지 않으므로, 큰 데이터에 대해서는 사용하지 않아야 함!
15가지 이상의 sorting algorithms이 존재
procedure bubble sort(a_1, a_2, ⋯, a_n : 2이상의 정수)
for i:=1 to n-1
for j:=1 to n-i
if a_j>a_j+1 then swap a_j and a_j+1
{a_1, a_2, ⋯, a_n 는 오름차순 정렬.}
procedure insertion sort(a_1,a_2,⋯,a_n: real numbers with n≥2)
for j:=2 to n
i:=1
while a_j>a_i {a_j의 적절한 index를 찾을 것}
i:=i+1
m := a_j {m에 임시저장}
for k:=0 to j-i-1 {a_j를 적절한 위치에 삽입}
a_j-k := a_j-k-1 {swap}
a_i := m
{a_1,a_2,⋯,a_n 는 오름차순 정렬}
e.g., 아래의 동전으로 구성된 n cents의 거스름 돈에 대한 greedy algorithm을 디자인하시오:
quarters (25 cents), dimes (10 cents), nickels (5 cents), and pennies (1 cent)
에 대해 어떻게 해야 가장 적은 갯수의 동전(최소 동전의 수)을 거슬러 줄 것인가?
IDEA : 각 단계마다 거스름 돈(즉, 거슬러 주어야 하는 돈)을 초과하지 않으면서 가능한 한 가장 큰 값어치를 가지는 동전을 선택한다.
Solution : n cents의 거스름돈에 대한 greedy algorithm. 이 알고리즘은 로 명명된 어느 동전에 대하여 동작한다.
procedure change(c_1,c_2,⋯,c_r: 코인의 종류. 단, c_1>c_2>⋯>c_r; n: 양의정수)
{c_1: quarters, c_2: dimes, c_3: nickels, c_4: pennies}
for i:=1 to r {코인의 종류 큰 것부터 작은것으로..}
d_i := 0 {d_i는 c_i 코인의 개수를 센다.}
while n≥c_i
d_i := d_i+1 {c_i 코인의 총 갯수에 1개를 더한다.}
n = n-c_i