Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

LetsGit.IT/Kategorie/Struktury danych
Struktury danychhard

Dlaczego dopisanie do dynamicznej tablicy jest amortyzowane O(1)?

Tagi
#dynamic-array#amortized#resizing#big-o
Wróć do kategoriiPrzejdź do quizu

Odpowiedź

Większość dopisań trafia w wolne miejsce i kosztuje O(1). Czasem następuje powiększenie i kopiowanie O(n) elementów; rozłożone na wiele dopisań daje średnio O(1) na operację (amortyzacja).

let capacity = 4;
let size = 0;

function append(x: number) {
  if (size === capacity) {
    capacity *= 2; // resize + copy O(n)
  }
  size++;
}

Odpowiedź zaawansowana

Głębiej

Dynamiczna tablica ma tablicę bazową z pewnym zapasem capacity. Większość dopisań to zapis do kolejnej wolnej komórki (O(1)). Gdy tablica się zapełni, alokuje większą (często 2x) i kopiuje elementy (O(n)).

Dlaczego amortyzowane O(1)? Bo resize jest rzadki. Przy wzroście przez podwajanie łączny koszt kopiowania dla N dopisań to O(N): każdy element jest przenoszony tylko kilka razy, więc średni koszt dopisania pozostaje stały.

Intuicja (podwajanie)

Resizy następują dla rozmiarów 1, 2, 4, 8, 16... Suma kopiowań do N to około 1 + 2 + 4 + ... + N = O(N).

Przykłady

let cap = 4
let size = 0

function append() {
  if (size === cap) {
    cap *= 2 // alokacja + kopiowanie size elementów (O(size))
  }
  size += 1 // zapis w wolne miejsce (O(1))
}

Typowe pułapki

  • Amortyzowane nie znaczy, że worst-case jest O(1): pojedyncze append może być O(n).
  • Mały współczynnik wzrostu (np. +1) powoduje częste kopiowanie i może dać O(n^2)

Powiązane pytania

Struktury danych
Co to jest segment tree i jaką złożoność daje dla zapytań i aktualizacji zakresowych?
#segment-tree#range-query#updates
Struktury danych
Budowanie kopca z tablicy: dlaczego może być O(n), a nie O(n log n)?
#heap#heapify#complexity
Struktury danych
.
  • W krytycznych ścieżkach alokacje/GC mogą dominować; warto pre-allocować (ensureCapacity).
  • Dlaczego resize tablicy haszującej może powodować skoki latencji i jak temu zapobiegać?
    #hash-table#rehash#latency
    Struktury danych
    Co to jest sparse table i do jakich problemów się nadaje?
    #sparse-table#rmq#preprocessing
    Struktury danych
    Co to jest segment tree i do czego służy?
    #segment-tree#range-query#big-o
    Struktury danych
    Na czym polega własność kopca (heap property) w kopcu binarnym?
    #heap#binary-heap#priority-queue