Click here to load reader
Upload
bianca-richmond
View
22
Download
0
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