๋ฐฐ์ด(Array)
- ์์ฐจ ๊ธฐ์ต์ฅ์์ ํ ๋น๋ ์ ํ ๊ฐ์์ ๋์ผ ์๋ฃํ ๋ฐ์ดํฐ ์์๋ค
- ๋ฐฐ์ด๋ช , V: ๋ฐฐ์ด ์ ์ฒด๋ฅผ ์ผ์ปซ๋ ๊ธฐํธ
- ๋ฐฐ์ด ํฌ๊ธฐ, N: ์์๋ฅผ ์ ์ฅํ๋ ์ ๋ค์ ๊ฐ์
- ๋ฐฐ์ด ์ฒจ์, i: ์ ์ ์์ = ์๋์ ์์น
๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ์ปดํ์ผ ์ ๋ฐฐ์ด์ ์ ๋ค์ ๋ฒ ์ด์ค(base)๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐฐ์ด์ ์ฒซ์งธ ์ ์์น๋ถํฐ ์์ํด ์ฐจ๋ก๋ก ํ ๋น๋จ
- ๊ฐ ์ ์ ๋ฒ ์ด์ค๋ก๋ถํฐ ์คํ์ (offset)๋งํผ ๋จ์ด์ง
- ํ ์ฐ์ ์์ = ์ ์ฐจ์ ์ฐ์ ์์
2์ฐจ์ ๋ฐฐ์ด
- ํ ์ด๋ธ์ด๋ผ๊ณ ๋ ๋ถ๋ฆผ
- 1์ฐจ์๊ณผ 2์ฐจ์์ ๊ฐ๊ฐ ํ, ์ด๋ก๋ ๋ถ๋ฆผ
์ฐ๊ฒฐ๋ฆฌ์คํธ(linked list)
- ๋์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋, ๋งํฌ์ ์ํด ์ฐ๊ฒฐ๋ ์ ํ ๊ฐ์์ ๋ฐ์ดํฐ ์์ ๋ ธ๋๋ค
- ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ช : L, ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์์ ์์น, ์ฒซ ๋ ธ๋์ ์ฃผ์
- ์ฐ๊ฒฐ๋ฆฌ์คํธ ํฌ๊ธฐ: n, ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ด ๋ ธ๋์ ์
- ์ข ๋ฅ - ๋จ์ผ, ์ด์ค, ์ํ, ํค๋ ๋ฐ ํธ๋ ์ผ๋ฌ, ๋ณตํฉ ์ฐ๊ฒฐ๋ฆฌ์คํธ
- List, Stack, Queue(๊ณ ๊ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ค)๋ฅผ ์ฐ๊ฒฐ๋ฆฌ์คํธ(์ฌ๋ฃ)๋ก ๊ตฌํํ ์ ์๋ค.
๋ ธ๋์ ์ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ๋ ธ๋: ํ ๊ฐ์ ๋ฐ์ดํฐ ์์๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ
- ๋
ธ๋๋ฅผ ์ํ ๋ฉ๋ชจ๋ฆฌ์ ๋์ ํ ๋น(allocation)๊ณผ ํด์ (deallocation)๋ ์คํ ์๊ฐ์ system call์ ์ํด ์ฒ๋ฆฌ
- getnode(): ๋ ธ๋๋ฅผ ํ ๋น ํ ๊ทธ ๋ ธ๋์ ์ฃผ์ ๋ฐํ (๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ณ ๊ฐ๋ ์์ ์ด๋ฉด null ํฌ์ธํฐ ๋ฐํ)
- putnode(i): ์ฃผ์ i์ ๋ ธ๋์ ํ ๋น๋์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ์ ํด์ ํ ์ด๋ฅผ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐํ (๋ฉ๋ชจ๋ฆฌ ์ฌํ์ฉ ์ํด)
๋จ์ผ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ฐ์ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ ๊ฐ์ฅ ๋จ์ํ ์ฐ๊ฒฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ๋
ธ๋ ์ ์ฅ ๋ด์ฉ
- ์์(element): ๋ฐ์ดํฐ ์์, data field
- ๋งํฌ(link): ๋ค์ ๋ ธ๋์ ์ฃผ์, ๋ค์ ๋ ธ๋์ ์ฃผ์๊ฐ ์๋ ๊ฒฝ์ฐ null ๋งํฌ ์ ์ฅ, link field
- ์ ๊ทผ์
- ์ฒซ ๋ ธ๋ = ํค๋ ๋ ธ๋์ ์ฃผ์
- ๋จ๋ฐฉํฅ์ ์์ฌ์ → → ์ด์ค ์ฐ๊ฒฐ๋ฆฌ์คํธ ๋ฑ์ฅ
์ด์ค์ฐ๊ฒฐ๋ฆฌ์คํธ
- ์ถ๊ฐ ๋งํฌ ์ฌ์ฉํด ์ญ๋ฐฉํฅ ์ํ ๊ฐ๋ฅ
- ๋
ธ๋ ์ ์ฅ ๋ด์ฉ
- ์์
- ๋งํฌ: ๋ค์ ๋ ธ๋์ ์ฃผ์
- ๋งํฌ: ์ด์ ๋ ธ๋์ ์ฃผ์
- ์ ๊ทผ์
- ํค๋๋ ธ๋์ ์ฃผ์
- ํ ์ผ๋ ธ๋์ ์ฃผ์
์ํ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ๋ง์ง๋ง ๋ ธ๋์ ๋งํฌ = ํค๋๋ ธ๋์ ์ฃผ์
- ์ ๊ทผ์ : ํค๋๋ ธ๋์ ์ฃผ์
ํค๋์ ํธ๋ ์ผ๋ฌ
- ํค๋๋ ธ๋ ๋ฐ๋ก ์์ ํน๋ณํ ํค๋(header) ๋ ธ๋ ์ถ๊ฐํด ์์ ํธ์์ฑ ์ฆ์ง
- ๊ฐ์ ๋ชฉ์ ์ผ๋ก ํ ์ผ๋ ธ๋ ๋ฐ๋ก ๋ค์ ํน๋ณํ ํธ๋ ์ผ๋ฌ (trailer) ๋ ธ๋ ์ถ๊ฐ ๊ฐ๋ฅ
- ํน๋ณ ๋
ธ๋ ์ ์ฅ๋ด์ฉ
- ๋ชจ์กฐ ์์(=๋ฐ์ดํฐ๋ ๋ฐ๋ก ์ ์ฅํ์ง ์์ ํน๋ณํ ๋ ธ๋, dummy element)
- ์ ๊ทผ์
- ํค๋๋ ธ๋ ๋๋ ํธ๋ ์ผ๋ฌ๋ ธ๋์ ์ฃผ์
๋ฆฌ์คํธ ADT (Abstract Data Type, ์ถ์์๋ฃํ)
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ค๋ฆ. ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ฆฌ์คํธ๋ ๋ค๋ฅธ ADT ๊ตฌํํ๊ธฐ ์ํ ๋๊ตฌ
- ์์์ ๋ํ ์ ๊ทผ ๋๊ตฌ
- ์์(rank)
- ๋ฉ์๋
- ์ผ๋ฐ ๋ฉ์๋
- boolean isEmpty(): ๋น์ด ์๋์ง ์ ๋น์ด ์๋์ง ๋ฐํ
- integer size(): ๋ฆฌ์คํธ์ ํฌ๊ธฐ ๋ฐํ
- iterator elements()
- ์ ๊ทผ ๋ฉ์๋
- element get(r): ๋ฆฌ์คํธ์์ r์ ์๋์ ์์น
- ๊ฐฑ์ ๋ฉ์๋
- element set(r, e)
- add(r, e), addFirst(e), addLast(e): ์์ ์ฝ์ (ํน์ ํ ์์น์ ์์ ์ฝ์ ํฌํจ)
- element remove(r), element removeFirst(), element removeLast(): ์์ ์ ๊ฑฐ (ํน์ ํ ์์น์ ์์ ์ญ์ ํฌํจ)
- ์ผ๋ฐ ๋ฉ์๋
๋จ์์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๋ฆฌ์คํธ ADT ๊ตฌํ (with C)
// ๋จ์์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ๋ฆฌ์คํธ ADT ๊ตฌํ
#include <stdio.h>
#include <stdlib.h>
// ๊ตฌ์กฐ์ฒด ์ ์ธ (์ ๋
ธ๋)
typedef struct ListNode
{
int data; //data field
struct ListNode* link; // ์๊ธฐ์ฐธ์กฐ ๊ตฌ์กฐ์ฒด
}ListNode;
typedef struct
{
ListNode* head; // head ํฌ์ธํฐ ๊ตฌ์กฐ์ฒด
}LinkedListType;
void init(LinkedListType* L)
{
L->head = NULL; // head๋ NULL๋ก ์ด๊ธฐํ
}
void addFirst(LinkedListType* L, int item)
{
ListNode* node = malloc(sizeof(ListNode));
// getnode ์ญํ , malloc์ผ๋ก ์ง์ ๋
ธ๋ ์์ฑ
// malloc ํจ์๋ ์ฃผ์๋ฅผ ๋ฆฌํดํ๋๊น ํฌ์ธํฐ๋ก ๋ฐ๊ธฐ
// malloc ํจ์๋ ์ด๋ค ๋์์ ์ํ ๊ณต๊ฐ ๋ง๋ค์ด์ง์ง ๋ชฐ๋ผ ํญ์ voidํ ์ฃผ์ ๋ฆฌํด
node->data = item; // node์ data ํ๋์ item ์ง์ด๋ฃ๊ธฐ
node->link = L->head; // ๋ด๊ฐ ๋จผ์ ๋ค์ด๊ฐ๋ ๊ฒ, ํ์ฌ ํค๋๊ฐ ๋ด ๋ค๋ก ๋ค์ด์์ผํจ --> ํ์ฌ head๊ฐ node link๋ก
L->head = node; // ๋ด๊ฐ ํ์ฌ head
}
void addLast(LinkedListType* L, int item)
{
ListNode* node = malloc(sizeof(ListNode));
ListNode* before = L->head;
while(before->link != NULL)
before = before->link; // ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
node->data = item;
node->link = NULL;
before->link = node;
}
void add(LinkedListType* L, int pos, int item)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
ListNode* before = L->head;
for(int i = 0; i < pos - 1; i++)
before = before->link; // before -> link๋ before ์ค๋ฅธ์ชฝ ๋
ธ๋๋๊น ์ค๋ฅธ์ชฝ์ผ๋ก ํ์นธ์ฉ ์ด๋
node->data = item;
node->link = before->link;
before->link = node;
}
// remove
void remove1(LinkedListType* L, int pos)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
ListNode* before = L->head;
for(int i = 0; i < pos - 1; i++)
before = before->link;
before->link = before->link->link; // ์์จ ๋
ธ๋ ์ฐ๊ฒฐ ๋๊ธฐ
}
void removeFirst(LinkedListType* L)
{
L->head = L->head->link;
}
void removeLast(LinkedListType* L)
{
ListNode* before = L->head;
for(int i = 0; i < sizeof(L); i++)
before = before->link;
before->link = NULL;
}
// position์ ์๋ ๊ฐ ๊ฐ์ ธ์ค๋ ํจ์
int get(LinkedListType* L, int pos)
{
ListNode* p = L->head;
for(int i = 1; i < pos; i++)
p = p->link;
return p->data;
}
void set(LinkedListType* L, int pos, int item)
{
ListNode* p = L->head;
for(int i = 1; i < pos; i++)
p = p->link;
p->data = item;
}
void printList(LinkedListType* L)
{
for(ListNode* p = L->head; p != NULL; p = p->link)
printf("[%d] -> ", p->data);
printf("NULL\n");
}
// addLast ๊ตฌํ, add๋ ๋น์ทํ๋ฐ for๋ฌธ์์ ์ข ์๊ฐํด์ผ ํจ
// ํ์ฌ ์ฐ๊ฒฐ๋ฆฌ์คํธ์์ ์ ์ผ ๋ง์ง๋ง ๋
ธ๋๊น์ง ๊ฐ๊ณ ๊ทธ ๋
ธ๋๊ฐ before ๋
ธ๋๊ฐ ๋์ด ๋ด๊ฐ ๊ฑ๋ ์ฐ๊ฒฐ๋์ด์ง๊ณ ๋ฑ๋ฑ..
// remove, removeFirst, removeLast
void main()
{
LinkedListType list;
init(&list);
addFirst(&list, 10); printList(&list);
addFirst(&list, 20); printList(&list);
addFirst(&list, 30); printList(&list);
getchar(); // ์ ๊น ๋ฉ์ถค
add(&list, 1, 40); printList(&list);
add(&list, 1, 50); printList(&list);
add(&list, 3, 60); printList(&list);
addLast(&list, 70); printList(&list);
removeFirst(&list); printList(&list);
removeLast(&list); printList(&list);
remove1(&list, 3); printList(&list);
int pos;
printf("\n ๋ช ๋ฒ ๋
ธ๋์ ๊ฐ์ ๋ฐํํ ๊น์? ");
scanf("%d", &pos);
printf("%d๋ฒ ๋
ธ๋์ ๊ฐ์ %d\n", pos, get(&list, pos));
}
๋ฐฐ์ด๋ก ๋ฆฌ์คํธ ADT ๊ตฌํ (with C)
// ๋ฐฐ์ด๋ก ๋ฆฌ์คํธ ADT ๊ตฌํ
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
typedef struct // array๋ก ์ ์ธ
{
int V[SIZE]; // list ์ญํ ์ ํ ๋ฐฐ์ด
int n; // ์ ์ฒด list ์์ ๊ฐ์ ๊ธฐ์ตํ๋ ๋ณ์
}ArrayList; // ์ด ๊ตฌ์กฐ์ฒด์ ์ด๋ฆ์ ArrayList๋ก ์ ์ธ
void init(ArrayList* L) // ์ฃผ์ ์ค๋๊น ํฌ์ธํฐ L๋ก ๋ฐ๊ธฐ
{
L->n = 0; // L ์์์ ๊ฐ์ 0๊ฐ
}
// traverse method (์ ๊ทผ method)
void traverse(ArrayList* L)
{
for(int i = 0; i < L->n; i++) // ์์์ ๊ฐ์๋ ๋ง์ง๋ง element ๋ฐ๋ก ๋ค์ ์ฒซ ๋ฒ์งธ ๋น์ด์๋ ์นธ ๊ฐ๋ฆฌํด
printf("[%d] ", L->V[i]); // data field๊ฐ
printf("\n");
}
void add(ArrayList* L, int pos, int item) // pos: rank ์ญํ , item: ์ฝ์
๋ ๊ฐ
{
if(L->n == SIZE)
{
printf("fullListException...\n");
exit(1); // ์์ธ์ฒ๋ฆฌ ํ ํ๋ก๊ทธ๋จ ๋๋ด๊ธฐ
}
// invalidPosException... 0 <= post <= L->n
for(int i = L->n - 1; i >= pos; i--)
L->V[i+1] = L->V[i]; // ํ ์นธ์ฉ ์ค๋ฅธ์ชฝ์ผ๋ก ์์น ์ด๋
L->V[pos] = item;
L->n++;
}
int remove1(ArrayList* L, int pos)
{
// exception ์ฒ๋ฆฌ
int item = L->V[pos]; // ๋์ค์ ์ด ๊ฐ return
for(int i = pos + 1; i <= L->n - 1; i++)
L->V[i - 1] = L->V[i];
L->n--;
return item;
}
void main()
{
ArrayList list; // main์์ ArrayList ์ ์ธ
init(&list); // ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ก ์ ๋ฌํ๋ฉฐ ์ด๊ธฐํ --> ๋ณ๊ฒฝ๋๋ ๋ด์ฉ์ ๊ณต์ ํ ์ ์๊ฒ
add(&list, 0, 10); traverse(&list);
add(&list, 0, 20); traverse(&list);
add(&list, 1, 30); traverse(&list);
add(&list, 1, 40); traverse(&list);
add(&list, 3, 50); traverse(&list);
getchar();
remove1(&list, 1); traverse(&list);
remove1(&list, 2); traverse(&list);
}
728x90
'Algorithms > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ด ์ฌ์ดํด (๋ฐฑ์ค 10451) (0) | 2021.10.12 |
---|---|
์ฐ๊ฒฐ์์์๊ฐ์ (๋ฐฑ์ค 11724) (0) | 2021.10.12 |
์ด๋ถ ๊ทธ๋ํ (๋ฐฑ์ค 1707) (0) | 2021.10.08 |
[๊ทธ๋ํ] ์์ ์ ๋ ฌ (0) | 2021.04.14 |
[์๊ณ ๋ฆฌ์ฆ] ๋ณต์ก๋(Complexity)์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ (0) | 2021.01.16 |