Click here to load reader

418115: การโปรแกรมเชิงโครงสร้าง โครงสร้างข้อมูล 1

Embed Size (px)

DESCRIPTION

418115: การโปรแกรมเชิงโครงสร้าง โครงสร้างข้อมูล 1. ประมุข ขันเงิน. Abstract Data Type. Abstract Data Type. ชนิดข้อมูลนามธรรม (Abstract Data Type ย่อว่า ADT) ประกอบด้วย กลุ่มของข้อมูล วิธีการจัดการกับกลุ่มของข้อมูลนี้ เน้นว่าเรา สามารถทำอะไรได้กับกลุ่มข้อมูล ได้บ้าง - PowerPoint PPT Presentation

Citation preview

418115: 1

418115: 11Abstract Data Type2Abstract Data Type (Abstract Data Type ADT) 3: : S: (int, float, char, ) : {1, 2, 5}:add(S, x): x Sremove(S, x): x Scontains(S, x): x S ?4: S = {1,2,3}contains(S, 3) truecontains(S, 4) falseadd( S, 4) S = {1,2,3,4}add(S, 5) S = {1,2,3,4,5}remove(S, 2) S = {1,3,4,5}contains(S, 2) false5: (List) (a0, a1, a2, , an-1) :get(L, i): iset(L, i, x): i xfind(L, x): x L -1 insert(L, i, x): x i i remove(i): i 6: (List) L = (7,2,1,3,9)get(L, 0) 7 get(L, 4) 9set(L, 1, 10) L = (7, 10, 1, 3, 9)insert(L, 2, 9) L = (7, 10, 9, 1, 3, 9)remove(L, 4) L = (7, 10, 9, 1, 9)find(L, 10) 1 find(L, 9) 2 find(L, 2) -1

7: (Stack)push(S, x): stackpop(S): ?stack (stack segment) stack 8: (Stack) S = () stack push(S, 5) S = (5)push(S, 3) S = (5, 3)push(S, 7) S = (5, 3, 7)pop(S) 7 S = (5, 3)push(S, 20) S = (5, 3, 20)

9: (Queue)enqueue(Q, x): queuedequeue(Q): queue 10: (Queue) Q = () enqueue(Q, 5)Q = (5)enqueue(Q, 3)Q = (5, 3)enqueue(Q, 7)Q = (5, 3, 7)dequeue(Q) 5Q = (3, 7)enqueue(Q, 20)Q = (3, 7, 20)dequeue(Q) 3Q = (7, 20)11 ADT? (pattern) ADT ADT 12 (Data Structure) ADT ADT13 ADTADT ADT 1415 C i A A[i] A[i] () C 16 code dynamic memory allocation 17IntArray int struct

typedef struct { int capacity; int *data;} IntArray;

18IntArraydata pointer capacity data[0], data[1], , data[capacity-1]19IntArray Functionsvoid IntArray_alloc(IntArray *a, int capacity) capacityint IntArray_get(IntArray *a, int i) i avoid IntArray_set(IntArray *a, int i, int x) i a xvoid IntArray_clear(IntArray *a) heap void IntArray_init(IntArray *a) a size = capacity = 0 data = NULL20IntArray_initvoid IntArray_init(IntArray *a){ a->size = 0; a->capacity = 0; a->data = NULL;}21IntArray_getint IntArray_get(IntArray *a, int i){ return a->data[i];}

22IntArray_setvoid IntArray_set(IntArray *a, int i, int x){ a->data[i] = x;}23IntArray_allocvoid IntArray_alloc(IntArray *a, int capacity){ if (capacity == 0) { if (a->data != NULL) { free(a->data); a->data = NULL; } a->capacity = 0; } else if (capacity > 0) { int *new_data; if (a->data != NULL) new_data = (int *)realloc(a->data, sizeof(int)*capacity); else new_data = (int *)malloc(sizeof(int) * capacity); if (new_data != NULL) a->data = new_data; else exit(1); a->capacity = capacity; }}24IntArray_setvoid IntArray_clear(IntArray *a){ IntArray_alloc(a, 0);}25int main(){ IntArray A; IntArray_alloc(&A, 3); IntArray_set(&A, 1, 5); IntArray_set(&A, 1, 3); IntArray_set(&A, 1, 7); printf("A[1] = %d\n", IntArray_get(&A, 1)); IntArray_set(&A, 1, 10); printf("A[1] = %d\n", IntArray_get(&A, 1)); IntArray_clear(&A); return 0;}

2627: (a0, a1, a2, , an-1) :get(L, i): iset(L, i, x): i xfind(L, x): x L -1 insert(L, i, x): x i i remove(i): i

28 C user-defined data type IntList intint IntList_get(IntList *L, int i)void IntList_set(IntList *L, int i, int x)int IntList_find(IntList *L, int x)void IntList_insert(IntList *L, int i, int x)void IntList_remove(IntList *L, int i)void IntList_clear(IntList *L)void IntList_init(IntList *L)

29 IntList () size array capacity size capacity = size =

typedef struct{ IntArray arr; int size; } IntList;30 (Representation Invariant)

size i arr i 31IntList_getget(L, i): i : i arr i IntArray_get

int IntList_get(IntList *L, int i){ return IntArray_get(&L->arr, i);}

32IntList_setset(L, i, x): i x: i arr i IntArray_set

void IntList_set(IntList *L, int i, int x){ IntArray_set(&L->arr, i, x); }33IntList_findfind(L, x): x L -1

int IntList_find(IntList *L, int x){ int i; for(i = 0; i < L->size; i++) if (x == IntArray_get(&L->arr, i)) return i; return -1;}

34IntList_insertinsert(L, i, x): x i i : size i arr i

35Before & Aftersize = 5IntListIntArraycapacity = 7data=arr =537109??????IntList_insert(&L, 2, 4)L= size = 6IntListIntArraycapacity = 7data=arr =5347109???L= 36Before & Aftersize = 5IntListIntArraycapacity = 7data=arr =537109??????IntList_insert(&L, 2, 4)L= size = 6IntListIntArraycapacity = 7data=arr =5347109???L= 37Before & After i i size 1

size = 5IntListIntArraycapacity = 7data=arr =537109??????L= size = 6IntListIntArraycapacity = 7data=arr =5347109???L= 38IntListIntArrayIntList_insert(&L, 0, 11)L= capacity = 3data=537size = 3arr =???39 7 3 3?40 1 2 capacity size*2 2 : size = 0 capacity 041 2*size+1 size = 0 size = 0 capacity = 1 size = 1 capacity = 3 size = 3 capacity = 7 size = 7 capacity = 15

42IntListIntArrayIntList_insert(&L, 0, 11)L= capacity = 3data=537size = 3arr =size = 4IntListIntArraycapacity = 7data=arr =11537?????????L= 43IntList_insertvoid IntList_insert(IntList *L, int i, int x){ int k; if (i < 0 || i > L->size) { fprintf(stderr, "index out of range!"); return; } if (L->size + 1 > L->arr.capacity) IntArray_alloc(&L->arr, (L->size) * 2 + 1); for(k = L->size; k > i; k--) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k-1));

IntArray_set(&L->arr, i, x); L->size++;}

44IntList_insertvoid IntList_insert(IntList *L, int i, int x){ int k; if (i < 0 || i > L->size) { fprintf(stderr, "index out of range!"); return; } if (L->size + 1 > L->arr.capacity) IntArray_alloc(&L->arr, (L->size) * 2 + 1); for(k = L->size; k > i; k--) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k-1));

IntArray_set(&L->arr, i, x); L->size++;}

i 45IntList_insertvoid IntList_insert(IntList *L, int i, int x){ int k; if (i < 0 || i > L->size) { fprintf(stderr, "index out of range!"); return; } if (L->size + 1 > L->arr.capacity) IntArray_alloc(&L->arr, (L->size) * 2 + 1); for(k = L->size; k > i; k--) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k-1));

IntArray_set(&L->arr, i, x); L->size++;}

46IntList_insertvoid IntList_insert(IntList *L, int i, int x){ int k; if (i < 0 || i > L->size) { fprintf(stderr, "index out of range!"); return; } if (L->size + 1 > L->arr.capacity) IntArray_alloc(&L->arr, (L->size) * 2 + 1); for(k = L->size; k > i; k--) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k-1));

IntArray_set(&L->arr, i, x); L->size++;}

47IntList_insertvoid IntList_insert(IntList *L, int i, int x){ int k; if (i < 0 || i > L->size) { fprintf(stderr, "index out of range!"); return; } if (L->size + 1 > L->arr.capacity) IntArray_alloc(&L->arr, (L->size) * 2 + 1); for(k = L->size; k > i; k--) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k-1));

IntArray_set(&L->arr, i, x); L->size++;}

size48IntList_removeremove(i): i : size i arr i

49Before & Aftersize = 5IntListIntArraycapacity = 7data=arr =537109??????IntList_remove (&L, 1)L= size = 4IntListIntArraycapacity = 7data=arr =57910?????????L= 50Before & After i size 1size = 5IntListIntArraycapacity = 7data=arr =537109??????L= size = 6IntListIntArraycapacity = 7data=arr =57109?????????L= 51IntList_removevoid IntList_remove(IntList *L, int i){ int k; if (i < 0 || i > L->size-1) { fprintf(stderr, "index out of range!"); return; } for(k = i; k < L->size-1; k++) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k+1)); L->size--;}

52IntList_removevoid IntList_remove(IntList *L, int i){ int k; if (i < 0 || i > L->size-1) { fprintf(stderr, "index out of range!"); return; } for(k = i; k < L->size-1; k++) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k+1)); L->size--;}

i 53IntList_removevoid IntList_remove(IntList *L, int i){ int k; if (i < 0 || i > L->size-1) { fprintf(stderr, "index out of range!"); return; } for(k = i; k < L->size-1; k++) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k+1)); L->size--;}

54IntList_removevoid IntList_remove(IntList *L, int i){ int k; if (i < 0 || i > L->size-1) { fprintf(stderr, "index out of range!"); return; } for(k = i; k < L->size-1; k++) IntArray_set(&L->arr, k, IntArray_get(&L->arr, k+1)); L->size--;}

size55IntList_clear IntArray_clear

void IntList_clear(IntList *L){ IntArray_clear(&L->arr); L->size = 0;}

56IntList_init size = 0 IntArray_init

void IntList_init(IntList *L){ L->size = 0; IntArray_init(&L->arr);}

57int main(){ IntList L; IntList_init(&L); IntList_insert(&L, 0, 10); printf("%d\n", IntList_get(&L, 0)); IntList_insert(&L, 0, 5); printf("%d %d\n", IntList_get(&L, 0), IntList_get(&L, 1)); IntList_insert(&L, 1, 3); printf("%d %d %d\n", IntList_get(&L, 0), IntList_get(&L, 1), IntList_get(&L, 2)); IntList_remove(&L, 0); printf("%d %d\n", IntList_get(&L, 0), IntList_get(&L, 1)); return 0;}

5859: push(S, x): stackpop(S):

60 C user-defined type IntStackvoid IntStack_push(IntStack *S, int x)int IntStack_pop(IntStack *S)void IntStack_clear(IntStack *S)void IntStack_init(IntStack *S)

61IntStack

typedef struct{ IntList list;} IntStack;

clear init IntList_clear IntList_init

62Representation Invariant list.size-1

push pop 63IntStack_pushvoid IntStack_push(IntStack *S, int x){ IntList_insert(&S->list, S->list.size, x);}64IntStack_popint IntStack_push(IntStack *S){ int head = S->list.size-1; int result = IntList_get(&S->list, head); IntList_remove(&S->list, head); return result;}6566: enqueue(Q, x): queuedequeue(Q): queue

67 C user-defined type IntQueuevoid IntQueue_enqueue(IntQueue *Q, int x)int IntQueue_dequeue(IntQueue *Q)void IntQueue_clear(IntQueue *Q)void IntQueue_init(IntQueue *Q)

68IntQueue () ()

typedef struct{ IntList list;} IntQueue;

clear init IntList_clear IntList_init

69Representation Invariant list.size-1 0

enqueue dequeue 0 70IntQueue_enqueuevoid IntQueue_enqueue(IntQueue *Q, int x){ IntQueue_insert(&Q->list, Q->list.size, x);}

71IntQueue_dequeueint IntQueue_dequeue(IntQueue *Q){ int result = IntList_get(&Q->list, 0); IntList_remove(&Q->list, 0); return result;}7273 () main operation

IntArray_get IntArray_set

74 IntListint IntList_get(IntList *L, int i) IntArray_get void IntList_set(IntList *L, int i, int x) IntArray_set

75 IntListint IntList_find(IntList *L, int x) x k IntArray_get k n x list IntArray_get n IntList_find n

76 Big-Oh O(1) O(n)77 Big-Oh: f(n) f(n) = 3n2 + n + 1 O(n2)f(n) = 100n + 10000 O(n)f(n) = 123456789 O(1)

78 IntListint IntList_get(IntList *L, int i)O(1)void IntList_set(IntList *L, int i, int x)O(1)int IntList_find(IntList *L, int x)O(n)79 IntListvoid IntList_insert(IntList *L, int i, int x) O(1) k n-k n O(n) O(n)80 IntListvoid IntList_remove(IntList *L, int i) O(1) k n-k-1 n-1 O(n) O(n)

81 IntStackvoid IntStack_push(IntStack *S, int x) O(1)int IntStack_pop(IntStack *S) O(1)

82 IntQueuevoid IntQueue_enqueue(IntQueue *Q, int x) O(1)int IntQueue_dequeue(IntQueue *Q) n O(n)

83