분할 알고리즘 (사상) 이 데이터 구조 에서 의 응용
만약 하위 문제 가 여전히 해결 되 지 않 는 다 면, 하위 문제 가 작 을 때 까지 계속 하위 문제 로 나 누 어 라.
해결 할 수 있 는 규모, 원래 문 제 는 하위 문제 의 합병 이다.
PartOne:
분할 처리 법 으로 배열 a [L,..., R] 를 인쇄 합 니 다. 분석: 하나의 순환 이면 되 지만, 분할 알고리즘 으로 해결 하려 면 어떻게 해 야 합 니까? 인쇄 할 시퀀스 길이 가 1 이면 직접 인쇄 할 수 있 습 니 다. 인쇄 할 시퀀스 길이 가 N 이면 두 부분 으로 나 눌 수 있 습 니 다. 첫 번 째 부분 은 1, 후 N - 1 은 다른 구분 으로 배열 의 길이 가 1 일 때 까지 유추 된다.
void print(int a[], int L, int R)
{
if(L > R)
return;
else if(L == R)
{
cout<<"a[L]"<<" ";
}
else
{
cout<<a[L]<<" ";
print(a, L + 1, R);
}
}
PartTwo: 함수 divid () 가 존재 한다 고 가정 하면 하나의 배열 a [L,..., R] 를 두 부분 으로 나 눌 수 있 습 니 다.
요소 a [L] 는 분계선 이 고 a [L] 보다 작은 요 소 는 왼쪽 에 있 으 며 a [L] 보다 큰 요 소 는 오른쪽 에 있 습 니 다. 함수 설명 은 다음 과 같 습 니 다.
int divid(int a[], int L, int R);
분 치 법 을 사용 하여 배열 a [L,... R] 의 요 소 를 빠르게 정렬 합 니 다.
분석:
길이 가 1 보다 작 으 면 기본적으로 질서 가 있 고, 서열 길이 가 1 보다 크 면 divid () 함수 로
이 를 3 부분 으로 나 누고 왼쪽 은 a [L] 보다 작은 부분 이 며 중간 은 a [L] 이 고 오른쪽 은 크다.
a [L] 의 부분.a [L] 질서 가 있 으 면 좌우 두 부분 만 분기 처리 해 야 합 니 다.
void Qsort()
{
int mid;
if(L >= R)
return;
else
{
mid = divid(a, L, R);
Qsort(a, L, mid);
Qsort(a, mid + 1, R);
}
}
PartThree;
이 진 트 리 하나 가 이 진 트 리 에 저장 되 어 있 으 며, 분 치 법 으로 모든 노드 값 을 인쇄 합 니 다.
근결 점 은 p 가 가리킨다. 분석: 나무 가 비어 있 을 때 는 아무것도 하지 않 고 문 제 를 직접 해결한다. 나무 에 점 이 하나 이상 있 을 때 나무 전 체 를 뿌리, 왼쪽 나무 로 나 누 어
오른쪽 나무 세 부분.루트 노드 를 직접 인쇄 하여 왼쪽 트 리 를 계속 분할 처리 합 니 다.
오른쪽 트 리 를 계속 나 누 어 처리 하고 마지막 으로 이 진 트 리 전 체 를 인쇄 합 니 다.
void printTree(BTNode *p)
{
if(p == NULL)
return;
else
{
cout<<p->data<<" ";
printTree(p->lchild);
printTree(p->rchild);
}
}
PartFour:
하나의 연결 그림 G 는 인접 표 로 저장 되 고 분 치 법 으로 그림 의 모든 정점 값 을 인쇄 합 니 다. 정점 v 부터 인쇄 한다 고 가정 합 니 다.
전체 그림 을 n 부분 으로 나 눌 수 있 습 니 다. 그 다음 에 앞의 예 와 같이 그림 을 나 눌 수 있 습 니 다. 첫 번 째 변 에 이 르 는 하위 그림 과 같 습 니 다.
두 번 째 변 에 도달 한 서브 맵.V 는 직접 인쇄 한 후에 각 하위 그림 을 각각 나 누 어 처리 할 수 있다.
회로 현상 을 방지 하기 위해 서 는 이미 지나 간 길 을 표시 하 는 배열 visited [] 를 설정 할 수 있 습 니 다.
(깊이 우선 검색 의 분할 해석)
void printGraph(AGraph *G, int v)
{
ArcNode *p;
visited[v] = 1;
cout<<v<<" ";
p = G->adjlist[v].firstarc;
while(p != NULL)
{
if(visited[p->adjvex] == 0)
{
printGraph(G, p->adjvex);
}
p = p->nextarc;
}
}
PartFive:
이 진 트 리 의 우선 순 서 는 시퀀스 와 중간 순 서 를 옮 겨 다 니 며 각각 a [L1,..., R1] 에 저 장 됩 니 다.
b[L2,...R2];두 배열 에서 분리 알고리즘 으로 이 두 배열 에서 이 진 트 리 를 만 듭 니 다.
이 진 링크 에 저 장 된 구조 에 저 장 됩 니 다. 분석: 빈 서열 이 라면 아무것도 할 필요 가 없다.길이 가 1 보다 크 면 a [L1] 비트 이 진 트 리
의 뿌리 결산 점 은 b [] 에서 a [L] 를 찾 고 아래 에 k 라 고 표시 하면 b [L2,................................................................
의 모든 결점, b [k + 1,.........................................................................
a [L1 + 1,... L1 + k - L2] 와 b [L2,..., k - 1] 는 계속 분할 처 리 를 한다.최종 적 으로 나 무 를 만 들 수 있 습 니 다.
BTNode* Create(int a[], int b[], int L1, int R1, int L2, int R2)
{
int k;
if(L1 > R1)
return NULL;
else
{
s = (BTNode*)malloc(sizeof(BTNode));
s->data = a[L1];
for(k = L2; k < R2; ++k)
{
if(a[L1] == b[K])
{
break;
}
}
s->lchild = Create(a, b, L1 + 1, L1 + k - L2, L2, k - 1);
s->lchild = Create(a, b, L1 + k - L2 + 1, R1, k + 1, R2);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.