scr: edwith
주어진 배열 속에서 특정 값을 찾는 방법
배열의 인덱스를 처음부터 끝까지 하나씩 증가시키면서 검사
배열이 정렬되어 있지 않고 랜덤으로 있다면, 선형검색이 가장 적절한 방법일 수 밖에 없음.
For i from 0 to n–1
If i'th element is 50
Return true
Return false
배열 중간 인덱스부터 시작해 값 비교하면서 이동을 반복
만약 배열이 정렬되어 있다면 선형검색보다 더 효율적임
알고리즘의 실행 시간의 상한과 하한을 표기.
알고리즘 실행 시간 그래프 예시 : -> O(n) , O(log n)
주요 표기
O(n^2)
O(n log n)
O(n) - 선형 검색
O(log n) - 이진 검색
O(1)
주요 표기
Ω(n^2)
Ω(n log n)
Ω(n) - 배열 안에 존재하는 값의 개수 세기
Ω(log n)
Ω(1) - 선형 검색, 이진 검색
선형 검색으로 값을 찾는 방법
Repeat n–1 times
For i from 0 to n–2
If i'th and i+1'th elements out of order
Swap them
For i from 0 to n–1
Find smallest item between i'th item and last item
Swap smallest item with i'th item
실행시간의 상한
- O(n^2): 선택 정렬, 버블 정렬
- O(n log n)
- O(n): 선형 검색
- O(log n): 이진 검색
- O(1)
.
실행시간의 하한- Ω(n^2): 선택 정렬,
버블 정렬- Ω(n log n)
- Ω(n) : 버블 정렬
- Ω(log n)
- Ω(1): 선형 검색, 이진 검색
만약 정렬된 배열이 주어진다면 안쪽 루프에서 교환이 하나도 일어나지 않음.
이럴경우 바깥루프를 교환이 일어나지 않으면 멈추라고 하면,
Repeat until no swaps
For i from 0 to n–2
If i'th and i+1'th elements out of order
Swap them
하한은 Ω(n) 이 될 수 있음
재귀적 호출 : 함수를 함수 내에서 재사용하는 방법
#include <cs50.h>
#include <stdio.h>
void draw(int h);
int main(void)
{
// 사용자로부터 피라미드의 높이를 입력 받아 저장
int height = get_int("Height: ");
// 피라미드 그리기
draw(height);
}
void draw(int h)
{
// 높이가 h인 피라미드 그리기
for (int i = 1; i <= h; i++)
{
for (int j = 1; j <= i; j++)
{
printf("#");
}
printf("\n");
}
}
를
void draw(int h)
{
// 높이가 0이라면 (그릴 필요가 없다면)
if (h == 0)
{
return;
}
// 높이가 h-1인 피라미드 그리기
draw(h - 1);
// 피라미드에서 폭이 h인 한 층 그리기
for (int i = 0; i < h; i++)
{
printf("#");
}
printf("\n");
}
원소가 한 개가 될 때까지 계속해서 반으로 나누다가 다시 합쳐나가며 정렬을 하는 방식
재귀적으로 구현되는 정렬
상한 : O(n log n)
숫자들을 반으로 나누는 데는 O(log n)의 시간이 들고, 각 반으로 나눈 부분들을 다시 정렬해서 병합하는 데 각각 O(n)의 시간이 걸리기 때문
하한 : Ω(n log n)
숫자들이 이미 정렬되었는지 여부에 관계 없이 나누고 병합하는 과정이 필요하기 때문
시간복잡도 로그 시간
만약 T(n) = O(log n) 이라면, 이 알고리즘은 로그 시간이 걸린다고 말할 수 있다. 컴퓨터가 이진수 시스템을 사용하기 때문에, 로그는 밑을 대부분 2로 사용한다. (즉, log2n, 때때로는 lg n 이라고 쓰임.) 그러나, 로그의 밑이 변할 때, logan와 logbn는 오로지 상수 승수에 따라서만 달라지며 이것은 빅-오 표기법에서는 버림한다; 그러므로 O(log n)은 로그의 밑과 상관없이 로그 시간 알고리즘에 대한 표준 표기법이 된다.
scr : wikipedia
실행시간의 상한
- O(n^2): 선택 정렬, 버블 정렬
- O(n log n) 병합 정렬
- O(n): 선형 검색
- O(log n): 이진 검색
- O(1)
.
실행시간의 하한- Ω(n^2): 선택 정렬,
버블 정렬- Ω(n log n) 병합 정렬
- Ω(n) : 버블 정렬
- Ω(log n)
- Ω(1): 선형 검색, 이진 검색