분 치 법 과 귀속
분 치 법 은 각 층 의 순환 에 있어 세 가지 절차 가 있다.
4. 567917. 분해: 원래 의 문 제 를 몇 개의 규모 가 작고 서로 독립 되 며 원래 의 문제 형식 과 똑 같은 서브 문제 로 분해 합 니 다
4. 567917. 해결: 만약 에 서브 문제 의 규모 가 작고 해결 되 기 쉬 우 면 직접 해결 하고 그렇지 않 으 면 각 서브 문 제 를 재 귀적 으로 해결한다
4. 567917. 합병: 각 하위 문제 의 해 를 원래 문제 의 해 로 합 친다
그것 의 일반적인 알고리즘 디자인 모델 은 다음 과 같다. Divide-and-conquer(P) 1. if |P|≤n0 2. then return(ADHOc(P)) 3. P 를 작은 하위 문제 P1, P2,..., Pk 로 분해 4. for i←1 to k 5. do yi ← Divide - and - conquer (Pi) △ 귀속 해결 Pi 6. T ← MERGE (y1, y2,..., yk) △ 합병 서브 문제 7. return(T) 그 중에서 | P | 문제 P 의 규 모 를 나타 낸다.n0 은 한도 값 으로 문제 P 의 규모 가 n0 을 초과 하지 않 을 때 문 제 는 쉽게 풀 리 고 더 이상 분해 할 필요 가 없다 는 것 을 나타 낸다.ADHOC (P) 는 이 분 치 법의 기본 서브 알고리즘 으로 소 규모 문제 P 를 직접 푸 는 데 사용 된다.따라서 P 의 규모 가 n0 을 초과 하지 않 을 때 알고리즘 ADHOc (P) 로 직접 해답 을 구한다.알고리즘 MERGE (y1, y2,.
여기 서 두 가지 알고리즘 의 예 를 들 어 재 귀 와 분 치 법의 응용 을 살 펴 보 자.
1. 정수 하나 와 이원 나 무 를 입력 하 세 요.나무의 뿌리 결점 부터 아래로 내 려 가서 잎 결점 이 지나 가 는 모든 결점 이 하나의 경 로 를 형성한다.입력 정수 와 같은 모든 경 로 를 출력 합 니 다.예 를 들 어 정수 22 와 다음 이원 트 리 를 입력 하 십시오. 10 / / 5 12 / / 47 은 두 가지 경 로 를 출력 한다. 10, 12, 10, 5, 7.
2. 이원 찾기 트 리 를 입력 하고 이원 찾기 트 리 를 정렬 된 양 방향 링크 로 변환 합 니 다.새로운 노드 를 만 들 수 없고 포인터 의 방향 만 조정 하 라 고 요구 합 니 다. 10 / / 6 14 / / / /4 8 12 16 양 방향 링크 로 전환 4 = 6 = 8 = 10 = 12 = 14 = 16.
분석: 이 두 문제 에 대해 모두 여러 가지 방법 으로 해결 할 수 있다. 여기 서 우 리 는 첫 번 째 문제 에 대해 재 귀 방법 으로 두 번 째 문제 에 대해 분 치 법 을 사용한다.
struct BSTreeNode
{
int m_nValue;
BSTreeNode* m_leftchild;
BSTreeNode* m_rightchild;
}; //
/*
1. total
*/
List<BSTreeNode*> nodeList;
void printResult()
{
for (int i = 0; i < nodeList.size(); ++i)
{
if (nodeList.at(i))
cout << nodeList.at(i)->m_nValue << " " ;
}
cout<<endl;
}
void CalcPath(BSTreeNode* root,int total)
{
if(root)
{
if(root->m_nValue == total)
{
if(root->m_leftchild == NULL && root->m_rightchild == NULL)
{
nodeList.append(root);
printResult();
nodeList.pop_back();
}
}
else if(root->m_nValue < total)
{
nodeList.append(root);
CalcPath(root->m_leftchild,total - root->m_nValue);
CalcPath(root->m_rightchild,total - root->m_nValue);
nodeList.pop_back();
}
else
{
return;
}
}
return;
}
/**
2. 2
, ,
**/
BSTreeNode* convertTree2dblink(BSTreeNode* root)
{
if(root == NULL)
{
return NULL;
}
BSTreeNode* left = convertTree2dblink(root->m_leftchild);
BSTreeNode* right = convertTree2dblink(root->m_rightchild);
while(left && left->m_rightchild)
{
left = left->m_rightchild;
}
root->m_leftchild = left;
while(right && right->m_leftchild)
{
right = right->m_leftchild;
}
root->m_rightchild = right;
if(left)
left->m_rightchild = root;
if(right)
right->m_leftchild = root;
return root;
}
BSTreeNode* getdblink(BSTreeNode* root)
{
BSTreeNode* p = convertTree2dblink(root);
BSTreeNode* head = p;
while(head && head->m_leftchild) head = head->m_leftchild;
return head;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.