Skip to content
Software Development

Data Structures and Algorithms: A Beginner's Journey — Part 1

Noyon Ahammed
Noyon Ahammed
Full Stack Software Engineer
Aug 14, 2026
·
5 min read
Data Structures and Algorithms: A Beginner's Journey — Part 1

🚀 Why Does DSA Even Matter?

Imagine you're building a delivery app.

At first, you only have a few customers and orders. Almost any way of storing the information seems fine.

Then the app grows.

Now you have thousands of customers, products, orders, and delivery records.

Suddenly, one question becomes very important:

How should we organize all this information so our program can work with it efficiently?

That's where Data Structures and Algorithms — DSA begins.

And despite the intimidating name, the basic idea is surprisingly simple.

📦 Data, Data Structures & Algorithms

Data is simply information.

const customer = "Amina";
const price = 1200;

const order = {
    id: 101,
    customer: "Amina",
    total: 2500
};

But once an application contains thousands or millions of pieces of data, we need a good way to organize them.

🗂️ Data Structure

Think about a warehouse.

If every product were thrown randomly onto the floor, the warehouse would still contain everything — but finding something would be painful.

Shelves, boxes, labels, and numbered sections make things easier.

A data structure does the same thing for software.

It gives data an organized structure.

⚙️ Algorithm

Now suppose the warehouse is organized, but you need to:

  • find product #532
  • sort products by price
  • identify the cheapest item

You need a set of steps to perform those tasks.

That's an algorithm.

function findNumber(numbers, target) {
    for (const number of numbers) {
        if (number === target) {
            return true;
        }
    }

    return false;
}

A simple way to remember it:

📦 Data Structure → How information is organized
⚙️ Algorithm → How we solve a problem using that information

🛠️ What Do We Usually Do With Data?

Most programs repeatedly perform five basic operations:

  • 🔎 Search — find something
  • 👀 Access — get something
  • Insert — add something
  • ✏️ Update — change something
  • 🗑️ Delete — remove something

Different data structures make different operations easier.

And that's exactly why we have more than one data structure.

⏱️ Why Efficiency Matters

Imagine searching for one customer.

With 10 customers, almost anything feels fast.

With 10 million customers, your approach suddenly matters.

Two algorithms can return exactly the same answer while doing dramatically different amounts of work.

That's why DSA introduces two important ideas.

Time Complexity

How does the amount of work grow when the input becomes larger?

Space Complexity

How much additional memory does the solution need?

We often describe this using Big O notation.

Don't worry about the mathematics yet.

Just remember these patterns.

🟢 O(1) — Almost the Same Amount of Work

Imagine numbered lockers.

If someone tells you:

Open locker 52.

You don't inspect lockers 1 → 51.

You go directly to 52.

Arrays can behave similarly.

const users = ["Amina", "Karim", "Sadia"];

console.log(users[1]);

We already know the position.

So the access is roughly:

O(1) — Constant Time

🟡 O(n) — Work Grows With the Data

Now imagine looking for a specific book on an unsorted shelf.

You may have to check every book.

for (const user of users) {
    if (user === "Sadia") {
        console.log("Found!");
    }
}

More users can mean more searching.

That's roughly:

O(n) — Linear Time

🔵 O(log n) — Keep Making the Problem Smaller

Imagine guessing a number between 1 and 100.

Instead of trying:

1 → 2 → 3 → 4 → 5...

you ask:

Is the number greater than 50?

Half the possibilities disappear immediately.

Then you repeat.

This pattern is often:

O(log n)

We'll see it properly when we reach Binary Search.

🔴 O(n²) — Work Can Grow Fast

Nested loops are a common example:

for (let i = 0; i < numbers.length; i++) {
    for (let j = 0; j < numbers.length; j++) {
        console.log(numbers[i], numbers[j]);
    }
}

As the input becomes large, the amount of work can grow very quickly.

That's commonly:

O(n²)

For now, remember one question:

💡 What happens to my solution when the amount of data becomes much larger?

That's the intuition behind Big O.

🗄️ Array — Think of Numbered Lockers

Imagine:

Index:    0        1        2        3
         ┌───────┬────────┬───────┬────────┐
Value:   │ Apple │ Banana │ Mango │ Orange │
         └───────┴────────┴───────┴────────┘

That's a useful way to imagine an array.

const fruits = [
    "Apple",
    "Banana",
    "Mango",
    "Orange"
];

console.log(fruits[2]);

Output:

Mango

Because we know the index, we can jump directly to the item.

Arrays are great when:

  • ✅ order matters
  • ✅ you need access by position
  • ✅ you want to loop through items

But searching for a value may require checking many items.

const mango = fruits.find(
    fruit => fruit === "Mango"
);

And inserting something in the middle may require other items to move.

💡 First Important DSA Lesson

A data structure can be excellent at one operation and less convenient at another.

🔗 Linked List — Follow the Clues

Imagine a treasure hunt.

The first clue tells you where the second clue is.

The second tells you where the third is.

[10] → [20] → [30] → null

That's the basic idea behind a linked list.

Each item is called a node.

A node usually contains:

  • some data
  • a reference to another node
const first = {
    value: 10,
    next: null
};

const second = {
    value: 20,
    next: null
};

first.next = second;

Now:

10 → 20 → null

Singly Linked List

Each node points forward.

A → B → C → D

Doubly Linked List

Nodes can point in both directions.

A ↔ B ↔ C ↔ D

Circular Linked List

The last node connects back to the beginning.

A → B → C
↑       ↓
└───────┘

You don't need to memorize their implementations yet.

The important idea is the connection between nodes.

🍽️ Stack — A Pile of Plates

Imagine placing plates on top of each other.

┌─────────┐
│ Plate C │ ← Remove first
├─────────┤
│ Plate B │
├─────────┤
│ Plate A │
└─────────┘

The last plate added is the first plate removed.

This is called:

LIFO — Last In, First Out

A structure following this behavior is a stack.

const stack = [];

stack.push("Page A");
stack.push("Page B");
stack.push("Page C");

stack.pop();

Page C leaves first.

Common operations:

  • push → add
  • pop → remove
  • peek → inspect the top item

Stacks appear in:

  • ↩️ undo systems
  • 🌐 browser navigation
  • 📞 function calls
  • ♻️ recursion

We'll meet stacks again later.

🚶 Queue — Waiting in Line

Now imagine people waiting at a service counter.

FRONT                           REAR

  👤 A → 👤 B → 👤 C → 👤 D
   ↑
Served first

The person who arrived first should leave first.

That's:

FIFO — First In, First Out

A structure following this behavior is a queue.

const queue = [];

queue.push("Order A");
queue.push("Order B");
queue.push("Order C");

queue.shift();

Order A leaves first.

Important terms:

  • Enqueue → add an item
  • Dequeue → remove the oldest item
  • Front → first waiting item
  • Rear → last waiting item

Queues are common in:

  • 📦 order processing
  • 💬 customer requests
  • 🖨️ print jobs
  • ⚙️ background jobs

A Deque — Double-Ended Queue — simply allows operations from both ends.

🧠 Don't Memorize — Build Mental Pictures

You don't need a huge comparison table.

Remember the behavior instead.

🗄️ Array

Numbered lockers

Great when you want ordered data and quick access by position.

🔗 Linked List

Treasure hunt clues

Each item connects to another item.

🍽️ Stack

Pile of plates

Last In → First Out

🚶 Queue

People waiting in line

First In → First Out

This is the beginning of thinking in DSA.

Instead of asking:

Which data structure should I memorize?

Ask:

What behavior does my problem need?

🎯 Where Do We Go Next?

We've learned several ways to organize information.

But imagine our application now contains:

1,000,000 users.

If finding one user means checking them one by one, that could become expensive.

What if we could say:

user_10592

and jump almost directly to the matching user?

That takes us to the next stage of our journey.

Up Next → Part 2

Hash Tables, Sets, Priority Queues & Heaps

Because sometimes organizing information isn't enough.

We also need to find the right information fast. ⚡

Noyon Ahammed
Noyon Ahammed
Full Stack Software Engineer, Codevioso

Skilled full stack developer with expertise in modern web technologies and frameworks.