logseq 20251228
This commit is contained in:
parent
8e25af133f
commit
6fde8b1f03
@ -432,4 +432,10 @@
|
||||
:file/name-format :triple-lowbar
|
||||
:journal/page-title-format "yyyy-MM-dd EEEE"
|
||||
:feature/enable-journals? false
|
||||
:default-home {:page "📋 Index Page"}}
|
||||
:default-home {:page "📋 Index Page"}
|
||||
:graph/forcesettings {:link-dist 10
|
||||
:charge-strength -1000}
|
||||
:graph/settings {:builtin-pages? false
|
||||
:excluded-pages? true
|
||||
:orphan-pages? true
|
||||
:journal? false}}
|
||||
|
||||
@ -1,2 +1,4 @@
|
||||
- [[위상 정렬(Topological Sort)]]
|
||||
- [[에라토스테네스의 체]]
|
||||
- [[에라토스테네스의 체]]
|
||||
- [[크루스칼 알고리즘(Kruskal’s Algorithm)]]
|
||||
- [[프림 알고리즘 (Prim’s Algorithm)]]
|
||||
@ -96,9 +96,11 @@ deck:: Logseq/영어 문법
|
||||
<b>I know the girl <span style = "background-color : red; color : yellow;">of</span> he is afraid of.(X)</b>
|
||||
#+END_EXTRA
|
||||
- ## **► 관계대명사 - 소유격**
|
||||
- <b>I have <span style = "background-color : blue; color : yellow;">the book</span>. + <span style = "background-color : blue; color : yellow;">Its</span> cover is red.</b>
|
||||
- <b>I have the book. + Its cover is red.</b>
|
||||
id:: e64cf537-d0c2-4fc1-9a96-5bdc3b605e5b
|
||||
위의 두 문장을 합쳤을 때의 겹치는 대상, 선행사, 후행사, 사용되는 관계대명사, 그리고 최종적으로 완성되는 문장은? #card
|
||||
- <b>I have <span style = "background-color : blue; color : yellow;">the book</span>. + <span style = "background-color : blue; color : yellow;">Its</span> cover is red.</b>
|
||||
id:: 694fa5ac-9559-4154-8878-0794bbe360a7
|
||||
- 겹치는 대상 : The girl
|
||||
- 선행사 : 앞 문장에서의 the book(사물)
|
||||
- 후행사 : 뒷 문장에서의 its(주어 / 합쳐진 문장에서는 소유격으로 들어감)
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
- [[분리집합(Disjoint Set) (Union Find)]]
|
||||
-
|
||||
- [[최소 스패닝 트리(Minimum Spanning Tree)]]
|
||||
28
pages/최소 스패닝 트리(Minimum Spanning Tree).md
Normal file
28
pages/최소 스패닝 트리(Minimum Spanning Tree).md
Normal file
@ -0,0 +1,28 @@
|
||||
deck:: Logseq/coding tip
|
||||
|
||||
- ## 1. 개념(Concept)
|
||||
- **스패닝 트리(Spanning Tree)**
|
||||
- 그래프의 모든 정점을 연결하는 트리를 의미하며, 정점이 $V$개면 간선은 항상 {{cloze $V-1$}}개.
|
||||
id:: 6950f19e-3b2d-4a6e-a275-e24847b486be
|
||||
- **최소 스패닝 트리(Minimum Spanning Tree)**
|
||||
- 가중치가 있는 무방향 그래프에서 모든 정점을 연결하면서, {{cloze 간선 가중치 합}}이 최소가 되도록 고른 트리.
|
||||
extra:: 스패닝 트리들 중 가중치 합이 최소인 트리
|
||||
id:: 6950f0fd-13d7-4d6b-88c8-6d2fd1f1a732
|
||||
- ## 2. 핵심 성질
|
||||
- MST는 {{cloze 사이클}}을 가지지 않는다.
|
||||
id:: 6950f2db-2f04-4e8d-adab-87f0a667cb0e
|
||||
- MST가 유일한지 여부는 {{cloze 가중치 중복}} 등에 따라 달라진다.
|
||||
extra:: 동일 가중치가 존재한다면 경우에 따라 여러개가 존재 할 수 있음.
|
||||
id:: 6950f2f2-449b-4b90-a006-09fa3c4e2647
|
||||
- ## 3. 구현 방법 및 비교
|
||||
- ### 구현 알고리즘
|
||||
- [[크루스칼 알고리즘(Kruskal’s Algorithm)]]
|
||||
- 전체 간선 정렬 후 싼 것부터 추가하는 알고리즘
|
||||
- {{cloze 간선의 개수가 적을 때 :: 크루스칼 알고리즘이 더 효율적인 경우는?}} 사용하기 유리하다.
|
||||
extra:: 간선이 적은 그래프를 희소 그래프 (Sparse Graph) 라고 한다.
|
||||
id:: 6951147c-369e-46ca-aebb-627ca0a1d63d
|
||||
- [[프림 알고리즘 (Prim’s Algorithm)]]
|
||||
- 시작점에서 조금씩 영역을 넓혀가는 알고리즘
|
||||
- {{cloze 간선의 개수가 매우 많을 때 :: 프림 알고리즘이 더 효율적인 경우는?}} 사용하기 유리하다.
|
||||
extra:: 간선이 매우 많은 그래프를 밀집 그래프 (Dense Graph) 라고 한다.
|
||||
id:: 69511474-adb8-4eea-b8ba-617929628ee1
|
||||
52
pages/크루스칼 알고리즘(Kruskal’s Algorithm).md
Normal file
52
pages/크루스칼 알고리즘(Kruskal’s Algorithm).md
Normal file
@ -0,0 +1,52 @@
|
||||
deck:: Logseq/coding tip
|
||||
|
||||
- ## 1. 개념(Concept)
|
||||
- 최소 스패닝 트리(MST)를 구하는 알고리즘.
|
||||
- “가장 가벼운 간선부터 선택하되, 사이클이 생기지 않게 한다.” 라는 그리디(Greedy) 전략을 사용.
|
||||
- 이를 위해 {{cloze 분리집합}}을 사용함.
|
||||
extra:: [[분리집합(Disjoint Set) (Union Find)]]
|
||||
id:: 6950f5ad-52f1-4df3-b495-cbfa7a6ebbec
|
||||
- ## 2. 기본 구조 (Basic Structure)
|
||||
- 1) 그래프의 모든 간선을 {{cloze 가중치 오름차순}} 으로 정렬한다.
|
||||
id:: 6950f5f7-a85f-49a9-96c1-a06afc1af444
|
||||
- 2) 가장 가중치가 낮은 간선부터 하나씩 꺼낸다.
|
||||
- 3) 선택한 간선이 연결하는 두 정점이 이미 같은 집합에 속해 있는지 확인한다.
|
||||
- 같은 집합이 아니라면 :-> 간선을 선택하고 두 집합을 합친다(Union)
|
||||
id:: 6950f9c6-8c02-4f9f-b860-bc9f2e768155
|
||||
- 같은 집합이라면 :-> 연결하면 사이클이 발생하므로 다음으로 넘어간다.
|
||||
id:: 6950f9d9-10e3-475d-8aec-aea39babab16
|
||||
- 3) 최종적으로 간선이 {{cloze $V-1$ (정점갯수 - 1)}} 개 선택되면 종료한다.
|
||||
id:: 6950f9ec-f8cb-4376-8505-3de0f465da7b
|
||||
- ## 3. 코드(python)
|
||||
- 입력이 V(정점의 갯수), 모든 간선들의 집합(edges)을 매개변수로 하여
|
||||
id:: 69510a18-7a5f-4a41-8113-f294b8263a21
|
||||
크루스칼 알고리즘으로 최소 스패닝 트리를 구현하고,
|
||||
이때 총 가중치를 반환하는 함수를 구현하면?
|
||||
```python
|
||||
# edges: (cost, a, b) 형태의 간선 리스트
|
||||
# parent: Union-Find용 부모 테이블이고 이미 자기 자신으로 초기회되어 있음.
|
||||
# union-find 연산은 이미 구현되어 있다고 가정
|
||||
```
|
||||
#card
|
||||
- ```python
|
||||
def kruskal(v, edges):
|
||||
edges.sort() # 1. 가중치 순 정렬
|
||||
|
||||
total_cost = 0
|
||||
edge_count = 0
|
||||
|
||||
for cost, a, b in edges:
|
||||
# 2. 사이클이 발생하지 않는 경우에만 선택
|
||||
if find(a) != find(b):
|
||||
union(a, b)
|
||||
total_cost += cost
|
||||
edge_count += 1
|
||||
if edge_count == v - 1: # 3. 간선 V-1개 모으면 종료
|
||||
break
|
||||
|
||||
return total_cost
|
||||
```
|
||||
- ## 4. 시간복잡도
|
||||
- 간선들을 정렬하고 그 간선들을 하나하나 탐색하기 때문에 간선의 정렬 시간이 가장 지배적임.
|
||||
- 시간복잡도는 {{cloze $O(E\log E)$}}
|
||||
id:: 69511394-6c6e-4da0-97e6-27c56fc37c71
|
||||
57
pages/프림 알고리즘 (Prim’s Algorithm).md
Normal file
57
pages/프림 알고리즘 (Prim’s Algorithm).md
Normal file
@ -0,0 +1,57 @@
|
||||
deck:: Logseq/coding tip
|
||||
|
||||
- ## 1. 개념(Concept)
|
||||
- 최소 스패닝 트리(MST)를 구하는 알고리즘.
|
||||
- “임의의 시작 정점에서 출발하여, 현재 트리에 연결된 간선 중 가장 싼 것을 추가하며 확장한다.” 라는 전략을 사용
|
||||
- 이를 위해 {{cloze 우선순위 큐}}가 사용됨.
|
||||
id:: 69511108-8006-4c0a-9452-d248f8c58ca5
|
||||
- 다익스트라(Dijkstra) 알고리즘과 비슷함.
|
||||
- ## 2. 기본 구조 (Basic Structure)
|
||||
- 1) 임의의 정점(vertex)을 하나 선택해서 트리에 포함시킨다.
|
||||
- 2) 현재 트리에 포함된 정점들과 포함되지 않은 정점들을 연결하는 간선 중, 가중치가 가장 작은 간선을 찾는다.
|
||||
- 3) 해당 간선과 연결된 새로운 정점을 트리에 추가한다.
|
||||
- 4) 위의 과정을 반복하여 최종적으로 모든 정점이 트리에 포함될 때 까지 반복한다.
|
||||
- ## 3. 코드(python)
|
||||
- 입력이 V(정점의 갯수), 인접리스트(graph)와 시작노드(start_node)를 매개변수로 하여
|
||||
id:: 695111c8-84a0-4220-a7f4-b9f654761cec
|
||||
프림 알고리즘으로 최소 스패닝 트리를 구현하고,
|
||||
이때 총 가중치를 반환하는 함수를 구현하면?
|
||||
```python
|
||||
# graph: (노드: [(비용, 인접노드)]...)
|
||||
# ex) graph = [[],[(3,2),(4,5)],[(1,3)]...]
|
||||
```
|
||||
#card
|
||||
- ```python
|
||||
import heapq
|
||||
|
||||
# graph: 인접 리스트 (노드: [(비용, 인접노드), ...])
|
||||
def prim(start_node, v, graph):
|
||||
visited = [False] * (v + 1)
|
||||
min_heap = [(0, start_node)] # (비용, 정점)
|
||||
total_cost = 0
|
||||
count = 0
|
||||
|
||||
while min_heap:
|
||||
cost, node = heapq.heappop(min_heap)
|
||||
|
||||
if visited[node]:
|
||||
continue
|
||||
|
||||
visited[node] = True
|
||||
total_cost += cost
|
||||
count += 1
|
||||
|
||||
if count == v: # 모든 정점 방문 완료
|
||||
break
|
||||
|
||||
# 인접 정점 중 방문 안 한 곳을 큐에 넣기
|
||||
for next_cost, next_node in graph[node]:
|
||||
if not visited[next_node]:
|
||||
heapq.heappush(min_heap, (next_cost, next_node))
|
||||
|
||||
return total_cost
|
||||
```
|
||||
- ## 4. 시간복잡도
|
||||
- 우선순위큐 연산이 주된 연산이므로 우선순위 큐 연산 속도에 영향을 많이 받음.
|
||||
- 시간복잡도는 {{cloze $O(E\log V)$}}
|
||||
id:: 69511407-a9bc-40f2-b57c-f76060ea75f1
|
||||
@ -1,7 +1,4 @@
|
||||
-
|
||||
deck:: Logseq/coding tip
|
||||
|
||||
- ## **❖ Javascript / Typescript**
|
||||
## **❖ Javascript / Typescript**
|
||||
- ### **► 배열 매서드**
|
||||
- ### **◼︎ Array.slice(start_idx, end_idx)**
|
||||
id:: 68692600-551c-488b-ad74-de8145729133
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user