voltar aos artigosadvanced topics
$cd~/artigos/data-structures-javascript-estruturas-dados
Advanced Topics
série 33 Conceitos JS·parte 35 de 38

Data Structures: Organizando Dados como um Pro

24 minVanderlei José Alamino

"A escolha da estrutura de dados frequentemente importa mais do que a escolha do algoritmo." — Donald Knuth

A estrutura certa torna operações comuns O(1); a errada transforma tarefas simples em O(n) dolorosos.

snippetJavaScript
const counts = new Map();counts.set('the', (counts.get('the') || 0) + 1); const unique = [...new Set([1, 2, 2, 3])];

Neste guia da série 33 Conceitos JS — projeto open source criado por Leonardo Maldonado — você domina as 6 built-ins do JS e implementa Stack, Queue, Linked List, BST e Graph do zero.

Pré-requisitos: Map, Reduce & Filter, Recursion e Modern JS Syntax (Map/Set).

data-structures-javascript-estruturas-dados.meta.jsonjson

// metadados do artigo

{
  "tag": "advanced topics",
  "readTime": "24 min",
  "author": "Vanderlei José Alamino",
  "source": "33jsconcepts.com",
  "series": "33 Conceitos JS",
  "part": {
    "current": 35,
    "total": 38
  }
}
abrir fonte original
data-structures-javascript-estruturas-dados.mdmarkdown

Fonte de referência

Conteúdo adaptado a partir do guia original em inglês.

33jsconcepts.com
01

seção

Analogia: Organizando uma Biblioteca

snippettext
Stack  → pilha de livros (LIFO)Array  → prateleira ordenada (índice O(1), insert meio O(n))Map    → catálogo indexado (lookup O(1))Set    → autores únicos (sem duplicatas)

Cada estrutura otimiza operações diferentes — escolha pela operação mais frequente.

02

seção

Array

OperaçãoMétodoBig O
Acesso índicearr[i]O(1)
Fim add/removepush, popO(1)
Início add/removeunshift, shiftO(n)
BuscaindexOf, includesO(n)
Meio insertspliceO(n)

Use quando: dados ordenados, acesso por posição, push/pop no fim, iteração sequencial.

03

seção

Object

Pares chave-valor — chaves string/Symbol, O(1) acesso típico.

snippetJavaScript
const user = { name: 'Alice', age: 30 };user.role = 'admin';'name' in user;  // true

Ideal para entidades, config JSON, chaves conhecidas. Limitações: chaves viram string, protótipo, sem .size.

04

seção

Map e Set

Map — chaves de qualquer tipo, ordem de inserção, .size:

snippetJavaScript
const cache = new Map();cache.set(userObj, { lastLogin: Date.now() });for (const [key, val] of cache) { ... }

Set — valores únicos, O(1) has/add/delete:

snippetJavaScript
const unique = [...new Set([1, 2, 2, 3])];  // [1, 2, 3]
ObjectMap
Chavesstring/Symbolany
Sizemanual.size
Iteraçãokeys helperdireto

WeakMap/WeakSet — chaves/valores fracos (GC-friendly), não iteráveis — cache privado, dados por instância.

05

seção

Stack (LIFO)

Último a entrar, primeiro a sair — undo/redo, call stack, parênteses válidos.

snippetJavaScript
class Stack {  constructor() { this.items = []; }  push(item) { this.items.push(item); }  pop() { return this.items.pop(); }  peek() { return this.items.at(-1); }  isEmpty() { return this.items.length === 0; }}

Todas as operações O(1) com array backing.

06

seção

Queue (FIFO)

Primeiro a entrar, primeiro a sair — filas, BFS, schedulers.

snippetJavaScript
class Queue {  enqueue(item) { this.items.push(item); }  dequeue() { return this.items.shift(); }  // O(n) com array!}

Nota: shift() é O(n). Para performance crítica, use linked list ou ponteiros head/tail.

07

seção

Linked List

Nós encadeados por referência — insert/delete no início O(1), acesso por índice O(n).

snippetJavaScript
class Node {  constructor(value) { this.value = value; this.next = null; }} class LinkedList {  prepend(value) {    const node = new Node(value);    node.next = this.head;    this.head = node;  }}
OperaçãoArrayLinked List
ÍndiceO(1)O(n)
Insert inícioO(n)O(1)
Insert fimO(1)O(1) com tail

Use para queues O(1), modificações frequentes no início, sem acesso aleatório.

08

seção

Binary Search Tree

Esquerda < pai < direita — busca/inserção O(log n) média, O(n) pior (desbalanceada).

snippetJavaScript
class BinarySearchTree {  insert(value) { /* desce esquerda/direita */ }  search(value) { /* compara e desce */ }  inOrder(node = this.root, result = []) {    if (node) {      this.inOrder(node.left, result);      result.push(node.value);      this.inOrder(node.right, result);    }    return result;  }}

Dados ordenados inseridos sequencialmente → lista ligada. Árvores balanceadas (AVL, Red-Black) corrigem isso.

09

seção

Graph

Vértices + arestas — redes sociais, mapas, dependências.

snippetJavaScript
class Graph {  constructor() { this.adjacencyList = new Map(); }  addVertex(v) { this.adjacencyList.set(v, []); }  addEdge(v1, v2) {    this.adjacencyList.get(v1).push(v2);    this.adjacencyList.get(v2).push(v1);  }}

BFS usa Queue (nível a nível). DFS usa Stack/recursão (profundidade primeiro). Veja Recursion.

10

seção

Qual Estrutura Usar?

Caso de usoEstrutura
Ordenado + índiceArray
Config JSONObject
Chave any / freq countMap
Valores únicosSet
LIFOStack
FIFOQueue
Insert início rápidoLinked List
Busca ordenadaBST
Relações/conexõesGraph
11

seção

Padrões de Entrevista

Two Sum — Map O(n):

snippetJavaScript
function twoSum(nums, target) {  const seen = new Map();  for (let i = 0; i < nums.length; i++) {    const comp = target - nums[i];    if (seen.has(comp)) return [seen.get(comp), i];    seen.set(nums[i], i);  }  return [];}

Valid Parentheses — Stack:

snippetJavaScript
function isValid(s) {  const stack = [], pairs = { ')': '(', ']': '[', '}': '{' };  for (const c of s) {    if (c in pairs) { if (stack.pop() !== pairs[c]) return false; }    else stack.push(c);  }  return stack.length === 0;}

Reverse Linked List — 3 ponteiros: prev, current, next.

Cycle Detection — Floyd (slow/fast): dois ponteiros, 1 vs 2 passos.

Max Depth Tree — recursão: 1 + max(left, right).

12

seção

Perguntas Clássicas de Entrevista

13

seção

Teste Seu Conhecimento

$ summary --quick

Resumo rápido

  • Array — índice O(1); push/pop O(1); shift/unshift O(n)
  • Object — entidades e config; chaves string
  • Map — chaves any, .size, freq counting
  • Set — únicos; [...new Set(arr)] dedupe
  • Stack LIFO — undo, parsing, DFS
  • Queue FIFO — BFS, tasks; cuidado com shift O(n)
  • Linked List — insert início O(1), sem índice
  • BST — O(log n) média; dados ordenados desbalanceiam
  • Graph — Map adjacency + BFS/DFS
  • Entrevista — lookup O(1)? Map/Set. Ordem ops? Stack/Queue

Créditos da série

Este artigo faz parte de uma série de estudos inspirada no projeto 33 Conceitos JS, criado por Leonardo Maldonado. Todo o conteúdo original está disponível em 33jsconcepts.com.