์ ๋ ฌ ๋ฌธ์
์ ๋ ฌ ๋ฌธ์
๐ฝ ๋ฒ๋ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์ธ์ ํ ๋ ์์๋ฅผ ๊ฒ์ฌํ์ฌ ์ ๋ ฌ
- ๋ฌธ์ : ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก n๊ฐ์ ํค ์ ๋ ฌ
- ์ ๋ ฅ: ์์ ์ ์ n, ํค์ ๋ฐฐ์ด S[1..n]
- ์ถ๋ ฅ: ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ํค์ ๋ฐฐ์ด S[1..n]
์์ฌ์ฝ๋
1
2
3
4
5
6
7
8
9
void bubbleSort(int n, keytype &S[]) {
index i, j;
for(i = 1; i <= n; i++) {
for(j = 1; j <= n-i; j++) {
if(S[j] > S[j+1])
swap S[j] and S[j+1];
}
}
}
- ํฐ ์์ผ ๊ฒฝ์ฐ ํ ์นธ์ฉ ๋ค๋ก
๋ฒ๋ธ ์ ๋ ฌ ๋ถ์ - ๋ชจ๋ ๊ฒฝ์ฐ
- ๋จ์ ์ฐ์ฐ: ๋น๊ต
i | j | ํ์ |
---|---|---|
1 | 1.. | n-1 |
2 | 1.. | n-2 |
โฆ | ย | ย |
n | 1.. | 0 |
- $T(n) = \frac{n(n-1)}{2}$
๐ฝ ์ฝ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํญ๋ชฉ์ ๋ผ์ ๋ฃ์์ผ๋ก์จ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ฌธ์ : ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก n๊ฐ์ ํค ์ ๋ ฌ
- ์ ๋ ฅ: ์์ ์ ์ n, ํค์ ๋ฐฐ์ด S[1..n]
- ์ถ๋ ฅ: ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ํค์ ๋ฐฐ์ด S[1..n]
์์ฌ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
void insetionSort(int n, keytype S[]) {
index i, j;
keytype x;
for(i = 2; i <= n; i++) {
x = S[i];
j = i - 1;
while(j > 0 && S[j] > x) {
S[j+1] = S[j];
j--;
}
S[j+1] = x;
}
}
์ฝ์ ์ ๋ ฌ ๋ถ์ - ์ต์ ์ ๊ฒฝ์ฐ
- ๊ธฐ๋ณธ ์ฐ์ฐ: ๋น๊ต
- i๊ฐ ์ฃผ์ด์ก์ ๋, while loop์์ ์ต๋ i-1๋ฒ์ ๋น๊ต ์ด๋ฃจ์ด์ง
- $W(n) = \sum_{i=2}^{n} (i-1) = \frac{n(n-1)}{2}$
ํ๊ท ์ ๊ฒฝ์ฐ
- i๊ฐ ์ฃผ์ด์ก์ ๋ x๊ฐ ์ฝ์ ๋ ์ ์๋ ์ฅ์: i๊ฐ
์ฝ์ ํ ์ฅ์์ ์ธ๋ฑ์ค | ๋น๊ต ํ์ |
---|---|
i | 1 |
i-1 | 2 |
โฆ | โฆ |
2 | i-1 |
1 | i-1 |
x๋ฅผ ์ฝ์ ํ๋๋ฐ ํ์ํ ๋น๊ต ํ์
$1\frac{1}{i} + 2\frac{1}{i} + โฆ + (i-1)\frac{1}{i} + (i-1)\frac{1}{i} = \frac{1}{i} \sum_{k=1}^{i-1} k + \frac{i-1}{i} = \frac{(i-1)i}{2i} + \frac{i-1}{i} = \frac{i+1}{2} - \frac{1}{i}$์ ๋ ฌ์ ํ์ํ ํ๊ท ๋น๊ต ํ์
$\sum_{i=2}^{n} (\frac{i+1}{2} - \frac{1}{i}) โ \frac{(n+4)(n-1)}{4} - ln^n โ \frac{n^2}{4} โ ฮ(n^2)$
๐ค ๊ตํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ๋ฌธ์ : n๊ฐ์ ์๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด S ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- ์ ๋ ฅ: ์์ ์ ์ n, ๋ฐฐ์ด S
- ์ถ๋ ฅ: ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ๋ฐฐ์ด S
์์ฌ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void exchangeSort(int n, number S[]) {
index i, j;
for(i = 1; i <= n; i++) {
for(j = i+1; j <= n; j++)
if(S[j] < S[i]) swap S[i] and S[j];
}
}
swap(index i, j, number &S[]) {
number temp;
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
์๊ฐ๋ณต์ก๋
- ๋จ์ ์ฐ์ฐ: ์กฐ๊ฑด๋ฌธ (S[j], S[i] ๋น๊ต)
- ๋ชจ๋ ๊ฒฝ์ฐ ๋ถ์
- j-loop๊ฐ ์ํ๋ ๋๋ง๋ค ์กฐ๊ฑด๋ฌธ 1๋ฒ์ฉ ์ํ
- ์กฐ๊ฑด๋ฌธ ์ด ์ํ ํ์
- i=1, 2, 3, .., n-1 ์ ๋ฐ๋ผ
- j-loop n-1, n-2, n-3, โฆ, 1 ๋ฒ ์ํ
- $T(n) = (n-1) + (n-2) + โฆ + 1 = \frac{(n-1)n}{2}$
- ์ต์
์ ๊ฒฝ์ฐ
- ๊ธฐ๋ณธ ์ฐ์ฐ: ํ ๋น
- 1๋ฒ ๊ตํํ๋๋ฐ 3๋ฒ ์ง์
- $W(n) = 3(n-1) + 3(n-2) + โฆ + 3 = \frac{3n(n-1)}{2}$
- ํ๊ท ์ ๊ฒฝ์ฐ
- ๊ธฐ๋ณธ ์ฐ์ฐ: ํ ๋น
- i์ j๋ฅผ ๋น๊ตํ์ ๋ i๊ฐ ํด ํ๋ฅ ์ $\frac{1}{2}$, i๊ฐ ํด ๋ ์ง์ ์ด ๋ฐ์ํ๋ฏ๋ก
- ์ง์ ์ ํ์: $\frac{3(n-1)}{2}$
- $A(n) = \frac{3(n-1)}{2} + \frac{3(n-2)}{2} + โฆ + \frac{3}{2} = \frac{3n(n-1)}{4}$
๐ฝ ์ ํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ๋ฌธ์ : ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก n๊ฐ์ ํค ์ ๋ ฌ
- ์ ๋ ฅ: ์์ ์ ์ n, ํค์ ๋ฐฐ์ด S[1..n]
- ์ถ๋ ฅ; ๋น๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ํค์ ๋ฐฐ์ด S[1..n]
์์ฌ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void selectionSort(int n, keytype S[]) {
index i, j, smallest;
for(i = 1; i <= n-1; i++) {
smallest = i;
for(j = i+1; j <= n; j++) {
if(S[j] < S[smallest]) // ๊ธฐ๋ณธ์ฐ์ฐ: ๋น๊ต
smallest = j;
}
exchange S[i] and S[smallest]; // ํ ๋น
}
}
exchange(index i, j, number &S[]) {
number temp;
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
์ ํ ์ ๋ ฌ ๋ถ์ - ๋ชจ๋ ๊ฒฝ์ฐ
- ๊ธฐ๋ณธ ์ฐ์ฐ: ๋น๊ต
i | ํ์ |
---|---|
1 | n-1 |
2 | n-2 |
โฆ | ย |
n-1 | 1 |
- ๋น๊ต ํ์์ ํฉ: $\frac{n(n-1)}{2}$
- $T(n) = \frac{n^2}{2}$
- ๊ธฐ๋ณธ ์ฐ์ฐ: ํ ๋น
- 1๋ฒ ๊ตํํ๋๋ฐ 3๋ฒ ์ง์
- $T(n) = 3(n-1)$
๐ฝ ํ ์ ๋ ฌ
์ต๋ ํ Max Heap
- ์ต๋ ํธ๋ฆฌ
- ์ด์ง ํธ๋ฆฌ์์ ๊ฐ ๋ ธ๋์ ํค ๊ฐ์ด ๊ทธ ์์ ๋ ธ๋๋ณด๋ค ํฐ ํธ๋ฆฌ
- ์ต๋ ํ
- ์ต๋ ํธ๋ฆฌ์ด๋ฉด์ ์์ ์ด์ง ํธ๋ฆฌ
- ์ต๋ ํธ๋ฆฌ์์ ๋ฃจํธ๋ ๊ฐ์ฅ ํฐ ํค ๊ฐ์ ๊ฐ์ง
- ๊ฐ ๋ ธ๋์ ํค ๊ฐ์ ๊ทธ ๋ ธ๋์ ์์ ๋ ธ๋์ ์ ์ฅ๋ ๊ฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์
- ์ฝ์ ์ฐ์ฐ
- ์ญ์ ์ฐ์ฐ
ํ ์ ๋ ฌ์ ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ
shiftdown
: ํ์ ํน์ฑ์ ๋ง์กฑํ๋๋ก ํค ๊ฐ์ ์๋๋ก ๋ด๋ฆฌ๋ ์ฐ์ฐroot
: ๋ฃจํธ ํค๋ฅผ returnํ๊ณ , ๋ฐ๋ฅ ๋ ธ๋๋ฅผ ๋ฃจํธ๋ก ์ฎ๊ฒจ shiftdownํ์ฌ ํ์ ๋ณต์ํจ (์ญ์ ์ฐ์ฐ)removekeys
: ํ์ ํค๋ฅผ ์ ๋ ฌ๋ ์์๋ก ๋ฐฐ์ด์ ์์น์ํค๋ ์๊ณ ๋ฆฌ์ฆmakeheap
: ๋ณธ์ง์ ์ผ๋ก ์์ ํ ์ด์ง ํธ๋ฆฌ๋ฅผ ํ ํธ๋ฆฌ๋ก ๊ตฌ์ฑ
shiftdown()
- ํ ๊ตฌ์กฐ ํน์ฑ ๋ง์กฑํ๋๋ก ๊ตฌ์ฑ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void shiftdown(heap& H, index i) { // i๋ ๋
ธ๋ ๋ฒํธ
index parent, largerchild;
keytype shiftkey;
bool spotfound;
shiftkey = H.S[i];
parent = i;
spotfound = false;
while(2*parent <= H.heapsize && !spotfound) { // ์์ ๋
ธ๋๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด
// ์์ ๋
ธ๋๊ฐ 2๊ฐ๋ผ๋ฉด, ์ผ์ชฝ/์ค๋ฅธ์ชฝ ์ค ์ด๋ ์์ ๋
ธ๋๊ฐ ๋ ํฐ์ง ํ๋ณ
if(2*parent < H.heapsize && H.S[2*parent] < H.S[2*parent+1])
largerchild = 2*parent + 1; // ์ค๋ฅธ์ชฝ
else largerchild = 2*parent; // ์ผ์ชฝ
if(shiftkey < H.S[largerchild]) {
H.S[parent] = H.S[largerchild];
parent = largerchild;
}
else spotfound = true;
}
H.S[parent] = shiftkey;
}
struct heap{
keytype S[1..n];
int heapsize;
};
- ์์ ๋ ธ๋ index: ์ ์ด๋ ๋ถ๋ชจ ๋ ธ๋์ 2๋ฐฐ
makeheap()
- ํ ๊ตฌ์กฐ ๊ตฌ์ฑ
1
2
3
4
5
6
void makeheap(int n, heap& H) {
index i;
H.heapsize = n;
for(i = โn/2โ; i >= 1; i--)
shiftdown(H, i);
}
root()
- ํ ๊ตฌ์กฐ์ ๋ฃจํธ ๊ฐ ์ป๊ธฐ & ํ ๋ณต์
1
2
3
4
5
6
7
8
keytype root(heap& H) {
keytype keyout;
keyout = H.S[1];
H.S[1] = H.S[heapsize]; // ๊ฐ์ฅ ๋ง์ง๋ง ๋
ธ๋๋ฅผ ๋ฃจํธ๋ก
H.heapsize = H.heapsize - 1;
shiftdown(H, 1); // ํ ํธ๋ฆฌ ํน์ฑ ๋ง์กฑํ๋๋ก ๊ตฌ์ฑ
return keyout;
}
removekeys()
- ์ ๋ ฌ
- ํ ๊ตฌ์กฐ์ ๋ฃจํธ๋ฅผ ๋ฐฐ์ด๋ก ์ด๋
1
2
3
4
5
void removekeys(int n, heap H, keytype S[]) {
index i;
for(i = n; i >= 1; i--)
S[i] = root(H);
}
ํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
1
2
3
4
void heapSort(int n, heap& H, keytype S[]) {
makeheap(n, H); // shiftdown()
removeheap(n, H, S); // shiftdown()
}
- makeheap๊ณผ removekeys ๋ชจ๋ shiftdown ํธ์ถํ๋ฏ๋ก ๋ฐ๋ก ๋ถ์
makeheap ์๊ฐ๋ณต์ก๋ - ์ต์ ์ ๊ฒฝ์ฐ
- ๋จ์ ์ฐ์ฐ: shiftdown ํ๋ก์์ ์์์ ํค ๋น๊ต
- $n = 2^k (= 2^d)$๋ผ ๊ฐ์
depth | node ์ | ํค๊ฐ shift๋๋ ์ต๋ ํ์ |
---|---|---|
0 | $2^0$ | d-1 |
1 | $2^1$ | d-2 |
.. | .. | .. |
j | $2^j$ | d-j-1 |
.. | .. | .. |
d-2 | $2^{d-2}$ | 1 |
d-1 | $2^{d-1}$ | 0 |
- ์ต๋ ํ์์ ํฉ
$\sum_{j=0}^{d-1} 2^j (d-j-1)$
= $2^d - d - 1$
- ๊น์ด๊ฐ d์ธ ๊ฒฝ์ฐ shiftdown ๋ ํ์์ ์ํ๊ฐ์ธ d๋ฅผ ๋ํ๋ฉด $2^d - 1$์ด ๋จ
- ํ ๋ฒ shiftdown๋ ๋๋ง๋ค 2๋ฒ์ฉ ๋น๊ต
- ์ค์ ๋น๊ต ํ์: $2(n-1)$
removekeys ์๊ฐ๋ณต์ก๋ - ์ต์ ์ ๊ฒฝ์ฐ
- $n = 2^k (= 2^d)$๋ผ ๊ฐ์
- ์ด shift ํ์: $\sum_{j=0}^{d-1} j2^j = nlg^n - 2n + 2$
- ํ ๋ฒ shift๋ ๋๋ง๋ค 2๋ฒ์ฉ ๋น๊ตํ๋ฏ๋ก ์ค์ ๋น๊ต ํ์: $2nlg^n - 4n + 4$
- ๋ฐ๋ผ์, ์ต์ ์ ๊ฒฝ์ฐ: $W(n) โ ฮ(nlg^n)$
ํ ์ ๋ ฌ ์๊ฐ๋ณต์ก๋
- makeheap ์๊ฐ๋ณต์ก๋ + removekeys ์๊ฐ๋ณต์ก๋
- ์ต์ ์ ๊ฒฝ์ฐ: $W(n) โ ฮ(nlg^n)$
๐ฝ ๊ธฐ์ ์ ๋ ฌ RADIX
- d ๊ฐ์ ์ซ์๋ก ํํํ k์ง๋ฒ ์ฒด๊ณ์ ์๋ฅผ ํค๋ก ํํํ์ฌ ๊ฐ ์ซ์์ ๋ฐ๋ผ ํค๋ฅผ ๋ถ๋ฐฐํ๋ ๋ฐฉ์
๊ฐ ํค์ ๊ฐ์ฅ ์ผ์ชฝ ์ซ์๋ถํฐ ๊ธฐ์ค์ผ๋ก ์ผ๋ ๊ฒฝ์ฐ
์ค๋ฅธ์ชฝ ์ซ์๋ถํฐ ๋ถ๋ฐฐ์ ๊ธฐ์ค์ผ๋ก ์ผ๋ ๊ฒฝ์ฐ
์์ฌ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void radixsort(node_pointer& masterlist, int numdigits) {
// globally node_pointer list[0.9];
index i;
for(i = 1; i <= numdigits; i++) {
distribute(masterlist, i);
coalesce(masterlist);
}
}
void distribute(node_pointer& masterlist, index i) {
index j;
node_pointer p;
for(j = 0; j <= 9; j++) {
list[j] = NULL;
}
p = masterlist;
while(p != NULL) {
j = p -> key์์ ์ค๋ฅธ์ชฝ์ผ๋ก๋ถํฐ i๋ฒ์งธ ์ซ์๊ฐ;
p๋ฅผ list[j]์ ๋์ ๋งํฌ;
p = p -> link;
}
}
void coalesce(node_pointer& masterlist) {
index j;
masterlist = NULL;
for(j = 0; j <= 9; j++)
list[j]์ ์๋ ๋ง๋๋ค์ masterlist์ ๋์ ๋งํฌ;
}
๊ธฐ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋ถ์ - ๋ชจ๋ ๊ฒฝ์ฐ
- ๋จ์ ์ฐ์ฐ: ๋ญ์น์ ์๋ฅผ ์ถ๊ฐํ๋ ์ฐ์ฐ (๋งํฌ ์ฐ์ฐ)
- ์ ๋ ฅ ํฌ๊ธฐ: ์ ๋ ฌํ๋ ์ ์ ๊ฐ์ n, ๊ฐ ์ ์๋ฅผ ์ด๋ฃจ๋ digit์ ์ต๋ ๊ฐ์ numdigits
- ๋ชจ๋ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋
$T(n) = numdigits(n + 10) โ ฮ(numdigits * n)$
This post is licensed under CC BY 4.0 by the author.