Data Abstraction and Basic Data Structures
Abstract Data Type(ADT)
Abstract Data Type
- Structures - data structure declarations
- Functions - operation definitions
An ADT is identified as a Class
- in languages such as C++ and Java
Designing algorithms and proving correctness of algorithms
- based on ADT operations and specifications
Binary Tree ADT
A binary tree
is a set of elements, called nodes, that is empty or satisfies
- There is a distinguished node
called root
- The remaining nodes are divided into two disjoint subsets,
and
, each of which is a binary tree(
is called left subtree and
is called the right subtree of
)
- There is a distinguished node
There are most
nodes at depth
of a binary tree
- A binary tree with
nodes has height at least
- A binary tree with height
has at most
nodes
Stack
- A stack is a linear structure in which insertions and deletions are always made at one end, called top
- This updating policy is called last in, first out(LIFO)
Queue
- A queue is alinear structure in which
- all insertions are done at one end, called the
or
- all deletions are done at the other end, called the
- all insertions are done at one end, called the
- This updating policy is called first in, first out(FIFO)
Priority Queue
- A priority queue is a structure with some aspects of FIFO queue but in which element order is related to each element’s priority, rather than its chronological arrival time
- The one element that can be inspected and removed is the most important element currently in the priority queue
Union-Find ADT for Disjoint Sets
- Through a
Union
operations, two (disjoint) sets can be combined
- Let the set id of the original two set be,
and
- Then, new set has one unique set id that is either
or $t
- Let the set id of the original two set be,
- Through a
Find
operation, the current set id of an element can be retrieved - Often elements are integers and the set id is some particular element in the set, called the leader
Operations
UnionFind create(int n)
- create a set of
singleton disjoint sets
- create a set of
int find(unionFind sets, e)
- return the set id for
- return the set id for
void makeSet(unionFind sets, int e)
- union one singleton set
(
not already in the sets)
- union one singleton set
void union(unionFind sets, int s, int t)
and
are set ids,
- a new set is created by union of set
and set
- the new set id is either
or
, in some case
min(s,t)
Dictionary ADT
- A dictionary is a general associative storage structure
- Items in a dictionary
- have an identifier
- associated information that needs to be stored and retrieved
- no order implied for identifiers in a dictionary ADT
Sorting
Insertion Sort
Input
, an array of elements, and
, the number of elements. The range of indexes is
Output
, with elements in nondecreasing order of their keys
void insertionSort(Element[] E, int n)
int xindex;
for(xindex=1; xindex<n; xindex++)
Element current = E[xindex];
key x = current.key;
int xLoc = shiftVacRec(E, xindex, x);
E[xLoc] = current;
return;
================================================
int shiftVacRec(Element[] E, int vacant, Key x)
int xLoc;
if(vacant == 0)
xLoc = vacant;
else if(E[vacant-1].key <= x)
xLoc = vacant;
else
E[vacant] = E[vacant-1]
xLoc = shiftVacRec(E, vacant-1, x);
return xLoc;
sourcecode
Quick Sort
Quick sort is a randomized sorting algorithm based on the divde-and-conquer paradigm
- Divde
Pick a random element(called pivot) and partition
into
elements less than
elements equal
elements greater than
- Conquer
sortand
- Combine
joinand $G
Partition
- Partition an input sequence as follows
- remove, in turn, each element
from
and
- insert
into
or
, depending on the result of the comparison with the pivot
- remove, in turn, each element
- Each insertion and removal is at the beginning or at the end of a sequence, and hence takes
time
- Thus, the partition step of quick-sort takes
time
Algorithm partition(S, p)
Input sequence S, position p of pivot
Output subsequences L, E, G of the elements of S less than, equal to, or greater than the pivot
L, E, G <- empty sequences
x <- S.remove(p)
while is not S.isEmpty()
y <- S.remove(S.first())
if y<x
L.insertLast(y)
else if y == x
E.insertLast(y)
else
G.insertLast(y)
return L, E, G
Merge Sort
Problem
Given two sequences and
sorted in nondecreasing order, merge them to create one sorted sequence
Strategy
Determine the first item in C: It is the minimum between the first items of and
. Suppose it is the first item of
. Then, the rest of
must be the result of merging the rest of
with
Merge(A, B, C)
if(A is empty)
rest of C = rest of B
else if(B is empty)
rest of C = rest of A
else if(first of A <= first of B)
first of C = first of A
merge(rest of A, B, rest of C)
else
first of C = first of B
merge(A, rest of B, rest of C)
return
Input
Array and indexes
, and
, such that the elements
are defined for
Output
is sorted rearrangement of the same elements
void mergeSort(Element[] E, int first, int last)
if(first<last)
int mid = (first+last)/2
mergeSort(E, first, mid);
mergeSort(E, mid+1, last)
merge(E, first, mid, last)
Heap Sort
A Heap data structure is a binary tree with special properties
- Heap Structure
- Partial order tree property
Heap Structure
- A binary tree
is a heap structure if an only if it satisfies the following conditions(
)
is complete at least through depth
- All leaves are at depth
or
- All paths to a leaf of depth
are to the left of all paths to a leaf of depth
- Such a tree is also called a left-complete binary tree
Partial order tree property
- A tree is a partial order tree if and only if the key at any node is greater than or equal to the keys at each of its children
Construct Heap
Input
A heap structure that does not necessarily have the partial order tree property
Output
with the same nodes rearranged to satisfy the partial order tree property
void constructHeap(H)
if(H is not leaf)
constructHeap(left subtree of H);
constructHeap(right subtree of H);
Element K = root(H);
fixHeap(H, K)
Sorting
heapSort(E, n)
// construct H from E, the set of n elements to be sorted
for(i=m; i>=1; i--)
curMax = getMax(H)
deleteMax(H)
E[i] = curMax;
deleteMax(H)
- copy the rightmost element of the lowest level of
into
- delete the rightmost element on the lowest level of
fixHeap(H,K)
- copy the rightmost element of the lowest level of
fixHeap(H, K)
if(H is leaf)
insert K in root(H);
else
set largerSubHeap to leftSubtree(H) or rightSubtree(H), whichever has larger key at its root. This involves one key comparison
if(K.key >= root(largerSubHeap.key))
insert K in root(H)
else
insert root(largerSubHeap) in root(H)
fixHeap(largerSubHeap, K)
return
Radix sort
Properties for example
- keys are names
- keys are all five-digit decimal integers
- keys are integers between 1 and
For sorting each of these examples, the keys are
- distributed into different piles
- sort each pile individually
- combine all sorted piles
Algorithms that sort by such methods are not in the class of algorithms previously considered because
- to use them we must know something about either the structure or the range of the keys
Startegy
- If the keys are distributed into piles (also called buckets) first according to their least significant digits(or bits, letters, or fields)
- then the problem of sorting the buckets has been completely eliminated
Sorting
List radixSort(List , int
, int
)
List[] buckets = new List[radix];
int fields; // field number within the key
List newL;
for(field=0; field < numFields; field++)
Initialize buckets array to empty lists
distribute(newL, buckets, radix, field);
newL = combine(buckets, radix)
return newL;
void distribute(List , List[]
, int
, int
)
//distribute keys into buckets
List remL;
remL = L;
while(remL is not null)
Element K = first(remL);
int b = maskShift(field, radix, K.key);
buckets[b] = cons(K, buckets[b]); //construct list
remL = rest(remL);
return
List combine(List[] , int
)
//Combine linked lists in all buckets into one list L
int b;
List L, remBucket;
L = null;
for(b = radix-1; b>=0; b--)
remBucket = buckets[b];
while(remBucket is not null)
key K = first(remBucket);
L = cons(K, L)
remBucket = rest(remBucket);
return L;
'Class' 카테고리의 다른 글
[cs224n] Lecture 4 Word Window Classification and Neural Networks (0) | 2018.03.25 |
---|---|
[cs224n] Lecture 1 Natural Language Processing with Deep Learning (0) | 2018.03.10 |
computer network 정리 (0) | 2015.05.08 |
OS(Operating System) 정리 (2) | 2015.04.29 |
Data Structure, 자료구조 정리 (0) | 2015.04.18 |