8-1 인접 목록의 적용 시나리오 (20 점)
질문 및 답변 : 무 방향 그래프를 저장하기 위해 인접 목록을 사용하는 이유는 무엇입니까? 왜 비용 효율적일만큼 희소해야합니까?
答:假设无向图有 n 个点,m 条边,每个点相连 因为邻接表储存无向图的时候,有 n 个顶点就要创建 n 个链表. 每个链表都会存和本顶点相关联的顶点,故每一条边会被存两次。故至少需 m* 2 个节点 而邻接矩阵无论图的稀疏程度,都需要 n*(n+1)/2 的空间存储。
교과서 P158;
8-2 인접 행렬의 가장자리 (20 점)
질문 및 답변 : 인접 행렬을 사용하여 무 방향 그래프 저장, 꼭지점 i와 꼭지점 j 사이에 가장자리가 있는지 확인하는 방법은 무엇입니까?
无向图的邻接矩阵 A 是一个对称矩阵,每条边会表示两次,因此矩阵中对应位置 A[i][j] 或 A[j][i]是否为 1,若为 1 则判断有边,为 0 则判断无边。
교과서 P155;
8-3 이진 트리 1 차 순회 (40 점)
다음 그래픽 방법을 사용하여 이진 트리를 저장하는 경우 해당 유형 정의를 작성하고 유형 정의에 따라 이진 트리 순회 알고리즘을 작성하십시오.
struct BiTNode{
char data;
int lchild,rchild;
}Tree[100];
void preTraverse(int i){
if(i==-1) return ;
printf("%d",Tree[i].data);
preTraverse(Tree[i].lchild);
preTraverse(Tree[i].rchild);
}
int main(){
preTraverse(1);
}
8-4 인접도 목록 (5 점)
질문과 답변 : 인접성 목록을 사용하여 방향성 그래프를 저장할 때 지정된 정점의 정도를 찾는 방법은 무엇입니까?
유 방향 그래프의 인접 목록이 다음과 같다고 가정합니다. (교과서 P156-158)
#define MVNum 100 //最大顶点个数
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc; // 指向下一条弧的指针
OtherInfo info; // 该弧相关的信息,如权值等,若无信息可缺省
} ArcNode;
typedef struct VNode {
VerTexType data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧
} VNode, AdjList[MVNum];
typedef struct {
AdjList vertices;
int vexnum, arcnum;
} ALGraph;
지정된 꼭지점의 차수 찾기
방법 1 :
유 방향 그래프가 ALGraph G이면 지정된 꼭지점 Vi를 찾아서 찾습니다. 위치는 1 차원 배열 G.vertices에서 i입니다.
먼저 지정된 정점 G.vertices [i]의 차수를 찾습니다.
인접 목록의 G.vertices [i]를 헤드 노드로 사용하고, 가리키는 단일 연결 목록을 탐색하고, 연결된 목록의 각 노드를 순차적으로 탐색합니다. . 노드의 수는 정점의 이탈도입니다.
그런 다음 지정된 정점 G.vertices [i]의 차수를 찾습니다.
G.vertices [1] ~ G.vertices [G.vexnum]의 각 단일 연결 목록을 차례로 순회하고 각 단일 연결 목록은 해당 목록을 순회합니다. 동시에 노드를 차례로 노드의 adjvex 값이 i와 같은지 판단하고, 같으면 indegree의 카운터가 1 씩 증가하고 모든 노드의 수가 i와 같은지 모두 단일 연결 목록은 정점의 차수로 계산됩니다.
마지막으로, 정점의 정도는 정도 + 정도입니다.
8-5 인접 행렬의 측면 2 (5 점)
질문 및 답변 : 인접 행렬 a를 사용하여 무 방향 네트워크를 저장합니다. 꼭지점 i와 꼭지점 j 사이에 가장자리가없는 경우 a [i] [j]의 값은 무엇이며 어떻게 분석 했습니까?
若 i 号顶点与 j 号顶点之间不存在边,则 a[i][j]和 a[j][i]为∞,∞表示计算机允许的、大于所有边上权值的数 Maxn
8-6 이진 트리 순회 (40 점)
이진 트리를 저장하기 위해 다음 다이어그램을 사용하는 경우 :
(1) 해당 유형 정의를 작성하십시오.
(2) 유형 정의에 따라 이진 트리 순회 순회 알고리즘 을 작성하십시오 .
(3) 함수를 호출하는 문장을 작성합니다.
struct BiTNode{
char data;
int lchild,rchild;
}Tree[100];
void inTraverse(int i){
if(i==-1) return ;
inTraverse(Tree[i].lchild);
printf("%d",Tree[i].data);
inTraverse(Tree[i].rchild);
}
int main(){
inTraverse(1);
}
8-7 연결 및 연결 해제 1 (20 점)
1. 연결된 그래프의 경우 연결된 구성 요소는 무엇입니까?
1) 在无向图中,如果从顶点 vi 到顶点 vj 有路径,则称 vi 和 vj 连通.如果图中任意两个顶点之间都连通,则称该图为连通图,否则,将其中的极大连通子图称为连通分量。任何连通图的连通分量只有一个,即是其自身。
2. 무 방향 그래프의 정점에서 깊이 우선 검색이 모든 정점을 방문 할 수 있다면 그래프는 무엇이어야합니까?
2) 连通图
8-8 연결 및 연결 해제 2 (20 점)
1. 연결된 그래프의 경우 연결된 구성 요소는 무엇입니까?
1) 在无向图中,如果从顶点 vi 到顶点 vj 有路径,则称 vi 和 vj 连通.如果图中任意两个顶点之间都连通,则称该图为连通图,否则,将其中的极大连通子图称为连通分量。任何连通图的连通分量只有一个,即是其自身。
2. 무 방향 그래프의 정점에서 폭 우선 검색이 모든 정점에 액세스 할 수 있다면 그래프는 무엇이어야합니까?
2) 连通图
8-9 DFS 읽기 알고리즘 쓰기 연산 결과 1 (30 점)
다음 알고리즘 정의를 사용합니다.
void DFS_AM(AMGraph G, int v)
{
//图G为邻接矩阵类型
cout << v << " "; //访问第v个顶点
visited[v] = true;
for(w=0; w<G.vexnum; w++) //依次检查邻接矩阵v所在的行
if((G.arcs[v][w]!=0)&& (!visited[w]))
DFS_AM(G, w); //w是v的邻接点,如果w未访问,则递归调用DFS_AM
}
void DFSTraverse(Graph G)
{
// 对图 G 作深度优先遍历
for(v=0; v<G.vexnum; ++v)
visited[v] = FALSE; //访问标志数组初始化
for (v=G.vexnum-1; v>=0; --v)
if (!visited[v]) DFS(G, v); //对尚未访问的顶点调用DFS
}
그림 G에서 arcs 배열의 내용이 다음과 같다고 가정합니다.
실행중인 프로세스를 작성하고 DFSTraverse (G)의 결과를 출력합니다.
참고 : 출력 결과 만 작성하고 분석 프로세스는 작성하지 않습니다. 0 점.
v = 7
DFS (G, 7), 출력 7, 방문 [7] = TRUE
DFS (G, 1), 출력 1, 방문 [1] = TRUE
DFS (G, 2), 출력 2, 방문 [2] = TRUE
DFS (G, 4), 출력 4, 방문 [4] = TRUE
DFS (G, 5), 출력 5, 방문 [5] = TRUE
DFS (G, 3) 출력, 출력 3, 방문 [3] = TRUE
DFS (G, 5)로 돌아 가기
DFS (G, 6) 출력, 6 번 출력, 방문 [6] = TRUE
DFS (G, 5)로
돌아 가기 출력 DFS (G, 4)로
돌아 가기 DFS (G, 2 )로 돌아 가기 )
다시 DFS (G, 1)로
다시 DFS (G, 7)로 다시 출력
v = 6 v = 5 v = 4 v = 3 v = 2 v = 1 v = 0
DFS (G, 0) 출력, 출력 0, 방문 [0] = TRUE
출력 시퀀스 : 7 1 2 4 5 3 6 0
8-10 DFS 읽기 알고리즘 쓰기 연산 결과 2 (30 점)
다음 알고리즘 정의를 사용합니다.
void DFS_AM(AMGraph G, int v)
{
// 图 G 为邻接矩阵类型
cout << v << " "; // 访问第 v 个顶点
visited[v] = true;
for(w=G.vexnum-1; w>0; w--) // 依次检查邻接矩阵 v 所在的行
if((G.arcs[v][w]!=0)&& (!visited[w]))
DFS_AM(G, w); //w 是 v 的邻接点,如果 w 未访问,则递归调用 DFS_AM
}
void DFSTraverse(Graph G)
{
// 对图 G 作深度优先遍历
for(v=0; v<G.vexnum; ++v)
visited[v] = FALSE; // 访问标志数组初始化
for (v=0; v<G.vexnum; ++v)
if (!visited[v]) DFS_AM(G, v); // 对尚未访问的顶点调用 DFS
}
그림 G의 arcs 배열의 내용이 다음과 같다고 가정합니다
. 실행중인 프로세스를 작성하고 DFSTraverse (G)의 결과를 출력합니다. (30 점)
참고 : 출력 결과 만 작성하고 분석 프로세스는 작성하지 않습니다. 0 점입니다.
답변 : 이전 질문에 대한 답변을 참조하십시오.
8-11 단일 소스 (20 포인트)의 최단 경로 찾기
교과서 P189 그림 6.35, Dijkstra 알고리즘을 사용하여 정점 a에서 다른 정점까지의 최단 경로를 찾습니다.
(1) 초기화 후와 각 반복 후에 S [], D [], Path [] 배열의 내용을 씁니다.
(2) 정점 a와 다른 정점 사이의 최단 경로 길이와 해당 경로
(1)
또는
1- 초기화를 기록합니다. 2-7은 6 회
(2)
8-12 두 정점 사이에 가장자리가 있는지 여부 (20 분)
인접 목록에 저장된 유 방향 그래프 G에서 정점 vi에서 정점 vj (i! = j)까지의 간선이 있는지 확인하는 알고리즘을 작성합니다 .
유 방향 그래프 G의 인접 목록이 다음과 같다고 가정합니다.
#define MVNum 100 //最大顶点个数
typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置
struct ArcNode *nextarc; // 指向下一条弧的指针
OtherInfo info; // 该弧相关的信息,如权值等,若无信息可缺省
} ArcNode;
typedef struct VNode {
VerTexType data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧
} VNode, AdjList[MVNum];
typedef struct {
AdjList vertices;
int vexnum, arcnum;
} ALGraph;
답 : 방향 그래프가 ALGraph G이면 1 차원 배열 G.vertices에서 정점 vi의 위치는 i이고 1 차원 배열 G.vertices에서 정점 vj의 위치는 j입니다. 그런 다음 꼭짓점 G.vertices [i]를 헤드 노드로하여 단일 연결 목록을 횡단하고 가장자리를 횡단하여 현재 노드의 adjvex 값이 j와 같은지 확인합니다. 정점 vi에서 정점 vj로. 그렇지 않으면 정점 vi에서 정점 vj까지의 가장자리가 없습니다.
8-13 Hash Table 구성 및 검색 (25 점)
키워드 세트 설정 : (10, 16, 32, 17, 31, 30, 20), 해시 함수는 : H (key) = 키 MOD 11, 테이블 길이는 12, 선형 감지 방법은 충돌을 처리합니다. 다음 질문에 답해보십시오.
1. 해시 테이블의 개략도를 그립니다.
2. 키워드 20을 검색하면 어떤 키워드를 차례로 비교해야합니까?
3. 27 번 키워드를 검색하면 순서대로 비교해야 할 키워드는 무엇입니까?
4. 각 키워드의 검색 확률이 같다고 가정하고 검색 성공시 평균 검색 길이를 구합니다.
5. 채우기 비율을 찾으십시오.
8-14 Prim-minimum spanning tree (10 포인트)
다음 그림의 경우 정점 1부터 시작하여 Prim의 알고리즘을 사용하여 최소 스패닝 트리의 정점 및 가장자리 시퀀스를 작성합니다.
정점 시퀀스 : V = {1,6,2,3,4,0,5}
가장자리 시퀀스 : E = {(1,6) 14, (1,2) 16, (2,3) 12, (3, 4) 22, (6,0) 23, (0,5), 10)
8-15 인접 목록 (10 포인트)에 따라 그래프의 너비 우선 순회 시퀀스를 작성합니다.
(1) 아래 그림의 인접 목록을 작성합니다 (엣지 노드의 시퀀스 번호는 작은 것부터 큰 것까지).
(2) 정점 사이의 공백으로 구분하여 정점 3부터 시작하는 너비 우선 검색 시퀀스와 깊이 우선 검색 시퀀스를 작성합니다. 적은 수의 노드를 우선적으로 방문하는 것을 동의합니다. (정답은 그림에 삽입 가능)
8-16 이진 정렬 트리 구성 (5 점)
12,7,17,11,16,2,13,9,21,4의 키 시퀀스를 빈 이진 정렬 트리에 차례로 삽입하고 결과 이진 정렬 트리를 그립니다.
8-17 이진 검색 (5 점)
11 개 요소 (8,16,19,23,39,52,63,77,81,88,90)의 다음 순서 목록이 주어지면 이진 검색의 결정 트리를 그리고 검색 요소 88 및 17을 제공합니다. 이진 검색 프로세스입니다.
의사 결정 트리의 개념에 대해서는 교과서 P194를 참조하십시오.
8-18 힙 정렬의 초기 힙 (6 포인트)
레코드 그룹의 키 코드가 (46,79,56,38,40,84)이면 힙 정렬 방법으로 생성 된 초기 힙을 작성하십시오. 세부 과정 (3 점)과 결과 (3 점)를 써주세요.
교과서 P252 참조 예 8.6 : 마지막 비 터미널 노드에서 스크리닝 시작;
결과 : 84, 79, 56, 38, 40, 46;
8-19 허프만 트리 건설 (9 점)
통신에 사용되는 메시지가 8 자로 만 구성되어 있다고 가정하면 메시지에 나타나는 문자의 빈도는 각각 0.09, 0.16, 0.02, 0.06, 0.32, 0.03, 0.21, 0.11입니다.
(1)이 8 글자에 대한 Huffman 코드를 디자인하고, Huffman 트리 구성의 세부 과정과 코드를 적어주세요. (4 점)
(2) 바이너리로 표현되는 또 다른 동일한 길이의 코딩 방식을 설계합니다. (2 점)
(3) 위의 예에서 두 기법의 코딩 길이를 분석하고 두 기법의 장단점을 분석 (3 점)
답 :
(1) ① 초기화 : 먼저 2 8 = 16 유닛에 대해 동적으로 적용한 다음 유닛 1부터 시작하여 2 8-1 = 15 회 반복하고 1부터 모든 유닛에 부모, 왼쪽 자식, 오른쪽 자식을 차례로 추가합니다. 15 첨자 0으로 초기화, 마지막주기 8 회, 처음 8 개 단위의 리프 노드 가중치 입력
② 트리 생성 :주기 8-1 = 7 회, 선택 및 삭제 n-1 = 7 번 합쳐서 허프만 트리를 만듭니다. 선택은 부모가 0이고 현재 포리스트에서 가장 작은 가중치를 갖는 두 개의 트리 루트 노드 s1 및 s2를 선택하는 것입니다. 삭제는 노드 s1 및 s2의 부모를 0이 아닌 값으로 변경하는 것을 의미합니다. 병합은 가중치를 변경하는 것입니다. s1 및 s2 새 노드의 가중치 합계는 배열에 n + 1 = 9 이후 단위에 순차적으로 저장되며이 새 노드의 왼쪽 자식의 첨자는 s1로 기록되고 오른쪽의 첨자는 아이는 s2입니다.
코드 :
A : 000
B : 110
C : 11100
D : 1111
E : 10
F : 11101
G : 01
H : 001
(2) (3)