Open ericltw opened 4 years ago
SampleRecursion (parameter) {
if (base case satisfied) {
return some base value
} else {
SampleRecursion(modified parameter)
}
}
Recursion | iteration | |
---|---|---|
Space efficient | No (system stack) | Yes |
Time efficient | No (system stack, some push, pop operation) | Yes |
Ease of code | Yes | No |
如上方的其一條件不成立,則避免使用recursion。
算法的運行時間基於
透過對算法的輸入大小增加,排除其他因素,量化算法運行所花費的時間。
演算法有多快不是以秒衡量,是以步驟次數。
判別給定算法的效率。
用於表示演算法時間複雜度的方式。
為一個演算法的時間複雜度的增長上限。
f(n) is O(g(n)), if for some positive constants c and k, f(n) <= c * g(n) whenever n > k.
為一個演算法時間複雜度的增長下界。
f(n) belongs to Ω(g(n)), if for some positive constants c and k, f(n) is >= c * g(n) whenever n > k.
同時為一個演算法時間複雜度的增長上限與下界。
f(n) is Θ(g(n)), if for some positive constants c1, c2 and k, c1 g(n) <= f(n) and f(n) <= c2g(n) whenever n > k.
so f(n) is Θ(g(n)) 代表 f(n) is O(g(n)) and f(n) is Ω(g(n)).
Algorithm Analysis & Time Complexity Simplified
https://medium.com/@randerson112358/algorithm-analysis-time-complexity-simplified-cd39a81fec71
Asymptotic Bounding 101: Big O, Big Omega, & Theta
https://www.udemy.com/course/learn-data-structure-algorithms-with-java-interview
array是element的集合,每個element都由index所標識,這樣每個element的位置都可以透過index計算出來。
One Dimensional
Multi Dimensional
One Dimensional
2 Dimensional
3 Dimensional
Declare
Instantiation of an Array
compiler為array分配memory location。
在reference variable儲存array第一個cell的memory address。
Initialization
Time Complexity | Space Complexity | |
---|---|---|
Create an empty Array | O(1) | O(n) // |
Insert a value | O(1) | O(1) |
Traversing a given Array | O(n) | O(1) |
Accessing given cell | O(1) | O(1) |
Searching a given value | O(n) | O(1) |
Deleting a given cell's value | O(1) | O(1) |
Time Complexity | Space Complexity | |
---|---|---|
Create an empty Array | O(1) | O(mn) |
Insert a value | O(1) | O(1) |
Traversing a given Array | O(mn) | O(1) |
Accessing given cell | O(1) | O(1) |
Searching a given value | O(mn) | O(1) |
Deleting a given cell's value | O(1) | O(1) |
為linear的資料結構,element是單獨的object。每個element(node)包含兩個item,data和下一個node的reference。linked list的重要特性是其大小是可變的。
linear data structure
element以線性的方式組織,element一個接一個地連接。traversing of data很容易,可以一次性順序地訪問所有數據(traversed in a single run),如array, linked list, stack, queue。
non-linear data structure
element不是以線性方式組織。不能一次性順序地訪問所有數據(traversed in a single run), 如:graph, tree。
array | linked list | |
---|---|---|
separate object | no | yes |
change variable size | no | yes |
random access | yes | no |
Node
包含data和下一個node的reference。
Head
儲存第一個node的reference。
Tail
儲存最後一個node的reference,目的是將node插入list的尾端,運行時間為O(1)。
Single Linked List
每個node都儲存data和下一個node的reference,不儲存前一個node的reference。
Circular Single Linked List
與single linked list相同,但最後一個node儲存第一個node的reference。
Double Linked List
每一個node都儲存data, 下一個和前一個node的reference。
Circular Double Linked List
與double linked list相同,但最後一個node儲存第一個node的reference,第一個node儲存最後一個node的reference。
Single Linked List
最基礎的linked list類型,提供add / remove node的彈性。
Circular Single Linked List
Double Linked List
Circular Double Linked List
對比於array,linked list的儲存並非儲存在連續的記憶體位置,每個node分散在記憶體各處,透過node儲存的reference彼此連結。
loop from head to tail.
loop from head to tail.
將head, tail設為null。
Time Complexity | Space Complexity | |
---|---|---|
Creation (one node) | O(1) | O(1) |
Insertion | O(n) | O(1) |
Searching | O(n) | O(1) |
Traversing | O(n) | O(1) |
Deletion of a node | O(n) | O(1) |
Deletion of linked list | O(1) | O(1) |
Time Complexity | Space Complexity | |
---|---|---|
Creation (one node) | O(1) | O(1) |
Insertion | O(n) | O(1) |
Traversing | O(n) | O(1) |
Searching | O(n) | O(1) |
Deletion of a node | O(n) | O(1) |
Deletion of linked list | O(1) | O(1) |
Time Complexity | Space Complexity | |
---|---|---|
Creation (one node) | O(1) | O(1) |
Insertion | O(n) | O(1) |
Traversing | O(n) | O(1) |
Searching | O(n) | O(1) |
Deletion of a node | O(n) | O(1) |
Deletion of linked list | O(n) | O(1) |
Time Complexity | Space Complexity | |
---|---|---|
Creation (one node) | O(1) | O(1) |
Insertion | O(n) | O(1) |
Traversing | O(n) | O(1) |
Searching | O(n) | O(1) |
Deletion of a node | O(n) | O(1) |
Deletion of linked list | O(n) | O(1) |
Array | Linked List | |
---|---|---|
Create (empty array / one node) | O(1) | O(1) |
Insertion at 1st position | O(1) | O(1) |
Insertion at last position | O(1) | O(1) |
Insertion at nth position | O(1) | O(n) |
Delete from 1st position | O(1) | O(1) |
Delete from last position | O(1) | O(n) / O(1) |
Delete from nth position | O(1) | O(n) |
Searching in unsorted data | O(n) | O(n) |
Searching in sorted data | O(log n) | O(n) |
Accessing nth element | O(1) | O(n) |
Traversing | O(n) | O(n) |
Deleting entire array / linked list | O(1) | O(1) / O(n) |
CreateStack
Push
Pop
Peek
返回last value of stack,但不會取出該value。
isEmpty
返回stack是否為空。
isFull
與isEmpty相反(topOfStack == arr.size)。
DeleteStack
Array
Linked List
Time Complexity | Space Complexity | |
---|---|---|
Create Stack | O(1) | O(n) |
Push | O(1) | O(1) |
Pop | O(1) | O(1) |
Peek | O(1) | O(1) |
isEmpty | O(1) | O(1) |
isFull | O(1) | O(1) |
Delete Stack | O(1) | O(1) |
Time Complexity | Space Complexity | |
---|---|---|
Create Stack | O(1) | O(1) |
Push | O(1) | O(1) |
Pop | O(1) | O(1) |
Peek | O(1) | O(1) |
isEmpty | O(1) | O(1) |
Delete Stack | O(1) | O(1) |
Time Complexity | Space Complexity | |
---|---|---|
CreateQueue | O(1) | O(n) |
Enqueue | O(1) | O(1) |
Dequeue | O(1) | O(1) |
Peek | O(1) | O(1) |
isEmpty | O(1) | O(1) |
isFull | O(1) | O(1) |
DeleteQueue | O(1) | O(1) |
deQueue的操作造成blank cell linear queue (array implementation).
Time Complexity | Space Complexity | |
---|---|---|
CreateQueue | O(1) | O(n) |
Enqueue | O(1) | O(1) |
Dequeue | O(1) | O(1) |
Peek | O(1) | O(1) |
isEmpty | O(1) | O(1) |
isFull | O(1) | O(1) |
DeleteQueue | O(1) | O(1) |
Time Complexity | Space Complexity | |
---|---|---|
CreateQueue | O(1) | O(1) |
Enqueue | O(1) | O(1) |
Dequeue | O(1) | O(1) |
Peek | O(1) | O(1) |
isEmpty | O(1) | O(1) |
DeleteQueue | O(1) | O(1) |
linked list對比array更佳節省空間(不須事先宣告),且不會有滿空間的情況。
linked list對比array更節省空間,但在insertion, deletion增加了運算時間,時間複雜度由O(1) 變為O(n),searching的時間複雜度也維持於O(n)。tree的目的解決linked list insertion, deletion, 和searching時間複雜度的問題。
Root
沒有parent的node。
Edge
同時連結parent和child的node。
Leaf
沒有children的node。
Sibling
兩個children擁有同一個parent。
Ancestor
指的是某個node的parent, grand-Parent...
Depth of Node
從root到node的path length。
Height of Node
從deepest node到node的path length。
Height of Tree
與height of root node相同。
Depth of Tree
與depth of root node相同。
Predecessor
immediate previous node in inorder traversal of the binary tree.
Successor
immediate next node in inorder traversal of the binary tree.
Strict Binary Tree
每個node有兩個children或沒有。
Full Binary Tree
每個non-leaf node有兩個children,所有的leaf node都在同一級別。
Complete Binary Tree
除了最後一級別以外的所有級別都以完全填滿,在最後一個level,所有的key都靠左。
Depth First Search
Root -> Left Subtree -> Right Subtree
preorderTraversal(root)
if (root equals null)
return error message
else
print root
preorderTraversal(root.left)
preorderTraversal(root.right)
Left Subtree -> Root -> Right Subtree
inOrderTraversal(root)
if (root equals null)
return error message
else
inOrderTraversal(root.left)
print(root)
inOrderTraversal(root.right)
Left Subtree -> Right Subtree -> Root
postOrderTraversal(root)
if (root equals null)
return
else
postOrderTraversal(root.left)
postOrderTraversal(root.right)
print root
Breadth First Search
levelOrderTraversal(root)
Craete a Queue(Q)
enqueue(root)
while(Queue is not empty)
enqueue() the child of first element
dequeue() and print
if root == null
return error message
else
do a level order traversal
if value found
return success message
return unsuccessful message
if root is blank
insert new node at root
else
do a level order traversal and find the first blank space
insert in that blank place
search for the node to be deleted
find deepest node in the tree
copy deepest node's data in current node
delete deepest node
root = null;
Time Complexity | Space Complexity | |
---|---|---|
Createion of Tree (blank) | O(1) | O(1) |
Insertion of value in tree | O(n) | O(n) |
Deletion of value from tree | O(n) | O(n) |
Searching for a value in tree | O(n) | O(n) |
Traversing a tree | O(n) | O(n) |
Deleting entire tree | O(1) | O(1) |
Binary Search Tree為Binary Tree,所有的node滿足以下property:
BST的目的是優化linked list searching, insertion, deletion的時間複雜度,由O(n)優化為O(log n)。
initial Root with null.
BST_Search(root, value)
if (root is null)
return null
else if (root == value)
return root
else if (value < root)
BST_Search(root.left, value)
else if (value > root)
BST_Search(root.right, value)
BST_Insert(currentNode, valueToInsert)
if (current is null)
create a node, insert 'valueToInsert' in it
else if (valueToInsert <= currentNode's value)
currentNode.right = BST_Insert(currentNode.right, valueToInsert)
else
currentNode.left = BST_Insert(currentNode.left, valueToInsert)
return currentNode
deleteNodeOfBST(root, valueToBeDeleted)
if (root == null) return null;
if (valueToBeDeleted < root's value)
root.left = deleteNodeOfBST(root.left, valueTOBeDeleted)
else if (valueToBeDeleted > root's value)
root.right = deleteNodeOfBST(root.right, valueToBeDeleted)
else //current node is the node to be deleted
if root have both children, then find minimum element from right subtree (case#3)
replace current node with minimum node from the right subtree and delete minimum node from right
else if nodeToBeDeleted has only left child (case#2)
root = root.Left()
else if nodeToBeDeleted has only right child (case#2)
root = root.Right()
else root = null
return root;
root = null;
Time Complexity | Space Complexity | |
---|---|---|
Creation of Tree | O(1) | O(1) |
Searching of Value | O(log n) | O(log n) |
Traversing Tree | O(n) | O(n) |
Insertion of Node | O(log n) | O(log n) |
Deletion of Node | O(log n) | O(log n) |
Deleting entire Tree | O(1) | O(1) |
基於給定的incoming data,BST將歪斜成長,導致insertion, searching, deleting的時間複雜度從理想的O(log n)變為O(n)。AVL tree試圖解決這個問題,透過'Rotation'的概念。
AVL tree為balanced Binary Search Tree,任何node的left subtree和right subtree高度最多相差1。如任何left subtree和right subtree高度相差超過1,都會經過rotation以恢復此屬性。empty height 被視為-1。
same as binary search tree.
rightRotate(currentDisbalancedNode)
newRoot = currentDisbalancedNode.Left
currentDisbalancedNode.Left = currentDisbalancedNode.Left.Right
newRoot.Right = currentDisbalancedNode
currentDisbalancedNode.Height = caculateHeight(currentDisbalancedNode)
newRoot.Height = caculateHeight(newRoot)
leftRotate(currentDisbalancedNode'sLeftChild)
newRoot = currentDisbalancedNode'sLeftChild.Right
currentDisbalancedNode'sLeftChild.Right = currentDisbalancedNode'sLeftChild.Right.Left
newRoot.left = currentDisbalancedNode'sLeftChild
currentDisbalancedNode'sLeftChild.Height = caculateHeight(currentDisbalancedNode'sLeftChild)
newRoot.Height = caculateHeight(newRoot)
return newRoot;
Time Complexity | Space Complexity | |
---|---|---|
Creation of AVL Tree | O(1) | O(1) |
Insertion of node | O(log n) | O(log n) |
Deletion of node | O(log n) | O(log n) |
Searching a value | O(log n) | O(log n) |
Traversing entire AVL Tree | O(n) | O(n) |
Deleting entire AVL Tree | O(1) | O(1) |
Worst case | Worst case | |
---|---|---|
BST | AVL | |
Creation of Tree | O(1) | O(1) |
Insertion of node | O(n) | O(log n) |
Deletion of node | O(n) | O(log n) |
Searching of value | O(n) | O(log n) |
Traversing entire Tree | O(n) | O(n) |
Deleting entire Tree | O(1) | O(1) |
createHeap
創建blank array用於儲存heap。
peekTopOfHeap
return min / max from heap.
extractMin / extractMax
extract min / max from heap. We can extract only this node.
sizeOfHeap
return heap size.
insertValueInHeap
insert value in heap.
deleteHeap
deletes the entire heap.
insertValueInHeap(value)
if (tree does not exist)
return error message
else
insert 'value' in first unused cell of array
sizeOfHeap ++
heapifyBottomToTop(sizeOfHeap)
extractMin()
if (tree does not exist)
return error message
else
extract 1st cell of array
promote last element to first
sizeOfHeap --
heapifyTopToBottom(1)
Time Complexity | Space Complexity | |
---|---|---|
createHeap | O(1) | O(n) |
peekTopOfHeap | O(1) | O(1) |
sizeOfHeap | O(1) | O(1) |
insertValueInHeap | O(log n) | O(log n) |
extractMin / extractMax | O(log n) | O(log n) |
deleteHeap | O(1) | O(1) |
extractMin中取得最後一個node需要O(n)。
Introduction
What is Data Structure
解決問題的數據組織。
What is Algorithm
解決特定問題的系統方法,為計算過程的本質。
What is Program
用某種程式語言實現算法。
Types of Data Structure
資料結構分為兩種類型,primitive DS, Non-Primitive DS
Reference