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 danychmedium

Lista sąsiedztwa vs macierz sąsiedztwa — kiedy którą wybrać?

Tagi
#graph#adjacency-list#adjacency-matrix#complexity
Wróć do kategoriiPrzejdź do quizu

Odpowiedź

Macierz zajmuje O(V^2) pamięci i daje O(1) sprawdzenie krawędzi, więc jest dobra dla gęstych grafów. Lista zajmuje O(V+E) pamięci i lepiej pasuje do rzadkich grafów oraz iterowania po sąsiadach.

Odpowiedź zaawansowana

Głębiej

Wybór zależy głównie od gęstości grafu i operacji, które dominują.

Lista sąsiedztwa:

  • Pamięć: O(V + E)
  • Iterowanie sąsiadów u: O(deg(u))
  • Sprawdzenie krawędzi (u, v): O(deg(u)), chyba że trzymasz set per wierzchołek

Macierz sąsiedztwa:

  • Pamięć: O(V^2)
  • Iterowanie sąsiadów u: O(V) (skanujesz cały wiersz)
  • Sprawdzenie krawędzi (u, v): O(1)

Kiedy co wybrać

  • Graf rzadki (E dużo mniejsze niż V^2): lista.
  • Graf gęsty albo mnóstwo zapytań o istnienie krawędzi: macierz.
  • Algorytmy:
  • BFS/DFS/Dijkstra: zwykle lista.
  • Floyd–Warshall / domknięcie przechodnie: macierz (często z bitsetami).

Przykłady

// Lista sąsiedztwa
const adj: number[][] = Array.from({ length: n }, () => [])
adj[u].push(v)

// Macierz sąsiedztwa
const mat: boolean[][] = Array.from({ length: n }, () => Array(n).fill(false))
mat[u][v] = true

Powiązane pytania

Struktury danych
Lista sąsiedztwa vs macierz sąsiedztwa: kiedy wybrać które?
#graph#adjacency-list#adjacency-matrix
Struktury danych
Budowanie kopca z tablicy: dlaczego może być O(n), a nie O(n log n)?
#heap#heapify#complexity
Algorytmy
Typowe pułapki
  • Macierz szybko staje się nierealna pamięciowo: V=50k to 2.5 mld komórek.
  • Dla grafu skierowanego kierunek ma znaczenie (u->v != v->u).
  • Dla grafów ważonych musisz przechowywać wagi (lista: pary; macierz: liczby/Infinity).
Heap sort: jaka jest złożoność czasowa, pamięciowa i stabilność?
#heapsort#sorting#complexity
Algorytmy
Bitmask DP (subset DP): co to jest i jaka jest typowa złożoność?
#dp#bitmask#subset
Algorytmy
Sliding window: co to jest i kiedy jest lepsze niż zagnieżdżone pętle?
#sliding-window#two-pointers#complexity