Algorithm - Graph
Hamiltonian Path
-
Vertex
를 기준으로 한다.
-
NP
란 비결정론적 튜링 기계
로 다항 시간
안에 풀 수 있는 판정 문제의 집합
이다.
-
최적 알고리즘이 없는 대표적인 NP(Non-deterministic-Polynomial-time)-Complete
문제이다.
-
NP-완전 = NP-난해(hard) and NP
-
NP
에 속하는 문제는 결정론적 튜링 기계
로 다항 시간
에 검증이 가능하고 그 역도 성립한다
.
-
결정론적 튜링 기계
로 다항 시간
안에 풀수 있는 문제는 비결정론적 튜링 기계
로도 다항 시간
안에 풀 수 있으므로 P 집합은 NP의 부분집합
이다.
-
원래의 출발점으로 돌아오는 경로를 특별히 Hamiltonian Cycle
이라 하는데 이중에서도 특히 최단 거리를 찾는 문제
는 알고리즘 분야에서는 Travelling Salesman Problem
로도 알려져있다.
-
해밀턴 경로
: 한 번만 방문하는 경로
-
해밀턴 순환
: 한 번만 방문하여 출발지로 돌아오는 경로
-
외판원 문제
: 한 번만 방문하여 출발지로 돌아오는 경로 중 가장 짧은 경로
Graph Traversals
DFS
- 일반적으로
stack
이나 재귀
를 이용하여 구현한다.
재귀 pseudo code
DFS(G, v)
label v as discovered
for all directed edges from v to w that are in G.adjacentEdges(v) do
if vertex w in not labeled as discovered then
recursively cll DFS(G, w)
재귀 Python 구현
def recursive_dfs(v, discovered=[]):
discovered.append(v)
for w in graph[v]:
if w not in discovered:
discovered = recursive_dfs(w, discovered)
return discovered
Stack pseudo code
DFS-iterative(G, v)
let S be a stack
S.push(v)
while S is not empty do
v = S.pop()
if v is not labeled as discovered then
label v as discovered
for all edges from v to w in G.adjacentEdges(v) do
S.push(w)
Stack Python 구현
def iterative_dfs(start_v):
discovered = []
stack = [start_v]
while stack:
v = stack.pop()
if v not in discovered:
discovered.append(v)
for w in graph[v]:
stack.append(w)
return discovered
BFS
- 반복 구조로 구현할 때는 Queue를 이용한다.
- 재귀를 사용한 구현은 불가능하다.
Queue pseudo code
BFS(G, start_v)
let Q be a queue
label start_v as discovered
Q.enqueue(start_v)
while Q is not empty do
v := Q.dequeue()
if v is the goal then
return v
for all edges from v to w in G.adjacentEdges(v) do
if w is not labeled as discovered then
label w as discovered
w.parent := v
Q.enqueue(w)
Queue python code
def iterative_bfs(start_v):
discovered = [start_v]
queue = [start_v]
while queue:
v = queue.pop(0)
for w in graph[v]:
if w not in discoverd:
discovered.append(w)
queue.append(w)
return discovered
Backtracking
Introduction
- 해결책에 대한 후보를 구축해 나아가다 가능성이 없다고 판단되는 즉시 후보를
포기(Backtrack)
해 정답을 찾아가는 범용적인 알고리즘으로 제약 충족 문제(Contraint Satisfactoin Problem)
에 특히 유용하다.
Backtracking
은 DFS
와 같은 방식으로 탐색하는 모든 방법을 뜻하며, DFS
는 Backtracking
의 골격을 이루는 알고리즘이다.
- 보통 재귀로 구현하며 기본적으로 모두 DFS의 범주에 속한다.
- 불필요한 후보를 제거하는 것을
가지치기(Pruning)
이라고 하며 트리의 탐색 최적화 문제
와 관련이 깊다.
Constraint Satisfaction Problems
Definition
- 수많은 제약 조건을 충족하는 상태를 찾아내는 수학 문제를 일컫는다.
Author And Source
이 문제에 관하여(Algorithm - Graph), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@aspalt85/Algorithm-Graph
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Vertex
를 기준으로 한다.
NP
란 비결정론적 튜링 기계
로 다항 시간
안에 풀 수 있는 판정 문제의 집합
이다.
최적 알고리즘이 없는 대표적인 NP(Non-deterministic-Polynomial-time)-Complete
문제이다.
NP-완전 = NP-난해(hard) and NP
NP
에 속하는 문제는 결정론적 튜링 기계
로 다항 시간
에 검증이 가능하고 그 역도 성립한다
.
결정론적 튜링 기계
로 다항 시간
안에 풀수 있는 문제는 비결정론적 튜링 기계
로도 다항 시간
안에 풀 수 있으므로 P 집합은 NP의 부분집합
이다.
원래의 출발점으로 돌아오는 경로를 특별히 Hamiltonian Cycle
이라 하는데 이중에서도 특히 최단 거리를 찾는 문제
는 알고리즘 분야에서는 Travelling Salesman Problem
로도 알려져있다.
해밀턴 경로
: 한 번만 방문하는 경로
해밀턴 순환
: 한 번만 방문하여 출발지로 돌아오는 경로
외판원 문제
: 한 번만 방문하여 출발지로 돌아오는 경로 중 가장 짧은 경로
DFS
- 일반적으로
stack
이나재귀
를 이용하여 구현한다.
재귀 pseudo code
DFS(G, v)
label v as discovered
for all directed edges from v to w that are in G.adjacentEdges(v) do
if vertex w in not labeled as discovered then
recursively cll DFS(G, w)
재귀 Python 구현
def recursive_dfs(v, discovered=[]):
discovered.append(v)
for w in graph[v]:
if w not in discovered:
discovered = recursive_dfs(w, discovered)
return discovered
Stack pseudo code
DFS-iterative(G, v)
let S be a stack
S.push(v)
while S is not empty do
v = S.pop()
if v is not labeled as discovered then
label v as discovered
for all edges from v to w in G.adjacentEdges(v) do
S.push(w)
Stack Python 구현
def iterative_dfs(start_v):
discovered = []
stack = [start_v]
while stack:
v = stack.pop()
if v not in discovered:
discovered.append(v)
for w in graph[v]:
stack.append(w)
return discovered
BFS
- 반복 구조로 구현할 때는 Queue를 이용한다.
- 재귀를 사용한 구현은 불가능하다.
Queue pseudo code
BFS(G, start_v)
let Q be a queue
label start_v as discovered
Q.enqueue(start_v)
while Q is not empty do
v := Q.dequeue()
if v is the goal then
return v
for all edges from v to w in G.adjacentEdges(v) do
if w is not labeled as discovered then
label w as discovered
w.parent := v
Q.enqueue(w)
Queue python code
def iterative_bfs(start_v):
discovered = [start_v]
queue = [start_v]
while queue:
v = queue.pop(0)
for w in graph[v]:
if w not in discoverd:
discovered.append(w)
queue.append(w)
return discovered
Backtracking
Introduction
- 해결책에 대한 후보를 구축해 나아가다 가능성이 없다고 판단되는 즉시 후보를
포기(Backtrack)
해 정답을 찾아가는 범용적인 알고리즘으로제약 충족 문제(Contraint Satisfactoin Problem)
에 특히 유용하다. Backtracking
은DFS
와 같은 방식으로 탐색하는 모든 방법을 뜻하며,DFS
는Backtracking
의 골격을 이루는 알고리즘이다.- 보통 재귀로 구현하며 기본적으로 모두 DFS의 범주에 속한다.
- 불필요한 후보를 제거하는 것을
가지치기(Pruning)
이라고 하며트리의 탐색 최적화 문제
와 관련이 깊다.
Constraint Satisfaction Problems
Definition
- 수많은 제약 조건을 충족하는 상태를 찾아내는 수학 문제를 일컫는다.
Author And Source
이 문제에 관하여(Algorithm - Graph), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@aspalt85/Algorithm-Graph저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)