logseg 20251219

This commit is contained in:
songyc macbook 2025-12-19 17:04:55 +09:00
parent 4c5aef5178
commit bce916155c
5 changed files with 140 additions and 3 deletions

View File

@ -0,0 +1,79 @@
deck:: Logseq/coding tip
- ## 1. 개념(Concept)
- 분리집합(Disjoint Set)이란, 서로 공통된 원소를 가지고 있지 않은 {{cloze **상호 배타적인 집합(Disjoint Set)**}}들을 관리하는 자료구조.
id:: 694400bf-c237-4938-945f-26e4e646edbe
- 핵심 연산
- Union (합치기): 두 원소가 속한 집합을 하나로 합침.
- Find (찾기): 특정 원소가 속한 집합의 대표자(Root)를 찾음. 이를 통해 두 원소가 같은 집합에 있는지 확인 할 수 있음.
- ## 2. 기본 구조 (Basic Structure)
- 일반적으로 {{cloze **트리구조**}} 를 사용하여 구현하며, 배열( parent[] )로 각 원소의 부모 노드를 저장.
id:: 69440256-0454-4ca4-a92a-71f8cfe6a7d6
- **초기화**
- {{cloze 모든 원소가 자기 자신을 부모로 가리키며, 각각이 하나의 독립된 집합으로 초기화( parent[i] = i ) :: 초기화 방법을 서술할 것}}
extra:: 즉 자기 자신을 root로 가지는 배열로 parent 배열을 초기화 함.
id:: 69440216-6ce1-4ac5-a14b-f014bf8f9a85
- **Find 연산**
- 원소의 부모를 타고 올라가며 루트 노드(자기 자신이 부모인 노드)를 찾음.
- **경로 압축 (Path Compression) - Find 최적화**
- Find  연산을 수행할 때, 루트 노드를 찾으면서 거쳐간 모든 노드의 부모를 루트 노드로 바로 갱신해버리는 기법.
- 효과 : 다음에 해당 노드들을 탐색할 때 루트까지 바로 갈 수 있어 트리의 높이가 획기적으로 낮아짐.
- **구현**
- id:: 69440457-ee29-4b06-9a75-9e6c3debd508
replacecloze:: " ' parent[x] = find(parent[x])' "
```python
def find(x) :
if parent[x] != x :
parent[x] = find(parent[x])
return parent[x]
```
- **Union 연산**
- 두 원소의 루트 노드를 찾은 뒤( Find ), 한쪽 루트의 부모를 다른 쪽 루트로 설정하여 트리를 연결
- **랭크 기반 합치기 (Union by Rank) - Union 최적화**
- Union  연산을 할 때, 무조건 합치는 것이 아니라 트리의 높이(Rank)가 낮은 트리를 높은 트리 밑에 붙이는 기법
- 효과 : 트리의 전체 높이가 불필요하게 커지는 것을 방지하여 밸런스를 유지
- **구현** #card
id:: 69440755-56a2-43b9-9bfc-a3fc5a7ae098
#+BEGIN_EXTRA
초기화 시 parent 배열과 같은 길이의 rank 배열이 선언되어 있고 0으로 초기화 되어 있음(1로 초기화 해도 됨. 어차피 상대적인 높이 대소비교만 가능하면 어떤 숫자로 초기화 해도 상관 없음. 보통 root의 깊이를 0으로 보고 0으로 초기화 하거나, 트리의 길이를 의미하도록 하기 위해서 시작을 1로 초기화 하는 경우도 있음.
#+END_EXTRA
- ```python
def union(x, y) :
x = find(x)
y = find(y)
if x == y :
return
if rank[x] < rank[y] :
x, y = y, x # x의 랭크가 더 크거나 같도록 스왑
parent[y] = x
if rank[x] == rank[y] :
rank[x] += 1
```
- ## 3. 시간 복잡도
(어떤 경우던 Find 연산이 포함되어 있기에 Find 연산 기준으로 설명)
- ### 1) 최적화 적용이 없을 경우
- (어떤 경우던 Find 연산이 포함되어 있기에 Find 연산 기준으로 설명)
- 최적화가 없을 경우 루트를 찾기 위해 자식부터 위로 쭉 올라가서 부모를 찾음. 따라서 마치 연결리스트 마냥 전체를 쭉 순회해야하기에 시간 복잡도는 {{cloze **O(N)**}}
id:: 6944e937-52e3-47af-b628-397a1c5b1d28
- ### 2) 최적화 적용 시(경로 압축 + 랭크 기반 합치기)
- 시간 복잡도는 {{cloze **O(α(n))**}} #card
id:: 6944e9fb-f794-424c-beed-d75da1a90821
#+BEGIN_EXTRA
경로 압축과 랭크 높이를 제어함으로서 최종적으로 역 아커만 함수 α(n)에 비례하는 시간복잡도를 가짐.
역 아커만 함수는 매우 느리게 증가하는 함수로서 이때문에 현실적인 경우에는 시간복잡도가 **O(1)**과 거의 같아짐. 즉 분리집합에서 find 연산이 상수 시간 복잡도를 이용하는 것과 거의 같아지게 됨.
#+END_EXTRA
-
- ## 4. 사용 예시
- 분리집합은 {{cloze “그룹핑”이나 “연결성 확인” :: 2개의 경우를 답할 것}} 이 필요한 문제에서 주로 사용됨. (사용 예시 4가지)#card #depth-1
id:: 69440b31-d327-4c9d-b81f-511b696dd893
- 그래프의 사이클 판별
- 무방향 그래프에서 간선을 추가할 때, {{cloze **두 노드의 루트가 이미 같다면(이미 연결되어 있다면)** :: 확인 방법을 서술할 것}} 사이클이 발생한 것.
id:: 69440b31-14b8-4edf-83b5-c514e1b0362e
- 크루스칼 알고리즘(MST)
- {{cloze 최소 신장 트리(Minimum Spanning Tree)}} 를 구할 때, 간선을 가중치 순으로 선택하면서 사이클이 생기지 않도록 집합을 합치는 데 사용
id:: 69440b31-b3ea-4010-a500-eb486372ed1a
- 네트워크 연결 확인 : 컴퓨터 네트워크, 친구 관계 등 연결된 그룹의 개수나 크기를 구할 때 사용.
- 이미지 분할 : 픽셀들을 영역별로 그룹화할 때 응용

View File

@ -1,3 +1,4 @@
deck:: Logseq/coding tip
- [[분리집합(Disjoint Set) (Union Find)]]
-

View File

@ -48,9 +48,9 @@ deck:: Logseq/영어 문법
- To 부정사, 동명사 모두 명사적 용법으로 보어 자리를 대체하였다.
- #### **이렇듯 부정사의 명사적 용법과 그리 다르진 않다.**
- ### **to부정사와 동명사의 명사적 용법의 차이점은?**
- **타동사 이외에도 목적어를 가지는 품사 = ** {{cloze **전치사**}} #card
extra:: **전치사 역시 목적어를 가진다.**:
- **타동사 이외에도 목적어를 가지는 품사 =** {{cloze **전치사**}} #card
id:: 6867e92e-f3b8-4cd9-8a33-f3a7089f2230
extra:: **전치사 역시 목적어를 가진다.**:
- **타동사의 목적어는 동명사/부정사로 경우에 따라 다르지만 선별적으로 들어갈 수 있다. **
id:: 6867e964-d591-4404-9f90-05217908da45
**그러나** {{cloze **전치사**}} **의 목적어는 오직 동명사만 가능하다!(이것이 부정사의 명사적 용법과의 사소한 차이점)**

View File

@ -0,0 +1,57 @@
deck:: Logseq/영어 문법
- ## **► 분사 란?**
- ### 부정사는 명사적/형용사적/부사적 용법이 있다(이전 강의 참고)
- 이 중 동명사는 부정사 중 명사적 용법과 비슷하며 개념을 공유한다(1%의 차이만 있음)
- 그렇다면? 부정사의 형용사적 용법을 공유하는 준동사는 무엇일까? 답은 그것이 분사이다.
- ### 분사 란 준동사 중에서 동사가 {{cloze 형용사}} 의 형태로 쓰이는 것을 의미한다. #card
extra:: 즉 분사라는 용어보다는 동형사 라는 용어가 더 적합하다.
id:: 6944fb21-6ace-489a-92fc-333649ca1eca
- ### 일반 형용사, 그리고 부정사의 형용사의 용법과 분사의 형용사 용법 비교
- 일반 / 부정사의 형용사 용법 2가지 : {{cloze 한정 / 서술}}
id:: 6944fb8d-7a3e-49e2-87b6-90309725aeb2
- 분사의 형용사 용법 2가지 : {{cloze 현재분사(R + -ing), 과거분사(R + -ed)}} #card
id:: 6944fbb0-5d72-453f-8e02-d06b11e2ecb0
#+BEGIN_EXTRA
- 현재, 과거라는 의미는 시제를 의미하는 것이 아님.
- 일반 형용사의 한정, 서술적 용법과 1대1로 대응되는 개념도 아님.
#+END_EXTRA
- ## **► to 부정사와 분사의 형용사적 용법의 차이!**
- ### **아래의 문장은 같은 문장의 형용사 자리에 to 부정사와 과거분사, 현재분사가 들어간 문장이다.(drown : 익사하다)**
- <b>He was a man <span style = "background-color : red; color : yellow;"> to drown </span>in the river.(to 부정사)</b> #card
id:: 6944ff09-72aa-4eb4-b5b3-e385101215af
- 해석 : 그는 강에 빠져 익사할 예정인 남자이다(물에 빠져 죽을 놈이다 라는 관용적 표현)
- to 부정사가 형용사적 용법으로 쓰여 man을 수식하는 한정적 용법으로 쓰였다.(예정)
- 그 남자는 물에 들어가지도 않았고 그저 물에 빠져 죽을 놈이라고 말할 뿐 익사하는 것과 관련없이 예정을 의미한다.
- <b>He was a man <span style = "background-color : red; color : yellow;"> drowned </span>in the river.(과거분사)</b> #card
id:: 6944ff0c-3edc-4fda-81a5-58e7068b4381
- 해석 : 그는 강에서 익사한 남자였다.
- 과거분사 형태로 형용사로서 man을 수식한다.
- 의미상으로는 이미 익사를 해서 죽은 상태이다.
- <b>He was a man <span style = "background-color : red; color : yellow;"> drowning </span>in the river.(현재분사)</b> #card
id:: 6944ff0e-a0d7-4421-9bb1-c2b3f718a559
- 해석 : 그는 강에 빠져 익사중인 남자이다.(강에 남자가 빠져있다.)
- 현재분사 형태로 형용사로서 man을 수식한다.
- 의미상으로 지금 물에 빠져서 허우적거리는 상태이다.(아직 살아있다.)
- ## **► 현재분사 vs 과거분사**
- 분사는 기본적으로 형용사의 기능을 하기에 명사의 앞 또는 뒤에서 명사를 수식한다.
이때 수식하는 의미에 따라 현재분사와 과거분사로 나뉜다.
- 수식하는 의미가 능동 / 진행 일 경우 : {{cloze 현재분사(R + -ing}}
id:: 694501c7-6bfd-4fb9-badc-10e475f4e17f
- 수식하는 의미가 수동 / 완료 일 경우 : {{cloze 과거분사(R + -ed}}
id:: 69450204-5c03-4256-9a52-60105bab5293
- 예시 문장
- There is a done project. #card
id:: 69450308-7d87-4ee4-bdf5-c9e17a9a33a1
- done은 과거분사, 즉 수동 / 완료 형태이다.
- 해석 : 그것은 **완료된** 프로젝트이다.
- 과거분사 done이 명사 project를 수식한다.
- There is a man doing the project. #card
id:: 69450336-210f-4395-b224-bb0df680958f
- doing은 현재분사, 즉 능동 / 진행 형태이다.
- 해석 : 그것은 그 남자가 진행중인 프로젝트이다.
- 현재분사 doing이 명사 man을 수식하고 the project는 doing의 목적어로 기능했다.
- **Falling leaves** vs. **Fallen leaves** #card
id:: 694503af-6671-4381-a76e-0fd770718f4b
- 현재분사 Falling이 쓰였으니 현재 떨어지는 중인 잎사귀.
- 과거분사 Fallen이 쓰였으니 이미 떨어진 잎사귀(낙엽).

View File

@ -18,4 +18,4 @@
- [[영어기초 18강]] 부정사, 준동사의 시작
- [[영어기초 19강]] 준동사, 부정사의 기능
- [[영어기초 20강]] 동명사
-
- [[영어기초 21강]] 분사