๋ฆฌ์คํธ์ ์ถ์ ๋ฐ์ดํฐ ํ์
๋ฆฌ์คํธ๋ ์๋ฃ๋ฅผ ์ ๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค์ ํ๋์
๋๋ค.
์ผ์์ํ์์ ํ ์ผ... ๋ฒํท๋ฆฌ์คํธ.. ์์ผ.... ๋ฑ๋ฑ
๋ค์ํ ๋ฆฌ์คํธ๊ฐ ์กด์ฌํฉ๋๋ค.
๋ฆฌ์คํธ์๋ ํญ๋ชฉ๋ค์ด ์ฐจ๋ก๋๋ก ์ ์ฅ๋์ด ์๋ค. ๋ฆฌ์คํธ์ ํญ๋ชฉ๋ค์ ์ด์ ๋๋ ์์น๋ฅผ ๊ฐ์ง๋๋ค.
L = (item0,item1,item2,....,itemn-1)
๋ฆฌ์คํธ ADT
๋ฆฌ์คํธ๋ฅผ ํ์ฉํ๋ฉด ์ด๋ค ์ฐ์ฐ์ ํ ์ ์์๊น์?
- ๋ฆฌ์คํธ์ ์๋ก์ด ํญ๋ชฉ ์ถ๊ฐ (์ฝ์
, ์ฐ์ฐ)
- ๋ฆฌ์คํธ ํญ๋ชฉ ์ญ์ (์ญ์ ์ฐ์ฐ)
- ๋ฆฌ์คํธ ํน์ ํญ๋ชฉ ๊ฒ์(ํ์ ์ฐ์ฐ)
์ด๋ฅผ ์ถ์ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๊ฐ๋จํ ๋ช๊ฐ๋ง ์ ์ ํด๋ณด๋ฉด
- ๊ฐ์ฒด : n๊ฐ์ elementํ์ผ๋ก ๊ตฌ์ฑ๋ ์์ ์๋ ๋ชจ์
- ์ฐ์ฐ:
insert(list,pos,item)::= pos ์์น์ ์์ ์ถ๊ฐ
delete(list,pos) ::= pos ์์น์ ์์ ์ ๊ฑฐ
get_entry(list, pos) ::= pos ์์น์ ์์๋ฅผ ๋ฐํ
์ด์ธ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค๋๊ฐ, ๊ฝ์ฐผ๋ค๋๊ฐ, ๋น์ฌ์๋ค๋๊ฐ, ์ถ๋ ฅํ๋ค๋๊ฐ, ์ค๊ฐ์ ์ฝ์
ํ๋ค๋๊ฐ ๋ฑ๋ฑ
๋ค์ํ ๊ธฐ๋ฅ์ ๋ง๋ค ์ ์๊ฒ ์ต๋๋ค.
๋ฆฌ์คํธ ๊ตฌํ
๊ทธ๋ผ ์์ ๋ง๋ ADT ๋ฅผ ํตํด ๊ตฌํํด๋ด ์๋ค. ์ด๋ฒ๊ธ์์ ๋ฆฌ์คํธ๋ ๋ฐฐ์ด๊ณผ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํฉ๋๋ค.
๋ฐฐ์ด์ ์ด์ฉํ๋ฉด ADT ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ํ์ง๋ง ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋๋ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฅ์ : ๊ตฌํ์ด ๊ฐ๋จํ๊ณ ๋น ๋ฅด๋ค.
๋จ์ : ๋ฐฐ์ด์ ํน์ฑ์ ๋์ ์ผ๋ก ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ด๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅ -> CPU ์๊ฐ ๋ญ๋น ์ด๋
๋ํ ์ค๊ฐ์ ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ์ฝ์ ๋๋ ์ญ์ ๋ฅผ ํ๋ฉด ๊ธฐ์กด์ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ ์ด๋์์ผ์ผํจ.
๊ทธ๋ ๋ค๋ฉด ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๋ฉด ์ด๋จ๊น?
์ฅ์ : ์ค๊ฐ์ ์ฝ๊ฒ ์ฝ์
ํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ ์ ์ฐํ ๋ฆฌ์คํธ ๊ตฌํ
๋จ์ : ๊ตฌํ์ด ๋ณต์กํ๊ณ , ์์์ ํญ๋ชฉ์ ์ถ์ถํ๋ ค๊ณ ํ ๋๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆผ
๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์กด์ฌํฉ๋๋ค. ๋ฐ์ดํฐ์ ์๋ฅผ ์๊ฐํ๊ณ , ํด๋น ๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ค๊ณ๋ฅผ ๊ณ ๋ คํด์ ๋ฆฌ์คํธ๋ฅผ ์ง๋ฉด ๋ ๊ฒ๋๋ค.
๊ตฌํ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
#include <stdio.h>
#define MAX_LIST_SIZE 100 // ๋ฆฌ์คํธ์ ์ต๋ํฌ๊ธฐ
typedef int element; // ํญ๋ชฉ์ ์ ์
typedef struct {
element array[MAX_LIST_SIZE]; // ๋ฐฐ์ด ์ ์
int size; // ํ์ฌ ๋ฆฌ์คํธ์ ์ ์ฅ๋ ํญ๋ชฉ๋ค์ ๊ฐ์
} ArrayListType;
// ์ค๋ฅ ์ฒ๋ฆฌ ํจ์
void error(char* message)
{
fprintf(stderr, "%s\n", message);
exit(1);
}
// ๋ฆฌ์คํธ ์ด๊ธฐํ ํจ์
void init(ArrayListType* L)
{
L->size = 0;
}
// ๋ฆฌ์คํธ๊ฐ ๋น์ด ์์ผ๋ฉด 1์ ๋ฐํ
// ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ๋ฐํ
int is_empty(ArrayListType* L)
{
return L->size == 0;
}
// ๋ฆฌ์คํธ๊ฐ ๊ฐ๋ ์ฐจ ์์ผ๋ฉด 1์ ๋ฐํ
// ๊ทธ๋ ์ง ๋ง์ผ๋ฉด 1์ ๋ฐํ
int is_full(ArrayListType* L)
{
return L->size == MAX_LIST_SIZE;
}
//
element get_entry(ArrayListType* L, int pos)
{
if (pos < 0 || pos >= L->size)
error("์์น ์ค๋ฅ");
return L->array[pos];
}
// ๋ฆฌ์คํธ ์ถ๋ ฅ
void print_list(ArrayListType* L)
{
int i;
for (i = 0; i < L->size; i++)
printf("%d->", L->array[i]);
printf("\n");
}
//
void insert_last(ArrayListType* L, element item)
{
if (L->size >= MAX_LIST_SIZE) { //full์ ํธ์ถ ํด์ค๋ ๋๋ค.
error("๋ฆฌ์คํธ ์ค๋ฒํ๋ก์ฐ");
}
L->array[L->size++] = item; //์ฆ๊ฐ ์ํค๋ ์คํผ๋ ์ด์
์ด ์ค์!
//๋์
ํ๋ ์ฐ์ฐ์ด ์ฐ์ -> ๊ทธ ๋ค์ size๋ฅผ ๋๋ ค์ฃผ๋ ๊ฒ์ด ์ค์ํ๋ค.
}
//
void insert(ArrayListType* L, int pos, element item) //์ค์!!
{
if (!is_full(L) && (pos >= 0) && (pos <= L->size)) {
// pos <= L->size ๋ผ๊ณ ํ๋ ์ด์ ๋ ์๋ก ์ถ๊ฐ๋๋ ๋ฐ์ดํฐ๊น์ง ๊ณ ๋ คํ์ฌ =์ ๋ฃ์๋ค.
for (int i = (L->size - 1); i >= pos; i--) //shift ํ๋ ๊ณผ์ //for์ ์กฐ๊ฑด์ ์ ๋๋ก ์ฐ๋๊ฒ ์ค์ํ๋ค!
//shift ์ฐ์ฐ์ ํ ๋๋ i ๊ฐ 0๋ถํฐ ์์ํ๋ฉด ๋ค์ ์๋์ ํํ
์์ด์ฐ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ง์ง๋ง๋ถํฐ ์์ํด์ค์ผ์ง ์ ๋๋ก ์ฎ๊ธธ ์ ์๋ค.
L->array[i + 1] = L->array[i];
L->array[pos] = item;
L->size++;
}
}
//
element delete(ArrayListType* L, int pos)
{
element item;
//insert 0<= pos <= L->size 3๊ฐ 0,1,2...(3)์ ๋ฃ๋ ๊ฒ์ด ๋ง์ด ๋๋ค.
//delete 0,1,2,...() ์ฌ๊ธฐ์ 3์ ์ ํจํ์ง ์์ ์์น๋ผ์ ๊ฑธ๋ฌ์ค๋ค.
//insert์ delete์ ๋ฐ๋ผ ์ ํจํ ์์น๋ฅผ ์ฒดํฌํ๋ ๋ฒ์๊ฐ ๋ค๋ฅด๋ค.!
if (pos < 0 || pos >= L->size)
error("์์น ์ค๋ฅ");
item = L->array[pos];
for (int i = pos; i < (L->size - 1); i++) //์ด๋ฒ์ ์์ ์์ด๋ถํฐ ๋ก๊ธด๋ค. ๋ค์์๋ถํฐ ๋ก๊ธฐ๋ฉด ๋ ์์ด์ฐ๊ฒ ๋๋ค.
//size ๊ฐ 4๋๊น size-1๊น์ง for ๋ฌธ์ด ๋๋๋ก ํด์ผํ๋ค. <=๋ฅผ ์ํ๊ณ <๋ง ํ๋ค.
L->array[i] = L->array[i + 1]; //์ด ๋ถ๋ถ์ ์ด๋ป๊ฒ ํ๋์ ๋ฐ๋ผ for ๋ฌธ ์์ ์กฐ๊ฑด์ด ๋ฌ๋ผ์ง๋ค.
L->size--;
return item;
}
void insert_first(ArrayListType* L, element item) {
if (!is_full(L)) {
//pos 0 index ๊ฐ์ ์ ์ฅํ ๊ณํ
// 0, 1, ...,size-1 -> 1,2,...,size
for (int i = L->size - 1; i >= 0; i--) {
L->array[i + 1] = L->array[i];
}
L->array[0] = item;
L->size++;
}
}
//
int main(void)
{
// ArrayListType๋ฅผ ์ ์ ์ผ๋ก ์์ฑํ๊ณ ArrayListType๋ฅผ
// ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ค.
ArrayListType list;
init(&list); //size = 0
insert_first(&list, 10); print_list(&list);
insert(&list, 0, 10); print_list(&list); // 0๋ฒ์งธ ์์น์ 10 ์ถ๊ฐ
insert(&list, 0, 20); print_list(&list); // 0๋ฒ์งธ ์์น์ 20 ์ถ๊ฐ
insert(&list, 0, 30); print_list(&list); // 0๋ฒ์งธ ์์น์ 30 ์ถ๊ฐ
insert_last(&list, 40); print_list(&list); // ๋งจ ๋์ 40 ์ถ๊ฐ
delete(&list, 0); print_list(&list); // 0๋ฒ์งธ ํญ๋ชฉ ์ญ์
return 0;
}
์คํ์๊ฐ ๋ถ์
๋ฐฐ์ด๋ก ๊ตฌํํ ๋ฆฌ์คํธ์ ์๊ฐ๋ณต์ก๋๋ get๊ณผ ๊ฐ์ ์์๋ฅผ ์ฐพ๋ ์ฐ์ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ๋ O(1)์ด ๋๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ฝ์ ์ด๋ ์ญ์ ๋ ๋ค๋ฅธ ํญ๋ชฉ๋ค์ด ์ด๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ๋ O(n)์ด ๋๊ฒ ์ต๋๋ค.
'์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C์ธ์ด] ๋จ์ด๋ค์ ์ ์ฅํ๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ (0) | 2020.11.06 |
---|---|
[C์ธ์ด] ์ฐ๊ฒฐ๋ฆฌ์คํธ (linked list) (0) | 2020.11.06 |
[์๋ฃ๊ตฌ์กฐ] counting sort ๊ณ์์ ๋ ฌ (0) | 2020.08.18 |
[์๋ฃ๊ตฌ์กฐ] ์ํฅ์ ํ์ ๋ ฌ heapsort (0) | 2020.08.13 |
[์๋ฃ๊ตฌ์กฐ] c++ sortํจ์๋ฅผ ํ์ฉํ ์ ๋ ฌ (0) | 2020.08.12 |