CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an...

24
CS 361 – Chapter 2 2.1 – 2.2 Linear data structures Desired operations Implement as an array or linked list Complexity of operations may depend on underlying representation Later we’ll look at nonlinear d.s. (e.g. trees)

Transcript of CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an...

Page 1: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

CS 361 – Chapter 2

• 2.1 – 2.2 Linear data structures– Desired operations– Implement as an array or linked list– Complexity of operations may depend on underlying

representation

• Later we’ll look at nonlinear d.s. (e.g. trees)

Page 2: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Linear

• There are several linear data structures– Each has desired ADT operations– Can be implemented in terms of (simpler) linear d.s.– 2 most common implementations are array & linked list

• Common linear d.s. we can create– Stack

– Queue

– Vector Note: terminology not universal

– List

– Sequence

– …

Page 3: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Implementation

• Array implementation– Already defined in programming language– Fast operations, easy to code– Drawbacks?

• Linked list implementation– We define a head and a tail node– Each node has prev and next pointers, so there are no orphans– Space efficient, but trickier to implement– Need to allocate/deallocate memory often, which may have

unpredictable execution time in practice

• Other implementations possible, but unusual– Array for LL, queue for stack, etc.

Page 4: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Vector

• Each item in collection has a rank: how many items come “before” me

• Rank is essentially an index, but an array implementation is free to put items anywhere (e.g. starting at 1 instead of 0)

• Some useful operations we’d like (names may vary)– get(rank)– set(rank, item)– insert(rank, item) See p.61 for meaning of ins/del– remove(rank)

Which of these operations require(s) a loop?

Page 5: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

List ADT

• Not concerned with index/rank• Position of item is at beginning or end of list, or before/after

some other item.– The ketchup is next to the peanut butter, … But you first should know

where peanut butter is

• Some useful operations:– getFirst() and getLast()– prev(p) and next(p)– replace(p, newItem)– swap(p, q)– Inserting an item at either end of list, or before/after existing one– remove(p)

Which operations inherently require a loop?

Page 6: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Compare implementations

• We can compare array vs. LL implementations based on an analysis of how they perform d.s. operations.– Primarily determined by their representation

• “Sequence” – Combine functionality of vector and list– Again: terminology (vector vs. sequence) not universal.– Sometimes we want to exploit array feature or LL feature– Table on p. 67 compares operation complexity

• Always O(1): size, prev, next, replace, swap• O(1) for array only: retrieve/replace at specific rank• O(1) for list only: insert/remove at a given node• Always O(n): insert/remove at rank• What about searching for an element?

Page 7: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.
Page 8: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Trees

• Read section 2.3– Terminology– Desired operations– How to traverse, find depth & height– Binary trees

– Binary tree properties– Traversals– Implementation

Page 9: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Definitions

• Tree = connected acyclic graph• Rooted tree, as opposed to a free tree

– More useful for us– Nodes arranged in a hierarchy, by level starting with

the root node• Other terms related to rooted trees:

– Relationships between nodes much richer than a LL: parent, child, sibling, subtree, ancestor, descendant

– 2 types of nodes: • Internal• External, a.k.a. Leaf

Page 10: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Definitions (2)

Continuing with rooted trees from now on…• Ordered tree = children of a node are ranked 1st, 2nd, 3rd,

etc.• Binary tree = each node has at most 2 children, called

the left and right child– Not the same as an ordered tree with 2 children. If a

node has only 1 child, we still need to tell if it’s the left or right child.

– (More on binary trees later)• Different kinds of trees difficult to implement a silver-

bullet tree d.s. for all occasions

Page 11: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Why trees?

• Many applications require information stored hierarchically.– Many classification systems– Document structure– File system– Computer program– Mathematical expression– Others?

• We mean the data is hierarchical in a logical sense. The low-level rep’n of the data may still be linear. That will be the programmer’s secret.

Page 12: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Desired tree ops

• getRoot()• findParent(v)• findChildren(v) – returns list or iterator

– An iterator is an object of a special class having methods next() and hasNext()

• isLeaf(v)• isRoot(v)

And then some operations not so tree specific:• swapValuesAt(v1, v2)• getValueAt(v)• setValueAt(v)

Page 13: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Desiderata (2)

• findDepth(v) – distance to root

• findHeight() – max depth of all nodes

• preorderTraversal(v)– Initially call with root– Recursive function– Can be done as

iterator• postorderTraversal(v)

– analogous

• Pseudocode:preorder(v):

process v

for each child c of v:

preorder(c)

postorder(v):

for each child c of v:

postorder(c)

process v

See why they are called pre and post? Try an example tree.

Page 14: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Binary trees

• Each node has 2 children.

• Very useful for CS applications

• Special cases– Full binary tree = each node has 0 or 2 children. Suitable for

arithmetic expressions. Also called “proper” binary tree.– Complete binary tree = All levels except the deepest have the

maximum nodes possible. Deepest level has all of its m nodes in the m leftmost positions.

• Generalizations– Positional tree (as opposed to ordered tree) = children have a

positional number. E.g. A node may have three children at positions 1, 3 and 6.

– K-ary tree = positional tree where there is no child having position higher than k

Page 15: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Binary tree ops

• findLeftChild(v)• findRightChild(v)• findSibling(v) – how would this work?• preorder & postorder traversals can be simplified a little,

since we know we have 2 children• A 3rd traversal! inorder

inorder(v):

inorder(v.left)

process v

inorder(v.right)

• For modeling a mathematical expression, these traversals give rise to: prefix, infix and postfix notation!

Page 16: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.
Page 17: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Binary tree properties

• Suppose we have a full binary tree • n = total number of nodes, h = height of tree

• Think about why these are true…

• h + 1 # leaves 2h

• h # internal nodes 2h – 1

• log2 (n + 1) – 1 h (n – 1) / 2

Page 18: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Expression as tree

• Arithmetic expression is inherently hierarchical• We also have linear/text representations.

– Infix, prefix, postfix

– Note: prefix and postfix do not need grouping symbols

– Postfix expression can be easily evaluated using a stack

• Example: (25 – 5) * (6 + 7) + 9 into a tree– Which is the last operator performed? This is the root.

And we can deduce where left and right subtrees are.

– Next, for the subtree: (25 – 5) * (6 + 7), last op is the *, so this is the “root” of this subtree.

– Notes:

• Resulting binary tree is “full.”

• Numbers are leaves; operators are internal. This is why the tree drawing is straightforward.

Page 19: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Postfix eval

• Our postfix expression is: 25 5 – 6 7 + * 9 +• When you see a number… push.• When you see an operator… pop 2, evaluate, push.• When no more input, pop answer.

25 5 – 6 7 + * 9 +

255

25 206

20

76

201320 260

9260 269

Page 20: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Tree & traversal

• Given a (binary) tree, we can find its traversals. √• How about the other way?

– Mathematical expression had enough context information that 1 traversal would be enough.

– But in general, we need 2 traversals, one of them being inorder.

• Example: Draw the binary tree having these traversals. Postorder: S C X H R J Q T

Inorder: S R C H X T J Q– Hint: End of the postorder is the root of the tree. Find where the root

lies in the inorder. This will show you the 2 subtrees. Continue with each subtree, finding its root and subtrees, etc.

• Exercise: Find 2 distinct binary trees t1 and t2 where preorder(t1) = preorder(t2) and

postorder(t1) = postorder(t2).

Page 21: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Euler tour traversal

• General way to encompass all 3 traversals.• Text p.88 shows “shrink wrap” image of tree• We visit each node on its left, underneath, and its right.• Pseudocode

eulerTour(v):

do v’s left side action // west

eulerTour(v.left) // southwest

do v’s under action // south

eulerTour(v.right) // southeast

do v’s right side action // east

Page 22: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Applications

• Can adapt eulerTour( ):• Preorder traversal: “below” and “right” actions are null• Inorder traversal: “left” and “right” actions are null• Postorder traversal: “left” and “below” actions are null

• Elegant way to print a fully parenthesized expression:– Left action: print “(“– Under action: print node contents– Right action: print “)”

Page 23: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Tree implementation

• Binary trees: internal representation may be array or links

• General trees: array too unwieldy, just do links

• Array-based representation– Assign each node in the tree an index– Root = 1– If a node’s index is p, left child = 2p and right child = 2p + 1– Array operations are quick– Space inefficient. In worst case, n nodes would require index

values up to 2n–1. (How would this happen?) Exponential space complexity is bad.

Page 24: CS 361 – Chapter 2 2.1 – 2.2 Linear data structures –Desired operations –Implement as an array or linked list –Complexity of operations may depend on underlying.

Implement as links

• For binary tree– Each node needs:

• Contents• Pointers to left child, right child, parent

– Tree overall needs a root node to start with.

• For general rooted tree– Each node needs:

• Contents• List of pointers to children; pointer to parent

– Tree overall needs a root node to start with.