WGU C949 STUDY GUIDE

0.0(0)
studied byStudied by 2 people
0.0(0)
call kaiCall Kai
learnLearn
examPractice Test
spaced repetitionSpaced Repetition
heart puzzleMatch
flashcardsFlashcards
GameKnowt Play
Card Sorting

1/94

encourage image

There's no tags or description

Looks like no tags are added yet.

Last updated 2:15 PM on 12/17/25
Name
Mastery
Learn
Test
Matching
Spaced
Call with Kai

No analytics yet

Send a link to your students to track their progress

95 Terms

1
New cards

Array

A data structure that stores an ordered list of items, with each item is directly accessible by a positional index.

2
New cards

Linked List

A data structure that stores ordered list of items in nodes, where each node stores data and has a pointer to the next node.

3
New cards

Bianary Search Tree

A data structure in which each node stores data and has up to two children, known as a left child and a right child.

4
New cards

Hash Table

A data structure that stores unordered items by mapping (or hashing) each item to a location in an array (or vector).

5
New cards

Hashing

mapping each item to a location in an array (in a hash table).

6
New cards

Chaining

handles hash table collisions by using a list for each bucket, where each list may store multiple items that map to the same bucket.

7
New cards

Hash key

value used to map an index

8
New cards

bucket

each array element in a hash table

ie A 100 elements hash table has 100 buckets

9
New cards

modulo hash function

computes a bucket index from the items key.

It will map (num_keys / num_buckets) keys to each bucket.

ie... keys range 0 to 49 will have 5 keys per bucket.

50 / 10 = 5

10
New cards

hash table searching

Hash tables support fast search, insert, and remove.

Requires on average O(1)

Linear search requires O(N)

11
New cards

modulo operator %

common has function uses this. which computes the integer remainder when dividing two numbers.

Ex: For a 20 element hash table, a hash function of key % 20 will map keys to bucket indices 0 to 19.

12
New cards

Max-Heap

A binary tree that maintains the simple property that a node's key is greater than or equal to the node's childrens' keys. (Actually, a max-heap may be any tree, but is commonly a binary tree).

*a max-heap's root always has the maximum key in the entire tree.

13
New cards

Heap storage

Heaps are typically stored using arrays. Given a tree representation of a heap, the heap's array form is produced by traversing the tree's levels from left to right and top to bottom. The root node is always the entry at index 0 in the array, the root's left child is the entry at index 1, the root's right child is the entry at index 2, and so on.

14
New cards

Max-heap insert

An insert into a max-heap starts by inserting the node in the tree's last level, and then swapping the node with its parent until no max-heap property violation occurs.

The upward movement of a node in a max-heap is sometime called percolating.

Complexity O(logN)

15
New cards

Max-heap remove

Always a removal of the root, and is done by replacing the root with the last level's last node, and swapping that node with its greatest child until no max-heap property violation occurs.

Complexity O(logN)

16
New cards

Percolating

The upward movement of a node in a max-heap

17
New cards

Min-Heap

Similar to a max-heap, but a node's key is less than or equal to its children's keys.

18
New cards

Heap - Parent and child indices

Because heaps are not implemented with node structures and parent/child pointers, traversing from a node to parent or child nodes requires referring to nodes by index. The table below shows parent and child index formulas for a heap.

ie

1) parent index for node at index 12? 5

*** ((12-1) // 2) = 5 or 12 //2 -1 = 5

2) child indices for a node at index 6? 13 & 14

** 2 6 + 1 = 13 and 2 * 6 + 2 = 14

**Double# and add 1, double# and add 2

Node index Parent Index Child Indices

0 N/A 1, 2

1 0 3, 4

2 0 5, 6

3 1 7, 8

4 1 9, 10

5 2 11, 12

19
New cards

Heap - parent_index

parent_index = (node_index - 1) // 2

or node_index // 2 - 1

20
New cards

Heap - left_child_index

left_child_index = 2 * node_index + 1

21
New cards

Heap - right_child_index

right_child_index = 2 * node_index + 2

22
New cards

Implementing priority queues with heaps.

Both functions return the value in the root, but the Pop function removes the value and the Peek function does not. Pop is worst-case O(logN) and Peek is worst-case O(1).

Push and pop operate have runtime O(logN). All other operations (Peek, IsEmpty, GetLength) happen in constant time O(1).

23
New cards

Array based list

A list ADT implemented using an array. An array-based list supports the common list ADT operations, such as append, prepend, insert after, remove, and search.

24
New cards

Linked list vs Array

If a program requires fast insertion of new data, a linked list is a better choice than an array.

25
New cards

Abstract Data Type (ADT)

A data type described by predefined user operations, such as "insert data at rear," without indicating how each operation is implemented.

26
New cards

List

An ADT for holding ordered data. Dups ok

Sequence type: A mutable container with ordered elements.

Underlying data structures: Array, linked list

27
New cards

Array in Java

generic class that supports different data types. declared as follows, where T is the data type.

28
New cards

Tuple

Sequence type: An immutable container with ordered elements.

29
New cards

Stack

An ADT in which items are only inserted on or removed from the top of a stack.

*Last-in First-Out

Underlying data structures: Linked list

Push(stack, x), pop(stack), peek(stack), IsEmpty(stack), GetLength(stack)

*Pop & peek should not be used on a empty stack.

30
New cards

Stack operations

Example starting with stack: 99, 77 (top is 99).

Push(stack, x)

Inserts x on top of stack

Push(stack, 44). Stack: 44, 99, 77

Pop(stack)

Returns and removes item at top of stack

Pop(stack) returns: 99. Stack: 77

Peek(stack)

Returns but does not remove item at top of stack

Peek(stack) returns 99. Stack still: 99, 77

IsEmpty(stack)

Returns true if stack has no items

IsEmpty(stack) returns false.

GetLength(stack)

Returns the number of items in the stack

GetLength(stack) returns 2.

31
New cards

Implementing a stack in python (Linear data structure)

Can be implemented in Python using a class with a single LinkedList data member.

The class has two methods, push() and pop().

push() adds a node to the top of the stack's list by calling LinkedList's prepend() method.

*New elements are place on the top of the stack, not at the bottom of the stack.

pop() removes the head of the stack's list by calling the LinkedList's remove_after() method and then returns the removed node.

32
New cards

Implementing a queue in python (Linear data structure)

Can also be implemented in Python using a class with a single LinkedList data member and class methods push() and pop().

push() adds a node to the end of the queue's list by calling LinkedList's append() method.

*New elements are added to the end of a queue.

The pop() method removed the queue's head node and is identical to Stack's pop() method.

33
New cards

Queue

An ADT in which items are inserted at the end of the queue and removed from the front of the queue.

*first-in first-out ADT.

Underlying data structures: Linked list, Array, Vector

The Queue class' push() method uses the LinkedList append() method to insert elements in a queue.

Both the Stack and Queue pop() methods operate exactly the same by removing the head element and returning the removed element.

34
New cards

Linked List

A linear data structure, much like an array, that consists of nodes, where each node contains data as well as a link to the next node, but that does not use contiguous memory.

Head and tail node

The LinkedList class implements the list data structure and contains two data members, head and tail, which are assigned to nodes once the list is populated. Initially the list has no nodes, so both data members are initially assigned with None.

If the node has no next node, the next data member is assigned with None, the Python term signifying the absence of a value.

35
New cards

Doubly-linked lists

In a previous section, the LinkedList class was defined, making use of the Node class. The Node class defined previously can be extended from the singly-linked list version to include a reference variable called prev that refers to the previous node in the list. When a new node is first constructed, the prev variable is assigned with None.

Creating a doubly-linked node or a doubly-linked list is still the same as creating a singly-linked node and a singly-linked list.

A linked list's head node does not have a previous node, thus the prev data member has a value of None.

36
New cards

Deque

Short for double-ended queue- an ADT in which items can be inserted and removed at both the front and back.

Underlying data structures: Linked list

37
New cards

Bag

An ADT for storing items in which the order does not matter and duplicate items are allowed.

Underlying data structures: Linked list, Array

38
New cards

Set

An ADT for a collection of distinct items. (no dups!)

Underlying data structures: Binary search tree, Hash table

39
New cards

Priority queue

A queue where each item has a priority, and items with higher priority are closer to the front of the queue than items with lower priority. Dups ok

Underlying data structures: Heap

*In addition to push and pop, a priority queue usually supports peeking and length querying. A peek operation returns the highest priority item, without removing the item from the front of the queue.

Pop returns front or head item which is top priority item

40
New cards

Dictionary (Map)

A dictionary is an ADT that associates (or maps) keys with values.

Underlying data structures: Binary search tree, Hash table

41
New cards

Dictionary key characteristic

They are unique and immutable.

42
New cards

Dictionary method

D1[key].remove(value)

43
New cards

dict.items()

returns a view object that yields (key, value) tuples.

44
New cards

dict.keys()

returns a view object that yields dictionary keys.

45
New cards

dict.values()

returns a view object that yields dictionary values.

46
New cards

Dict for loop

A for loop over a dict retrieves each key in the dict.

ie.. for key in dictionary:

47
New cards

dict operations

my_dict[key]

Indexing operation - retrieves the value associated with key.

john_grade = my_dict['John']

my_dict[key] = value

Adds an entry if the entry does not exist, else modifies the existing entry.

my_dict['John'] = 'B+'

del my_dict[key]

Deletes the key entry from a dict.

del my_dict['John']

key in my_dict

Tests for existence of key in my_dict

if 'John' in my_dict: # ...

48
New cards

dict methods

my_dict.clear()

Removes all items from the dictionary

my_dict = {'Bob': 1, 'Jane': 42}

my_dict.clear()

print(my_dict)

{}

my_dict.get(key, default)

Reads the value of the key entry from the dict. If the key does not exist in the dict, then returns default.

my_dict = {'Bob': 1, 'Jane': 42}

print(my_dict.get('Jane', 'N/A'))

print(my_dict.get('Chad', 'N/A'))

42

N/A

my_dict1.update(my_dict2)

Merges dictionary my_dict with another dictionary my_dict2. Existing entries in my_dict1 are overwritten if the same keys exist in my_dict2.

my_dict = {'Bob': 1, 'Jane': 42}

my_dict.update({'John': 50})

print(my_dict)

{'Bob': 1, 'Jane': 42, 'John': 50}

my_dict.pop(key, default)

Removes and returns the key value from the dictionary. If key does not exist, then default is returned.

my_dict = {'Bob': 1, 'Jane': 42}

val = my_dict.pop('Bob')

print(my_dict)

{'Jane': 42}

49
New cards

Underlying data structures: Binary search tree, Hash table

Set, Dictionary(Map)

50
New cards

Underlying data structures: Heap

Priority queue

51
New cards

Underlying data structures: Linked list, Array

Bag, Queue, List

52
New cards

Underlying data structures: Linked list

Deque, Stack

53
New cards

Common operations for ADT List

Append, Prepend, InsertAfter, Print, PrintReverse, Sort, Remove, Search, IsEmpty, GetLength

54
New cards

Common operations for ADT Queue, Stack, Deque

Push, Pop, Peak, IsEmpty, GetLength

55
New cards

Float

Data type is a single-precision 32-bit IEEE 754 floating point. Use a float (instead of double) if you need to save memory in large arrays of floating point numbers.

56
New cards

Double

A data type is a double-precision 64-bit IEEE 754 floating point. For decimal values, this data type is generally the default choice.

57
New cards

Byte

Data type is an 8-bit signed two's complement integer. The byte data type is useful for saving memory in large arrays.

58
New cards

Range(5)

0 1 2 3 4

Every integer from 0 to 4

59
New cards

Assignment vs comparison

= vs ==

60
New cards

garbage collection

It reclaims memory from data structures implemented using linked allocations. Python is a managed language, meaning objects are deallocated automatically by the Python runtime, and not by the programmer's code. When an object is no longer referenced by any variables, the object becomes a candidate for deallocation.

Python's garbage collector will deallocate objects with a reference count of 0. However, the time between an object's reference count becoming 0 and that object being deallocated may differ across different Python runtime implementations.

61
New cards

Reference Count

An integer counter that represents how many variables reference an object. When an object's reference count is 0, that object is no longer referenced.

62
New cards

Memory allocation

The process of an application requesting and being granted memory.

Memory used by a Python application must be granted to the application by the operating system. When an application requests a specific amount of memory from the operating system, the operating system can then choose to grant or deny the request.

Python does this automatically

63
New cards

Binary search

is an algorithm that searches a SORTED LIST for a key by first comparing the key to the middle element in the list and recursively searching half of the remaining list so long as the key is not found.

64
New cards

constructor

The __init__ method, commonly known as a constructor, is responsible for setting up the initial state of the new instance.

65
New cards

Null

A special value indicating a pointer points to nothing.

66
New cards

Graph

A data structure for representing connections among items, and consists of vertices connected by edges.

Graph is a data structure that consists of following two components:

A vertex (vertices) represents an item (node) in a graph. An edge represents a connection between two vertices in a graph.

67
New cards

vertex

item in a graph. A finite set of vertices also called as nodes

V -> Number of Vertices

68
New cards

edge

a connection between two vertices in a graph. A finite set of ordered pair of the form (u, v)

E -> Number of Edges

69
New cards

Graph weight

Weighted Graph : The Graph in which weight is associated with the edges.

Unweighted Graph : The Graph in which their is no weight associated to the edges.

70
New cards

Graph Direction

Undirected Graph : The graph in which all the edges are bidirectional.

Directed Graph : The graph in which all the edges are unidirectional.

71
New cards

Binary Tree

In a list, each node has up to one successor. In a binary tree, each node has up to two children, known as a left child and a right child. "Binary" means two, referring to the two children.

72
New cards

Leaf

A tree node with no children.

73
New cards

Internal node

A node with at least one child.

74
New cards

Parent

A node with a child is said to be that child's parent.

75
New cards

Node's ancestors

include the node's parent, the parent's parent, etc., up to the tree's root.

76
New cards

Root

The one tree node with no parent (the "top" node).

77
New cards

Depth, level, and height (bianary tree)

The link from a node to a child is called an edge.

A node's depth is the number of edges on the path from the root to the node. The root node thus has depth 0.

All nodes with the same depth form a tree level.

A tree's height is the largest depth of any node. A tree with just one node has height 0.

78
New cards

A binary tree is full if:

every node contains 0 or 2 children.

79
New cards

A binary tree is complete if:

all levels except possibly the last are completely full, and the last level has all its nodes to the

left side

80
New cards

A binary tree is perfect if:

if all internal nodes have 2 children and all leaf nodes are at the same level.

81
New cards

Tree traversal

An algorithm visits all nodes in the tree once and performs an operation on each node.

82
New cards

BST inorder traversal

Visits all nodes in a BST from smallest to largest, which is useful for example to print the tree's nodes in sorted order. Starting from the root, the algorithm recursively prints the left subtree, the current node, and the right subtree.

Left -> Root -> Right

83
New cards

Preorder traversal

Root -> Left -> Right

84
New cards

Binary search tree (BST)

An especially useful form of binary tree, which has an ordering property that any node's left subtree keys ≤ the node's key, and the right subtree's keys ≥ the node's key. That property enables fast searching for an item, as will be shown later.

*When searching, search always starts at the root

85
New cards

Pop()

Stack: 99, 77, 66

The pop() removes the head of the stack's list by calling the LinkedList's remove_after() method and then returns the removed node.

Pop(stack) returns: 99. Stack: 77

Queue: queue: 43, 12, 77

The pop() method removed the queue's head node and is identical to Stack's pop() method.

Pop(queue) returns: 43. Queue: 12, 77

Priority Queue:

Removes and returns the item at the front of the queue, which has the highest priority.

86
New cards

Push()

Stack: numStack 7, 5

push() adds a node to the top of the stack's list by calling LinkedList's prepend() method.

*New elements are place on the top of the stack, not at the bottom of the stack. push(numStack, 8) = 8, 7, 5

Queue: queue: 43, 12, 77

push() adds a node to the end of the queue's list by calling LinkedList's append() method.

*New elements are added to the end of a queue.

Push(queue, 56). Queue: 43, 12, 77, 56

Priority Queue:

The priority queue push operation inserts an item such that the item is closer to the front than all items of lower priority, and closer to the end than all items of equal or higher priority.

87
New cards

O(logN)

We write O(logN) not O(log10N) or O(log^2N)

88
New cards

Fast sorting algorithm

A sorting algorithm that has an average runtime complexity of O(N logN) or better.

89
New cards

Bubble sort algorithm

*Look for something that swaps so the result can "bubble" to the top. best used when the data is small

Sorting algorithm that iterates through a list, comparing and swapping adjacent elements if the second element is less than the first element. Bubble sort uses nested loops. Given a list with N elements, the outer i-loop iterates N times.

Because of the nested loops, bubble sort has a runtime of O(N2). Bubble sort is often considered impractical for real-world use because many faster sorting algorithms exist.

Figure 11.20.1: Bubble sort algorithm.

BubbleSort(numbers, numbersSize) {

for (i = 0; i < numbersSize - 1; i++) {

for (j = 0; j < numbersSize - i - 1; j++) {

if (numbers[j] > numbers[j+1]) {

temp = numbers[j]

numbers[j] = numbers[j + 1]

numbers[j + 1] = temp

}}

90
New cards

Bucket sort algorithm

*Look for something that distributes the values into "buckets" where they are individually sorted. *Bucket sort is mainly useful when input is uniformly distributed over a range.

The bucket index is calculated as ⌊number∗(N−1)/M⌋

N =number of buckets

M =maximum value of M

ie 71 and 99 placed in the same bucket?

71 bucket 2 71 * (5-1) // 99 = 2

BucketSort(numbers, numbersSize, bucketCount) {

if (numbersSize < 1)

return

buckets = Create list of bucketCount buckets

// Find the maximum value

maxValue = numbers[0]

for (i = 1; i < numbersSize; i++) {

if (numbers[i] > maxValue)

maxValue = numbers[i] }

// Put each number in a bucket

for each (number in numbers) {

index = floor(number * (bucketCount - 1) / maxValue)

Append number to buckets[index] }

// Sort each bucket

for each (bucket in buckets)

Sort(bucket)

// Combine all buckets back into numbers list

result = Concatenate all buckets together

Copy result to numbers

}

91
New cards

Merge sort algorithm

**Look for something that continually splits a list in half.

A sorting algorithm that divides a list into two halves, recursively sorts each half, and then merges the sorted halves to produce a sorted list. The recursive partitioning continues until a list of 1 element is reached, as list of 1 element is already sorted.

mergedNumbers[mergePos] = numbers[rightPos]

92
New cards

Quickselect algorithm

**Look for keywords "Pivot" and/or "Split"

selects the kth smallest element in a list. Ex: Running quickselect on the list (15, 73, 5, 88, 9) with k = 0, returns the smallest element in the list, or 5.

The best case and average runtime complexity of quickselect are both O(N). In the worst case, quickselect may sort the entire list, resulting in a runtime of O(N2).

Figure 11.21.1: Quickselect algorithm.

// Selects kth smallest element, where k is 0-based Quickselect(numbers, first, last, k) {

if (first >= last)

return numbers[first]

lowLastIndex = Partition(numbers, first, last)

if (k <= lowLastIndex)

return Quickselect(numbers, first, lowLastIndex, k)

return Quickselect(numbers, lowLastIndex + 1, last, k)

}

93
New cards

Big-O Complexity Chart

Best to worst

O(1)

O(log n)

O(n)

O(n log n)

O(n^2)

O(2^n)

O(nl)

94
New cards

Big-O Average runtime complexity

Selection sort O(N2) Not fast

Insertion sort O(N2) Not fast

Shell sort O(N1.5) No fast

Quicksort O(NlogN) fast

Merge sort O(NlogN) fast

Heap sort O(NlogN) fast

Radix sort O(N) fast (integer only)

95
New cards

Radix sort

10 buckets

Explore top flashcards