0
0
Data-structures-theoryHow-ToBeginner ยท 4 min read

Time Complexity of Array Operations Explained Simply

The time complexity of accessing an array element by index is O(1) because you can directly reach any index. Inserting or deleting elements at the end is O(1) amortized, but doing so at the beginning or middle requires shifting elements, making it O(n). Searching for an element without order is O(n) since you may check each item.
๐Ÿ“

Syntax

Arrays are collections of elements stored in contiguous memory locations. Common operations include:

  • Access: Get element by index, e.g., array[index]
  • Insertion: Add element at a position, e.g., array.insert(position, value)
  • Deletion: Remove element at a position, e.g., array.remove(position)
  • Search: Find element by value, e.g., array.index(value)
python
array = [10, 20, 30, 40]
value = array[2]  # Access
array.insert(1, 15)  # Insert
array.remove(3)  # Delete
index = array.index(20)  # Search
๐Ÿ’ป

Example

This example shows the time complexity behavior of array operations in Python lists, which behave like dynamic arrays.

python
import time

array = list(range(1000000))  # Large array

# Access element at index 500000
start = time.time()
_ = array[500000]
end = time.time()
print(f"Access time: {end - start:.10f} seconds")

# Insert element at start (slow)
start = time.time()
array.insert(0, -1)
end = time.time()
print(f"Insert at start time: {end - start:.10f} seconds")

# Append element at end (fast)
start = time.time()
array.append(1000001)
end = time.time()
print(f"Append at end time: {end - start:.10f} seconds")

# Search for element (linear time)
start = time.time()
index = array.index(500000)
end = time.time()
print(f"Search time: {end - start:.10f} seconds")
Output
Access time: 0.0000000000 seconds Insert at start time: 0.0200002193 seconds Append at end time: 0.0000000000 seconds Search time: 0.0100002289 seconds
โš ๏ธ

Common Pitfalls

Many beginners expect all array operations to be equally fast. However:

  • Inserting or deleting elements at the beginning or middle requires shifting all later elements, causing O(n) time.
  • Searching without sorting means checking each element, also O(n).
  • Appending at the end is usually O(1) amortized, but can be slower if the array needs resizing internally.

Choosing the right data structure matters if you need frequent insertions or deletions in the middle.

python
array = [1, 2, 3, 4, 5]

# Inefficient insertion at start (shifts all elements)
array.insert(0, 0)  # O(n)

# Efficient append at end
array.append(6)  # O(1)
๐Ÿ“Š

Quick Reference

OperationTime ComplexityExplanation
Access by indexO(1)Direct memory access to element
Insert at endO(1) amortizedAdd element at array's end, amortized constant time
Insert at start/middleO(n)Shift elements to make space
Delete at endO(1)Remove last element quickly
Delete at start/middleO(n)Shift elements to fill gap
Search (unsorted)O(n)Check each element until found
โœ…

Key Takeaways

Accessing any element in an array by index is always fast and takes constant time O(1).
Inserting or deleting elements at the start or middle requires shifting elements, making it slower O(n).
Appending or deleting at the end of an array is usually fast, O(1) amortized, due to no shifting needed.
Searching for an element in an unsorted array takes linear time O(n) because each element may need checking.
Choose data structures wisely based on operation needs to avoid performance issues.