Popcorn Hack 1
arr = [1, 2, 3, 4, 5]
# Constant time (O(1)) - Direct access
print("O(1):", arr[2]) # 3
# Linear time (O(n)) - Loop through entire list
print("O(n):")
for num in arr:
print(num)
O(1): 3
O(n):
1
2
3
4
5
Popcorn Hack 2
arr = [1, 2, 3]
# Unique pairs
def print_unique_pairs(arr):
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
print(f"({arr[i]}, {arr[j]})")
print_unique_pairs(arr)
(1, 2)
(1, 3)
(2, 3)
Popcorn Hack 3
# Question 1: Which is inefficient for large inputs?
# Answer: b) Factorial Time
# Question 2: Which can be represented by a nested loop?
# Answer: c) Quadratic Time
Homework Hacks
def time_complexity_demo(arr, complexity_type):
if complexity_type == "constant":
return arr[0] # O(1)
elif complexity_type == "linear":
for item in arr: # O(n)
print(item)
elif complexity_type == "quadratic":
for i in arr: # O(n²)
for j in arr:
print(f"({i}, {j})")
# Example test calls:
arr = [5, 10, 15, 20, 25]
print("Constant Time Result:", time_complexity_demo(arr, "constant"))
print("\nLinear Time:")
time_complexity_demo(arr, "linear")
print("\nQuadratic Time:")
time_complexity_demo(arr, "quadratic")
Constant Time Result: 5
Linear Time:
5
10
15
20
25
Quadratic Time:
(5, 5)
(5, 10)
(5, 15)
(5, 20)
(5, 25)
(10, 5)
(10, 10)
(10, 15)
(10, 20)
(10, 25)
(15, 5)
(15, 10)
(15, 15)
(15, 20)
(15, 25)
(20, 5)
(20, 10)
(20, 15)
(20, 20)
(20, 25)
(25, 5)
(25, 10)
(25, 15)
(25, 20)
(25, 25)