- 블로거 소개 : 열심히 공부하기 위한 준비 프로그램~
- Blogger 홈페이지: @is Yaoyaozi
- 내가 속해 있는 칼럼: 자바 섬의 모험 [백자에서 형으로 가는 길]
머리말
Yao Yaozi는 학교에서 Blue Bridge Cup 및 ACM 선택 대회를 준비하고 있으며 최근 알고리즘에 대해 배우고 있기 때문입니다. 저는 AcWing 사이트의 도움으로 배웠습니다. 이 글은 제 학습 내용에 대한 노트입니다. 원리에 대한 설명 중 일부는 친구들이 제 학습 과정에서 총알 화면이나 댓글을 볼 수 있습니다. 아주 좋은 것 같습니다 . 이 기사는 주로 알고리즘 효율성을 향상시키기 위해 다양한 데이터 구조를 시뮬레이션하기 위해 주로 배열을 사용하는
데이터 구조에 관한 것입니다 . 상대적으로 애매하고 대머리인 곳에서는 이해하기 위해 그림을 그리는 것이 익숙하기 때문에 알고리즘 템플릿이나 주제를 기반으로 정성스럽게 그린 다이어그램을 보실 수 있을 거에요 함께 알고리즘을 배우고 있는 학생들에게 도움이 되었으면 좋겠습니다! 야오야오지는 아직 신인이라 잘 이해가 안가는 부분이나 잘 이해되는 부분이 있을 수 있으니 더 지적해주세요! ❤
알아채다! 아래 각 데이터 구조의 설명 방법은 코드 템플릿 + 텍스트 설명 및 설명 + 다이어그램을 채택합니다.
1. 단일 연결 리스트(인접 리스트)
기능: 주로 인접 목록 , 스토리지 그래프 및 트리 에 사용됨
코드 템플릿
// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点,后一个
int head, e[N], ne[N], idx;
//NULL相当于-1,所以head = -1相当于head=NULL
// 初始化
void init()
{
head = -1;
idx = 0;
}
// 在链表头插入一个数a
void insert(int a)
{
e[idx] = a, ne[idx] = head, head = idx ++ ;
}
//将x插入到下标是k的点之后
void insert(int k, int x)
{
e[idx] = x;
ne[idx] = ne[k]
ne[k] = idx;
idx ++;
}
// 将头结点删除,需要保证头结点存在
void remove()
{
head = ne[head];
}
- 스토리지 노드 배열
e[N]
과 노드를 저장하는 다음 포인터 배열은ne[N]
첨자를 통해 연결됩니다. - idx는 현재 연산의 위치만 기록하고, 일반적으로 구현되는 연결 리스트 idx는 순서가 맞지 않음(전방 노드와 후방 노드의 배열 첨자는 연속적일 필요는 없으며, 현재 ne를 통해 다음 idx를 찾아야 함) [i] 이것은 둘 사이의 연결이기도 합니다 .
- head 의 시작 부분에서
=-1
이 -1은 물리적 주소와 동일하며NULL
연결 목록이 비어 있음을 나타냅니다. 즉, head가 head 노드를 가리키고 head interpolation 방법을 사용하여 이 빈 노드를 꼬리 노드 . 연관 구조에 의해 구현된 단일 연결 리스트의 마지막 노드의 포인터 필드는NULL
따라서 배열은 단일 연결 리스트의 마지막 노드를 구현하고 i라고 가정하면ne[i]=-1
; - 여기서 시뮬레이트된 것은 헤드 노드가 없고 헤드 포인터가 헤드 노드 의 단일 연결 목록을 직접 가리킨다는 것입니다.
- 배열로 시뮬레이션한 연결 리스트는 구조체/클래스 시뮬레이션으로는 잘 이해되지 않지만 본질은 같다.노드 노드에 비유할 수 있다.
- 그래서 사실 그림을 그릴 때 그렇게 명확하게 구분할 필요는 없습니다 사실 배열로 연결된 리스트를 시뮬레이트하는 방법을 배우기 전에는 항상 배열과 연결된 리스트가 물리적 구조 에 속 한다고 생각 했습니다 . 연결된 목록이 실제로는 논리적 구조라는 것을 알아내십시오 !
비교 포인트 | 구조체/클래스 모의 노드 | 어레이 아날로그 노드 |
---|---|---|
노드 자체 포인터 | 물리적 주소, 노드 | 배열을 첨자로 하여 자체 포인터를 나타냅니다. |
숫자 필드 | 그냥 구조에서 정의node.val |
val[node], 배열을 통해 값 필드 저장 |
포인터 필드 | 구조에서 정의,node. next |
배열을 통해 저장되는 next[노드] |
그래픽
삽입 작업(헤드 삽입 방식)
2. 이중 연결 리스트
단일 연결 목록을 시뮬레이트하는 배열에 대해 배운 후 이중 연결 목록은 실제로 이해하기 쉽습니다. 실제로 포인터 필드가 하나 더 있습니다.
- 단일 연결 리스트: ne[i]는 포인터가 i인 노드의 다음 포인터를 저장합니다.
- 이중 연결 리스트
- l[i], 포인터가 i인 노드의 선행 노드(이전 노드를 가리킴)
- r[i], 포인터가 i인 노드의 백드라이버(다음 노드를 가리킴)
//e[index],表示节点的值,l[index]表示节点的左指针,r[index]表示节点的右指针,idx表示当前用到哪个节点的”地址“
int e[N],l[N],r[N],idx;
//初始化
void init(){
//0是左端点,1是右端点
r[0] = 1,l[1] = 0;
idx = 2;
}
//在节点a的右边插入一个数x
void insert(int a,int x){
//1、让待插入节点占位
e[idx] = x;
//2、处理待插入点左右两侧
l[idx] = a,r[idx] = r[a];//注意,这里必须是r[a],因为a的下一个节点不一定和a顺序存储
//3、处理前一个节点和后一个节点
l[r[a]] = idx,r[a] = idx++;
}
Java Island Adventures [하얀백에서 보스까지의 여정]
LeetCode 일일 질문 – 거대 공장 습격