알고리즘 의 미소스 코드 발표 (6)

본 고 는 (전자 공업 출판사 2016 년 출판) 제7 장의 코드 (P184 ~ P230) 를 집록 했다.전체 텍스트 디 렉 터 리, '45 개 알고리즘' 디 렉 터 리, '22 개 고전 문제 디 렉 터 리', 그리고 벌레 잡기 활동 에 대한 상세 한 정 보 는 다음 과 같은 링크 를 보십시오.http://blog.csdn.net/baimafujinji/article/details/50484348
부록 중의 고전 필기시험, 면접 문제 참고 답안 은 다음 과 같 습 니 다.
http://blog.csdn.net/baimafujinji/article/details/50484683
算法之美_源代码发布(6)_第1张图片
In genel, 나 는 책 한 권 (기술 서) 을 펼 치 는 것 을 그다지 좋아 하지 않 는 다. 그 안에 빽빽 한 것 은 모두 코드 이다.그래서 나 도 내 책 에 원리 와 사고방식 을 토론 할 수 있 는 공간 을 더 많이 남 겼 으 면 좋 겠 다.물론 코드 도 중요 하 다. 모든 원 리 는 결국 코드 에 실 현 돼 야 한다.이 때문에 나 는 그들 을 모두 책 에 나열 해서 편폭 을 차지 하 는 것 이 아니 라 블 로그 에 코드 를 올 리 는 것 에 익숙 하 다.마지막 으로 저 는 알고리즘 과 데이터 구 조 를 잘 배 우려 는 학생 들 에 게 책 에서 언급 된 알고리즘 원 리 를 철저히 격파 하고 그 이 유 를 더 잘 알 도록 하 겠 습 니 다. 그래 야 당신 이 진정 으로 배 운 것 이 라 고 할 수 있 습 니 다. 그래 야 새로운 프로 그래 밍 문 제 를 만 났 을 때 속수무책 이 되 지 않 습 니 다.
만약 당신 이 이 책의 독자 라면 알고리즘 학습 군 (495573865) 에 가입 하 는 것 을 강력 히 건의 합 니 다. 그 안에 더 많은 자원 이 당신 을 기다 리 고 있 습 니 다. 그리고 당신 이 책 을 읽 으 면서 만난 의문 도 제 첫 번 째 시간의 해답 을 얻 을 수 있 습 니 다.본 블 로그 에 더 많은 관심 을 가지 고 있 습 니 다. 저 는 이 책의 모든 소스 코드 를 본 블 로그 에 계속 발표 할 것 입 니 다.
P187  트 리 의 추상 적 데이터 구조
template<class T> class Tree;
template<class T>
class TreeNode
{

friend class Tree<T>;

private:
	T m_value;
	TreeNode<T> * leftChild;    	//      ,       
	TreeNode<T> * rightSibling;  	//         
	
public:

	TreeNode(const T&);	//    
	~TreeNode();		//    
	
	bool isLeaf();		//       
	
	T getValue();
	TreeNode<T>* getLeftChild();
	TreeNode<T>* getRightSibling();
	
	void setValue(T & value);	//      

	//           
	void setLeftChild(TreeNode<T>* pLeftChild);
	//           
	void setRightSibling(TreeNode<T>* pRightSibling); 
	
};


template<class T>class Tree
{
	TreeNode<T>* root, * parent;

	int getParent(TreeNode<T>* root,TreeNode<T>* current);

public:

	Tree();
	Tree(TreeNode<T>* rt);	//    ,      
	~Tree();		//    

	TreeNode<T> * getRoot();	//       ,    ,   Null

	//    current    ,    n    ,   Null
	TreeNode<T> * Parent(TreeNode<T> * current);
	
	//    t       ,     Null
	TreeNode<T> * getFirstChild(TreeNode<T> * t);

	//    t        ,     Null
	TreeNode<T> * getNextSibling(TreeNode<T> * t);

	//   t        n
	void insertChild(TreeNode<T> * t, TreeNode<T> * n); 

	void deleteSubTree(TreeNode<T> * t);	//   t       
	bool isEmpty();	//       
};

P193  이 진 트 리 류 의 실현
BinaryTreeNode.h
#ifndef BINARYTREENODE_H
#define BINARYTREENODE_H

#include "iostream"

using namespace std;

template <class Type>
class BinaryTreeNode 
{
	Type m_data;      //         
	BinaryTreeNode<Type> *m_leftChild; //            
	BinaryTreeNode<Type> *m_rightChild;//            

public:
	BinaryTreeNode(){m_leftChild = m_rightChild = NULL;};
	BinaryTreeNode(const Type &data,
						BinaryTreeNode *leftChild = NULL,
						BinaryTreeNode *rightChild = NULL)
	{
		m_data = data;
		m_leftChild = leftChild;
		m_rightChild = rightChild;
	};

	Type & GetData(){return m_data;};		//        

	//            
	BinaryTreeNode<Type>* GetLeftChild(){return m_leftChild;};

	//            
	BinaryTreeNode<Type>* GetRightChild(){return m_rightChild;};

	//         
	void SetData(const Type & data){m_data = data;};

	//             
	void SetLeftChild(BinaryTreeNode<Type> *leftChild){m_leftChild = leftChild;};

	//             
	void SetRightChild(BinaryTreeNode<Type> *rightChild){m_rightChild = rightChild;};
};

#endif

BinaryTree.h
#include"BinaryTreeNode.h"
#include<queue>

using namespace std;

template<class T>
class BinaryTree 
{
		BinaryTreeNode<T> *m_root;

public:

		BinaryTree(){m_root = NULL;};
		BinaryTree(T data){m_root = new BinaryTreeNode<T>(data);};
		virtual ~BinaryTree();
	
		bool IsEmpty() const{return m_root == NULL ? true:false;};//         

		//            
		bool IsLeftChild(BinaryTreeNode<T> *p)
			{return p == GetParent(p)->GetLeftChild() ? true:false;};
		//            
		bool IsRightChild(BinaryTreeNode<T> *p)
			{return p == GetParent(p)->GetRightChild() ? true:false;};
    
		//        
		BinaryTreeNode<T>* GetRoot(){return m_root;};
		//             
		BinaryTreeNode<T>* GetParent(BinaryTreeNode<T> *p){return Parent(m_root, p);};
		//             
		BinaryTreeNode<T>* LeftChild(BinaryTreeNode<T> *root) const
		{return root == NULL ? NULL:root->GetLeftChild();};
		//             
		BinaryTreeNode<T>* RightChild(BinaryTreeNode<T> *root) const
		{return root == NULL ? NULL:root->GetRightChild();};

		//            
		BinaryTreeNode<T>* LeftSibling(BinaryTreeNode<T> *leftChild);
		//            
		BinaryTreeNode<T>* RightSibling(BinaryTreeNode<T> *rightChild);

		//         
		T Retrieve(BinaryTreeNode<T> *p) const {return p->GetData();};
    
		//         
		void Assign(BinaryTreeNode<T> *p, const T &d) const {p->SetData(d);};
		//           
		void InsertRightChild(BinaryTreeNode<T> *p, const T &d) const;
		//           
		void InsertLeftChild(BinaryTreeNode<T> *p, const T &d) const; 

		//          
		void DeleteRightChild(BinaryTreeNode<T> *p){Destroy(p->GetRightChild());};
		//          
		void DeleteLeftChild(BinaryTreeNode<T> *p){Destroy(p->GetLeftChild());};
       
		virtual void PreOrderTraverse(BinaryTreeNode<T> *root) const;//       
		virtual void InOrderTraverse(BinaryTreeNode<T> *root) const;//       
		virtual void PostOrderTraverse(BinaryTreeNode<T> *root) const; //       
		virtual void LevelOrderTraverse(BinaryTreeNode<T> *root) const;//       

protected:

		BinaryTreeNode<T>* Parent(BinaryTreeNode<T> *root, BinaryTreeNode<T> *p);
		void Destroy(BinaryTreeNode<T> *p);
};

template<class T> 
BinaryTree<T>::~BinaryTree(void)
{
		Destroy(m_root);
		m_root = NULL;
}

template<class T>
BinaryTreeNode<T>* BinaryTree<T>::RightSibling(BinaryTreeNode<T> *p)
{
    BinaryTreeNode<T> *q;
    q = Parent(m_root, p);
    if ((NULL == q) || (p == q->GetRightChild()))
        return NULL;
    else
        return q->GetRightChild();
}

template<class T>
BinaryTreeNode<T>* BinaryTree<T>::LeftSibling(BinaryTreeNode<T> *p)
{
    BinaryTreeNode<T> *q;
    q = Parent(m_root, p);
    if ((NULL == q) || (p == q->GetLeftChild()))
        return NULL;
    else
        return q->GetLeftChild();
}

template<class T>
void BinaryTree<T>::InsertLeftChild(BinaryTreeNode<T> *p, const T &d) const
{
		BinaryTreeNode<T> *q = new BinaryTreeNode<T>(d);
		q->SetLeftChild(p->GetLeftChild());
		p->SetLeftChild(q);
}

template<class T>
void BinaryTree<T>::InsertRightChild(BinaryTreeNode<T> *p, const T &d) const
{
		BinaryTreeNode<T> *q = new BinaryTreeNode<T>(d);
		q->SetRightChild(p->GetRightChild());
		p->SetRightChild(q);
}

template<class T>
void BinaryTree<T>::Destroy(BinaryTreeNode<T> *p)
{
    if (NULL != p)
    {
        Destroy(p->GetLeftChild());
        Destroy(p->GetRightChild());
        delete p;
    }
}

template<class T> BinaryTreeNode<T>* 
BinaryTree<T>::Parent(BinaryTreeNode<T> *root, BinaryTreeNode<T> *p)
{
		BinaryTreeNode<T> *q;
		if (NULL == root)
			return NULL;

		if ((p == root->GetLeftChild()) || (p == root->GetRightChild()))
			return root;

		if (NULL != (q = Parent(root->GetLeftChild(), p)))
			return q;
		else
			return Parent(root->GetRightChild(), p);
}

template<class T>
void BinaryTree<T>::LevelOrderTraverse(BinaryTreeNode<T> *root) const
{
		queue<BinaryTreeNode<T> *> q;
		if (NULL != root)
			q.push(root);

		while (!q.empty())
		{
			root = q.front(), q.pop();
			cout << root->GetData();
			if (root->GetLeftChild())
				q.push(root->GetLeftChild());
			if (root->GetRightChild())
				q.push(root->GetRightChild());
		}
}

P195  이 진 트 리 의 테스트 코드
main.cpp
#include"BinaryTreeNode.h"
#include"BinaryTree.h"
#include"iostream"

using namespace std;

int main()
{

	BinaryTree<char> myBinTree('a');

	myBinTree.InsertLeftChild(myBinTree.GetRoot(), 'D');
	myBinTree.InsertRightChild(myBinTree.GetRoot(), 'G');

	myBinTree.InsertLeftChild(myBinTree.GetRoot(), 'B');
	myBinTree.InsertRightChild(myBinTree.GetRoot()->GetLeftChild(), 'E');

	myBinTree.InsertRightChild(myBinTree.GetRoot(), 'C');
	myBinTree.InsertLeftChild(myBinTree.GetRoot()->GetRightChild(), 'F');


	cout << "        ? : " << myBinTree.IsEmpty() << endl;
	cout << "               : " 
		<< myBinTree.Retrieve(myBinTree.GetRoot());
	cout << endl << "                A!";
	myBinTree.Assign(myBinTree.GetRoot(), 'A');
	cout << "                : "
		<< myBinTree.Retrieve(myBinTree.GetRoot()) << endl;

	cout << "        : " << endl;
	myBinTree.LevelOrderTraverse(myBinTree.GetRoot());
 
	cout << endl;
	return 0;
}

P198-1  재 귀적 으로 실 현 된 PreOrder Traverse () 함수
template<class T>
void BinaryTree<T>::PreOrderTraverse(BinaryTreeNode<T> *root) const
{

    if (NULL != root)
    {
        cout << root->GetData();

        PreOrderTraverse(root->GetLeftChild());
        PreOrderTraverse(root->GetRightChild());
     }
}

P198-2  스 택 (비 재 귀적) 기반 PreOrderTraverse () 함수
template<class T>
void BinaryTree<T>::PreOrderTraverse(BinaryTreeNode<T> *root)   const
{
	stack<BinaryTreeNode<T>*> s;
	BinaryTreeNode<T> *p=root;
	while(!s.empty()||p!=NULL)
	{
		while(p)
		{
			s.push(p);
			cout<<p->GetData();
			p=p->GetLeftChild();
		}
			p=s.top();
			s.pop();
			p=p->GetRightChild();
	}
}

P199-1  재 귀적 으로 실 현 된 InOrderTraverse () 함수
template<class T>
void BinaryTree<T>::InOrderTraverse(BinaryTreeNode<T> *root) const
{
    if (NULL != root)
    {
        InOrderTraverse(root->GetLeftChild());
        cout << root->GetData();
        InOrderTraverse(root->GetRightChild());
    }
}

P199 - 2 스 택 (비 재 귀적) 기반 InOrderTraverse () 함수
template<class T>
void BinaryTree<T>::InOrderTraverse(BinaryTreeNode<T> *root) const
{
	stack<BinaryTreeNode<T>*> s;
	BinaryTreeNode<T> *p=root;
	while(!s.empty()||p!=NULL)
	{
		while(p)
		{
			s.push(p);
			p=p->GetLeftChild();
		}
		
		p=s.top();
		s.pop();
		cout<<p->GetData();
		p=p->GetRightChild();
	}
}

P200  재 귀적 으로 실 현 된 PostOrder Traverse () 함수
template<class T>
void BinaryTree<T>::PostOrderTraverse(BinaryTreeNode<T> *root) const
{
    if (NULL != root)
    {
        PostOrderTraverse(root->GetLeftChild());
        PostOrderTraverse(root->GetRightChild());

        cout << root->GetData();
    }
}

P206  나무의 노드 클래스 중 일부 주요 구성원 함수 의 실현
template<class T>
TreeNode<T>::TreeNode(const T& value)
{
	m_value=value;
	leftChild=rightSibling=NULL;
}

template<class T>
bool TreeNode<T>::isLeaf()
{
	if(NULL==leftChild)
		return true;
	else return false;
}

template<class T>
T TreeNode<T>::getValue()
{
	return m_value;
}

template<class T>
void TreeNode<T>::setValue(T & value)
{
	m_value = value;
}

template<class T>
TreeNode<T>* TreeNode<T>::getLeftChild()
{
	return leftChild;
}

template<class T>
TreeNode<T>* TreeNode<T>::getRightSibling()
{
	return rightSibling;
}

template<class T>
void TreeNode<T>::setLeftChild(TreeNode<T>* pLeftChild)
{
	leftChild = pLeftChild;
}

template<class T>
void TreeNode<T>::setRightSibling(TreeNode<T>* pRightSibling)
{
	rightSibling = pRightSibling;
}

P207  트 리 중 일부 주요 구성원 함수 의 실현
template<class T>
Tree<T>::Tree()
{
	root = NULL;
	parent = NULL;
}

template<class T>
Tree<T>::Tree(TreeNode<T>* rt)
{
	root = rt;
	parent = NULL;
}

template<class T>
TreeNode<T> * Tree<T>::getRoot()
{
	return root;
}

template<class T>
bool Tree<T>::isEmpty()
{
	if(root == NULL)
		return true;
	else 
		return false;
}

template<class T>
int Tree<T>::getParent(TreeNode<T>* t,TreeNode<T>* p)
{
	TreeNode<T>* q = t->getLeftChild();

	while(q!=NULL && q!=p)
	{
		if( getParent(q, p) != 0 )
			return 2;

		q = q->getRightSibling();
	}

	if(q!=NULL && q==p)
	{
		parent = t;
		return 1;
	}
	else return 0;

}

template<class T>
TreeNode<T> * Tree<T>::Parent(TreeNode<T>* current)
{
	TreeNode<T>* pointer=current, *t;

	if(current==NULL||current==root)
	{
		current = NULL;
		return 0;
	}

	t = root;

	getParent(t, pointer);

	return parent;
}

template<class T>
TreeNode<T> * Tree<T>::getFirstChild(TreeNode<T> * t)
{
	return t->getLeftChild();
}

template<class T>
TreeNode<T> * Tree<T>::getNextSibling(TreeNode<T> * t)
{	
	return t->getRightSibling();
}

template<class T>
void Tree<T>::insertChild(TreeNode<T> * t, TreeNode<T> * n)
{
	if(t->getLeftChild()==NULL)
		t->setLeftChild(n);
	else
	{
		TreeNode<T> * p=t->getLeftChild();
		while(p->getRightSibling()!=NULL)
			p=p->getRightSibling();
		p->setRightSibling(n);
	}
}

P218  하프 만 코드
#include "stdafx.h"
#include <iostream>
#include <string>
#include <queue>
#include <map>
#include <iterator>
#include <algorithm>

using namespace std;
 
typedef vector<bool> HuffCode;
typedef map<char, HuffCode> HuffCodeMap;
 
class INode
{
public:
    const int f;
 
    virtual ~INode() {}
 
protected:
    INode(int f) : f(f) {}
};
 
class InternalNode : public INode
{
public:
    INode *const left;
    INode *const right;
 
    InternalNode(INode* c0, INode* c1) : INode(c0->f + c1->f), left(c0), 

right(c1) {}
    ~InternalNode()
    {
        delete left;
        delete right;
    }
};
 
class LeafNode : public INode
{
public:
    const char c;
 
    LeafNode(int f, char c) : INode(f), c(c) {}
};
 
struct NodeCmp
{
    bool operator()(const INode* lhs, const INode* rhs) const { return 

lhs->f > rhs->f; }
};
 
INode* BuildTree(map<char, int> frequs)
{
    priority_queue<INode*, vector<INode*>, NodeCmp> trees;

	map<char, int>::iterator it = frequs.begin();
	for ( ; it != frequs.end(); it++)
	{
		trees.push(new LeafNode(it->second,  it->first));
	}
 
    while (trees.size() > 1)
    {
        INode* childR = trees.top();
        trees.pop();
 
        INode* childL = trees.top();
        trees.pop();
 
        INode* parent = new InternalNode(childR, childL);
        trees.push(parent);
    }
    return trees.top();
}
 
void GenerateCodes(const INode* node, const HuffCode& prefix, HuffCodeMap& 

outCodes)
{
    if (const LeafNode* lf = dynamic_cast<const LeafNode*>(node))
    {
        outCodes[lf->c] = prefix;
    }
    else if (const InternalNode* in = dynamic_cast<const InternalNode*>

(node))
    {
        HuffCode leftPrefix = prefix;
        leftPrefix.push_back(false);
        GenerateCodes(in->left, leftPrefix, outCodes);
 
        HuffCode rightPrefix = prefix;
        rightPrefix.push_back(true);
        GenerateCodes(in->right, rightPrefix, outCodes);
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
	//     
	map<char, int> frequs;
	cout<<"         :"<<endl;
    string str;
	getline(cin, str);
    const char* ptr = str.c_str();
	
    while (*ptr != '\0')
	{
		if(frequs.find(*ptr)!=frequs.end())
			frequs[*ptr]=frequs[*ptr]+1;
		else
			frequs[*ptr]=1;
		*ptr++;
	}

	INode* root = BuildTree(frequs);
 
    HuffCodeMap codes;
    GenerateCodes(root, HuffCode(), codes);
    delete root;
 
    for (HuffCodeMap::const_iterator it = codes.begin(); it != codes.end(); ++it)
    {
        cout << it->first << " ";
        copy(it->second.begin(), it->second.end(),ostream_iterator<bool>(cout));
        cout << endl;
    }

	system("PAUSE");
    return 0;
}

P224  STL 의 vector 사용 예시
#include <string>
#include <iostream>
#include <vector>

using namespace std;

int main() {

    vector<int> v1(10);
    vector<double> v2;
    vector<string> v3(10, "OK!");
	vector<string> v4(v3);

	v1[1] = 2;
	v1.at(2) = 45;

	for(int i = 0; i < 9; i++)
	{
		v2.push_back(1.0+i);
	}

	v2.pop_back();

	cout<<v2.back()<<endl;
	cout<<v2.front()<<endl;
	cout<<v2.at(5)<<endl;
	cout<<v1[2]<<endl;

	for(i = 0; i < 10; i++)
		cout<<v3[i]<<" ";
	cout<<endl;
	for(i = 0; i < 10; i++)
		cout<<v4[i]<<" ";
	cout<<endl;

	return 0;
}

P226  vector 기반 트 리 구조
#include<vector> 
#include<iostream>

using namespace std;

class TreeNode
{
	int num;
	vector<TreeNode*> * Sub;

public:

	TreeNode::TreeNode(int n)
	{
		num = n; Sub = NULL;
	}
	int getNum(){return num;}
	vector<TreeNode*> * getSub(){return Sub;}
	void setNum(int n)
	{
		this->num = n;
	}
	void setSub(vector<TreeNode*> * newSub)
	{
		this->Sub = newSub;
	}

	//       
};

class Tree
{
	TreeNode* root;

public:
	Tree(TreeNode* rt){root = rt;}

	void DisplayTree(TreeNode * r)
	{
		cout<<r->getNum()<<endl;

		if(r->getSub()==NULL)
		{
			cout<<"       !"<<endl;
			return;
		}
		cout<<"        :"; 
		for(int i = 0; i < (r->getSub())->size(); i++)
		{
			cout<<(r->getSub())->at(i)->getNum()<<" ";
		}

		cout<<endl;

		for(i = 0; i < (r->getSub())->size(); i++)
		{
			DisplayTree((r->getSub())->at(i));
		}
	}
	
	//       
};

int main()
{
	TreeNode treenode0(0);
	TreeNode treenode1(1);
	TreeNode treenode2(2);
	TreeNode treenode3(3);
	TreeNode treenode4(4);
	TreeNode treenode5(5);
	TreeNode treenode6(6);

	vector<TreeNode*> subOfTreeNode0, subOfTreeNode1, subOfTreeNode2;

	subOfTreeNode0.push_back(&treenode1);
	subOfTreeNode0.push_back(&treenode2);

	subOfTreeNode1.push_back(&treenode3);

	subOfTreeNode2.push_back(&treenode4);
	subOfTreeNode2.push_back(&treenode5);
	subOfTreeNode2.push_back(&treenode6);

	treenode0.setSub(&subOfTreeNode0);
	treenode1.setSub(&subOfTreeNode1);
	treenode2.setSub(&subOfTreeNode2);

	Tree tree(&treenode0);
	tree.DisplayTree(&treenode0);

	return 0;
}

P228  STL 의 map 사용 예시
#include<map>
#include<string>
#include<iostream>

using namespace std;

int main()
{
	map<string, string> writer;

	writer["Shakespeare"] = "English writer, 
		his works include 'Hamlet', 'Othello', and 'King Lear', etc.";
	writer["Tagore"] = "India writer, 
		his works include 'Gitanjali', etc.";
	writer["Tolstoy"] = "Russian writer, 
		his works include 'War and Peace', and 'Anna Karenina', etc.";
	writer["Andersen"] = "Danish writer, 
		his works include 'The Ugly Duckling', etc.";
	writer["Dumas"] = "French writer, 
		his works include 'The Count of Monte Cristo', and 'The Three Musketeers', etc.";

	cout<<writer.size()<<endl<<endl;

	int i = 1;

	map<string, string>::iterator it = writer.begin();
	for ( ; it != writer.end(); it++)
	{
		cout << i << " : " <<endl;
		cout << it->first << ": " << it->second << endl;
		i++;
	}

	cout<<endl;
	cout<<(writer.find("Tagore"))->second<<endl<<endl;

	writer.erase(writer.find("Tagore"));
	cout<<writer.size()<<endl<<endl;

	writer.clear();
	cout<<writer.size()<<endl;

	return 0;
}

내용 소개: 비밀 알고리즘 세 계 를 탐색 하고 데이터 구조의 길 을 모색 한다.전형 적 인 문 제 를 모 아 프로 그래 밍 기법 의 취 미 를 즐 깁 니 다.구직 핫 이 슈 를 지적 하여 개업 계 의 유명 기업 의 문 을 두드리다.이 책 은 알고리즘 과 데이터 구조 라 는 화 제 를 중심 으로 현대 컴퓨터 기술 에서 자주 사용 하 는 40 여 개의 전형 적 인 알고리즘 과 역 추적 법, 분 치 법, 탐욕 법 과 동적 계획 등 알고리즘 디자인 사상 을 점차적으로 소개 했다.이 과정 에서 이 책 은 링크 (단 방향 링크, 단 방향 순환 링크 와 양 방향 순환 링크 포함), 스 택, 대기 열 (일반 대기 열 과 우선 순위 대기 열 포함), 트 리 (이 진 트 리, 하프 만 트 리, 더미, 레 드 블랙 트 리, AVL 트 리 와 사전 트 리 포함), 그림, 집합 (교차 하지 않 음 포함) 과 사전 등 상용 데이터 구 조 를 체계적으로 설명 했다.이 동시에 22 개의 전형 적 인 문제 (조세 프 링 문제, 한 노 타 문제, 8 황후 문제 와 기사 여행 문제 등 포함) 에 대한 설명 을 통 해 데이터 구조 뒤에 숨겨 진 알고리즘 원 리 를 점차적으로 밝 히 고 독자 들 이 지식 비축 을 다 지 는 데 도움 을 주 며 사고 기술 을 활성화 시 키 고 최종 적 으로 프로 그래 밍 능력 의 향상 을 방해 하 는 복잡 한 울 타 리 를 돌파 하려 고 한다.완전한 C + + 소스 코드 를 추가 하고 STL 의 각종 용 기 를 삽입 하여 소개 합 니 다.
인터넷 서점:
중국 - pub 중국 상호작용 출판 망:http://product.china-pub.com/4911922
당당 망:http://product.dangdang.com/23851244.html
아마 존:http://www.amazon.cn/%E7%AE%97%E6%B3%95%E4%B9%8B%E7%BE%8E-%E9%9A%90%E5%8C%BF%E5%9C%A8%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%83%8C%E5%90%8E%E7%9A%84%E5%8E%9F%E7%90%86-%E5%B7%A6%E9%A3%9E/dp/B01AGNUIE8/ref=sr_1_8?ie=UTF8&qid=1453527399&sr=8-8&keywords=%E5%B7%A6%E9%A3%9E

좋은 웹페이지 즐겨찾기