0Pricing
DSA Interview Prep · Ders

Graf Gösterimleri ve Dolaşım Kurulumu

Komşuluk listeleriyle yönlü ve yönsüz graflar oluşturun, BFS’yi deque ile, DFS’yi ise yığın veya özyinelemeyle başlatın ve ziyaret takibini yönetin.

Graf Gösterimleri ve Dolaşım Kurulumu, CoddyKit'te ücretsiz bir DSA Interview Prep dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DSA Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DSA Interview Prep kursu toplamda 4 dersten oluşur.

Graf Nedir?

Bir graf, kenarlarla birbirine bağlanan düğümlerden (köşelerden) oluşan bir koleksiyondur. Ağaçların aksine graflarda döngüler, düğümler arasında birden çok yol ve bağlantısız bileşenler bulunabilir. Graflar sosyal ağlar, yol haritaları, bağımlılık ağaçları ve web sayfası bağlantıları gibi gerçek dünya sistemlerini modeller. Neredeyse her karmaşık sistem tasarımı ve algoritma mülakatında graflara değinilir; gösterimlerini ve dolaşmalarını öğrenmek çok önemlidir.

# Graph terminology:
# - V: set of vertices (nodes)
# - E: set of edges
# - Directed graph: edges have direction (A -> B but not B -> A)
# - Undirected graph: edges are bidirectional
# - Weighted graph: edges have costs/weights
# - Cyclic: contains at least one cycle
# - Acyclic: no cycles (DAG = Directed Acyclic Graph)
# - Connected: every node reachable from every other
# - Disconnected: multiple isolated components
print('Graph: nodes + edges, directed/undirected, weighted/unweighted')

Komşuluk Listesi Gösterimi

Bir komşuluk listesi, her düğümün komşularının listesini saklar. Python'da her düğümü bitişik düğümlerin listesiyle eşleyen bir dict kullanın. Bu, mülakat sorularında en yaygın gösterimdir: O(V + E) alan (seyrek graflar için verimli), komşular üzerinde yineleme yapmak için O(derece) ve karma kümesi çeşidiyle komşuluğu kontrol etmek için ortalama O(1). LeetCode grafik sorularının çoğu bu biçimi kullanır.

from collections import defaultdict

# Build an undirected graph
def build_undirected(edges):
    graph = defaultdict(list)
    for u, v in edges:
        graph[u].append(v)
        graph[v].append(u)  # both directions
    return graph

edges = [(0,1), (0,2), (1,3), (2,3), (3,4)]
graph = build_undirected(edges)
print(dict(graph))
# {0:[1,2], 1:[0,3], 2:[0,3], 3:[1,2,4], 4:[3]}

# Directed graph: only one direction
def build_directed(edges):
    graph = defaultdict(list)
    for u, v in edges:
        graph[u].append(v)  # only u -> v
    return graph

Komşuluk Matrisi Gösterimi

Bir komşuluk matrisi, i'den j'ye bir kenar varsa matrix[i][j] = 1 (veya kenarın ağırlığı), aksi durumda 0 değerini alan V×V boyutunda iki boyutlu bir dizidir. Kenar araması için O(1) süre sağlar; ancak kenar sayısından bağımsız olarak O(V²) alan kullanır ve bu nedenle seyrek graflarda verimsizdir. Grafın yoğun olduğu (çok sayıda kenar içerdiği) veya Floyd-Warshall tüm çiftler arasındaki en kısa yollarında olduğu gibi kenarın varlığını hızlıca kontrol etmenin kritik olduğu durumlarda tercih edilir.

# Adjacency matrix for 5 nodes
V = 5
matrix = [[0] * V for _ in range(V)]

edges = [(0,1), (0,2), (1,3), (2,3), (3,4)]
for u, v in edges:
    matrix[u][v] = 1
    matrix[v][u] = 1  # undirected

# Print the matrix:
for row in matrix:
    print(row)
# Neighbour check: O(1)
print('Edge 0-2:', bool(matrix[0][2]))  # True
print('Edge 0-4:', bool(matrix[0][4]))  # False

# Space: O(V^2) vs adjacency list O(V+E)
# Dense graph: matrix often better; sparse: list better

Kenar Listesi Gösterimi

Bir kenar listesi, isteğe bağlı olarak ağırlıklar içeren (kaynak, hedef) demetlerinden oluşan basit bir listedir. O(E) alan kullanır ve tüm kenarlar üzerinde yineleme yapmak kolaydır. Ancak bir düğümün komşularını bulmak için tüm kenarların taranması gerekir: O(E). Kenar listeleri, Bellman-Ford (tüm kenarları n-1 kez gevşetme) ve Kruskal'ın minimum kapsayan ağaç algoritması gibi tüm kenarlar üzerinde tam olarak yineleme yapan grafik algoritmalarında kullanılır.

# Weighted edge list: (source, destination, weight)
edge_list = [
    (0, 1, 4),
    (0, 2, 1),
    (1, 3, 1),
    (2, 3, 5),
    (3, 4, 3)
]

# Useful for:
# Bellman-Ford: iterate all edges n-1 times
# Kruskal's MST: sort by weight then union-find

# Sort by weight for Kruskal:
edge_list_sorted = sorted(edge_list, key=lambda e: e[2])
print('Sorted by weight:', edge_list_sorted)

# Finding neighbours: O(E) scan -- inefficient for traversal
node_0_neighbors = [v for u, v, w in edge_list if u == 0]
print('Node 0 neighbors:', node_0_neighbors)

BFS Kurulumu: Kuyruk ve Ziyaret Edilenler Kümesi

BFS (Genişlik Öncelikli Arama), bir grafı seviyeler hâlinde keşfetmek için bir kuyruk kullanır. Kritik bileşen, döngülü graflarda düğümleri yeniden ziyaret etmeyi önleyen bir ziyaret edilenler kümesidir. Ziyaret edilenler kümesi olmadan döngülü bir graf üzerinde BFS sonsuza kadar döngüye girer. Standart kurulum şöyledir: kuyruğu kaynak düğümle başlatın, onu ziyaret edildi olarak işaretleyin; ardından ziyaret edilmemiş komşuları sırayla kuyruktan çıkarın, işleyin ve kuyruğa ekleyin.

from collections import deque

def bfs(graph, start):
    visited = {start}        # mark source as visited
    queue = deque([start])   # initialise queue
    order = []
    while queue:
        node = queue.popleft()
        order.append(node)
        for neighbour in graph[node]:
            if neighbour not in visited:
                visited.add(neighbour)     # mark BEFORE enqueue
                queue.append(neighbour)
    return order

from collections import defaultdict
graph = defaultdict(list)
for u, v in [(0,1),(0,2),(1,3),(2,3),(3,4)]:
    graph[u].append(v); graph[v].append(u)

print(bfs(graph, 0))  # [0, 1, 2, 3, 4]

DFS Kurulumu: Yığın veya Özyineleme

DFS (Derinlik Öncelikli Arama), geri dönmeden önce her dal boyunca mümkün olduğunca ilerleyerek grafı keşfeder. Bunu özyinelemeli olarak (çağrı yığınını kullanarak) veya yinelemeli olarak (açık bir yığın kullanarak) uygulayabilirsiniz. Her iki yaklaşım da döngülü graflar için bir ziyaret edilenler kümesi gerektirir. Yinelemeli sürüm, özyinelemeli DFS'nin dolaşma sırasını eşleştirmek için komşuları ters sırada yığına ekler; ancak iki uygulamadaki keşif sırası farklı olabilir.

def dfs_recursive(graph, node, visited=None, order=None):
    if visited is None: visited = set(); order = []
    visited.add(node)
    order.append(node)
    for neighbour in graph[node]:
        if neighbour not in visited:
            dfs_recursive(graph, neighbour, visited, order)
    return order

def dfs_iterative(graph, start):
    visited = set()
    stack = [start]
    order = []
    while stack:
        node = stack.pop()
        if node in visited: continue
        visited.add(node)
        order.append(node)
        for neighbour in reversed(graph[node]):  # reverse for same order as recursive
            if neighbour not in visited:
                stack.append(neighbour)
    return order

print('Recursive DFS:', dfs_recursive(graph, 0))
print('Iterative DFS:', dfs_iterative(graph, 0))

BFS ile DFS Ne Zaman Kullanılmalı

Ağırlıksız bir grafta en kısa yola (en az kenara) ihtiyacınız olduğunda veya düğümleri seviyeler hâlinde işlemeniz gerektiğinde BFS seçin. Ulaşılabilen tüm düğümleri keşfetmeniz, döngüleri algılamanız, bağlantılı bileşenleri bulmanız, topolojik sıralama yapmanız veya tüm yolları listelemeniz gerektiğinde DFS seçin. Uygulamada: “en kısa/en az adım” için BFS, “varlık/ulaşılabilirlik/listeleme” için DFS kullanılır.

# BFS use cases:
# - Shortest path in unweighted graph (fewest edges)
# - Level-order traversal
# - Word ladder (minimum transformations)
# - Clone graph

# DFS use cases:
# - Connected components (flood fill)
# - Cycle detection
# - Topological sort
# - All paths between two nodes
# - Maze solving (any path)
# - N-queens, Sudoku (backtracking)

# Both: O(V + E) time, O(V) space for visited
print('BFS: shortest hops | DFS: existence and enumeration')

LeetCode Girdi Biçimlerinden Graf Oluşturma

LeetCode grafik soruları farklı girdi biçimleriyle gelir. Kenar listesi: [[0,1],[0,2]] — komşuluk listesi oluşturun. Komşuluk listesi, dizin tabanlı: graph[i], i'nin komşularının listesidir. Izgara/matris: hücrelerin düğüm, bitişik hücrelerin (yukarı/aşağı/sol/sağ) komşu olduğu m×n boyutunda iki boyutlu bir dizi. Çocukları olan düğüm: Node(val, neighbors) gibi özel sınıflar. Bu biçimleri tanıyın ve ilk adım olarak komşuluk listesine dönüştürün.

# Format 1: edge list -> adjacency list
def edges_to_adj(n, edges):
    graph = [[] for _ in range(n)]
    for u, v in edges:
        graph[u].append(v)
        graph[v].append(u)
    return graph

# Format 2: 2D grid -> adjacency (implicit)
# Neighbours of (r, c): (r-1,c), (r+1,c), (r,c-1), (r,c+1)
DIRS = [(-1,0),(1,0),(0,-1),(0,1)]
def grid_neighbours(grid, r, c):
    rows, cols = len(grid), len(grid[0])
    return [(r+dr, c+dc) for dr, dc in DIRS
            if 0 <= r+dr < rows and 0 <= c+dc < cols]

grid = [[1,1,0],[0,1,1],[1,0,0]]
print('Neighbours of (0,0):', grid_neighbours(grid, 0, 0))
print('Neighbours of (1,1):', grid_neighbours(grid, 1, 1))

Izgaralarda Ziyaret Edilenleri İşaretleme

Izgara sorularında ziyaret edilen hücreleri takip etmenin iki yolu vardır. A seçeneği: (row, col) demetlerinden oluşan ayrı bir visited kümesi kullanmak — O(m*n) ek alan. B seçeneği: ızgarayı yerinde değiştirmek; ziyaret edilen hücreleri bir yer tutucu değerle (örneğin '#' veya 2) işaretleyin ve gerekirse daha sonra eski hâline getirin. Yerinde yaklaşım O(1) ek alan kullanır ve boya doldurma ile ada sayısı sorularında yaygındır.

def num_islands(grid):
    if not grid:
        return 0
    rows, cols = len(grid), len(grid[0])
    count = 0

    def dfs(r, c):
        if r < 0 or r >= rows or c < 0 or c >= cols:
            return
        if grid[r][c] != '1':
            return
        grid[r][c] = '#'  # mark as visited (in-place)
        dfs(r+1, c); dfs(r-1, c)
        dfs(r, c+1); dfs(r, c-1)

    for r in range(rows):
        for c in range(cols):
            if grid[r][c] == '1':
                dfs(r, c)
                count += 1
    return count

grid = [['1','1','0','0'],
        ['1','1','0','0'],
        ['0','0','1','0'],
        ['0','0','0','1']]
print(num_islands(grid))  # 3

BFS'yi Birden Çok Kaynakla Başlatma

Çok kaynaklı BFS, ziyaret edildi olarak işaretlenmiş tüm kaynak düğümlerini kuyruğa başlangıçta ekleyerek aynı anda birden çok düğümden başlar. Bu yaklaşım, “en yakın 0'a uzaklık”, “çürüyen portakallar” ve “duvarlar ve kapılar” gibi, kaynak düğümlerden herhangi birine olan en kısa uzaklığı bulmanız gereken sorularda kullanılır. Çok kaynaklı BFS, tek kaynaklı BFS ile aynı şekilde O(V + E) sürede çalışır; çünkü her düğüm yine en fazla bir kez ziyaret edilir.

from collections import deque

def rotting_oranges(grid):
    rows, cols = len(grid), len(grid[0])
    queue = deque()
    fresh = 0
    # Multi-source: all rotten oranges start at time=0
    for r in range(rows):
        for c in range(cols):
            if grid[r][c] == 2:
                queue.append((r, c, 0))  # (row, col, time)
            elif grid[r][c] == 1:
                fresh += 1
    dirs = [(0,1),(0,-1),(1,0),(-1,0)]
    time = 0
    while queue:
        r, c, t = queue.popleft()
        for dr, dc in dirs:
            nr, nc = r+dr, c+dc
            if 0<=nr<rows and 0<=nc<cols and grid[nr][nc]==1:
                grid[nr][nc] = 2  # mark rotten
                fresh -= 1
                queue.append((nr, nc, t+1))
                time = t + 1
    return time if fresh == 0 else -1

print(rotting_oranges([[2,1,1],[1,1,0],[0,1,1]]))  # 4

Graf Yoğunluğu ve Gösterim Seçimi

Komşuluk listesi ile matris arasındaki seçim, grafın yoğunluğuna — E/V² oranına — bağlıdır. Seyrek bir graf (E << V²) komşuluk listelerinden yararlanır: matris için O(V²) yerine O(V+E) alan. Yoğun bir graf (E ≈ V²) ise komşuluk matrislerinden yararlanır: listelerdeki O(derece) yerine kenar araması için O(1). Mülakat sorularında komşuluk listeleri neredeyse her zaman doğru seçimdir; çünkü soruların çoğu seyrek graflarla ilgilidir.

# Graph density comparison:
# Sparse: social network (V=1B users, avg 200 friends)
#   E = 200 * 1B = 200B << V^2 = 10^18 -> adjacency list
# Dense: complete graph (every node connected to every other)
#   E = V*(V-1)/2 ≈ V^2 -> adjacency matrix

# Interview rule of thumb:
# - Default to adjacency list (defaultdict(list))
# - Use matrix only when asked about dense graph or O(1) edge lookup
# - Grid problems: use implicit adjacency (4-directional neighbours)

print('Sparse graph (E << V^2): use adjacency list')
print('Dense graph (E ~ V^2): consider adjacency matrix')

Hızlı Kontrol

Bu dersteki Veri Yapıları ve Algoritmalar — Kodlama Mülakatı Hazırlığı kavramlarını anlayışınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: üç grafik gösterimini (komşuluk listesi, matris, kenar listesi) ve her birinin ne zaman seçileceğini, döngülü graflarda sonsuz döngüleri önlemek için ziyaret edilenler kümeleriyle BFS ve DFS kurulumunu ve ızgarayı yerinde işaretleme ile çok kaynaklı BFS gibi pratik kalıpları. Sırada, en kısa yolları ve seviye dolaşımını bulmak için BFS'yi uygulayacağız.

Sıkça Sorulan Sorular

“Graf Gösterimleri ve Dolaşım Kurulumu” dersi ücretsiz mi?

Evet — “Graf Gösterimleri ve Dolaşım Kurulumu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DSA Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DSA Interview Prep kursu toplamda 4 dersten oluşur.

“Graf Gösterimleri ve Dolaşım Kurulumu” dersinde ne öğreneceğim?

Komşuluk listeleriyle yönlü ve yönsüz graflar oluşturun, BFS’yi deque ile, DFS’yi ise yığın veya özyinelemeyle başlatın ve ziyaret takibini yönetin. DSA Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

DSA Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te DSA Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Graf Gösterimleri ve Dolaşım Kurulumu” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu DSA Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her DSA Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Graf Gösterimleri ve Dolaşım Kurulumu
  2. BFS: En Kısa Yol ve Seviye Dolaşımı
  3. DFS: Bağlı Bileşenler ve Alan Doldurma
  4. Yönlü ve Yönsüz Graflarda Döngü Algılama
← DSA Interview Prep Sayfasına Dön