데이터 구조 최종 검토 주관적 연습 (답변 버전)

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)
여기에 사진 설명 삽입

추천

출처blog.csdn.net/Jessieeeeeee/article/details/107390119