zoukankan      html  css  js  c++  java
  • 树的广义表

    人工智能实验课实现ID3算法时,需要把最终的决策树输出出来

    考虑每个节点的名字长度、孩子个数都不同,直接层级遍历对齐起来很麻烦且容易出现歧义,所以决定用广义表的形式输出决策树

    由于广义表中的元素顺序具有相对顺序,所以采用形式Root({weight1}subTree1,{weight2}subTree2,...)来表示树,其中每个subTree都是广义表,{weight}是根和这棵子树相连边的权重值

    现在用http://blog.csdn.net/u013018721/article/details/38042561?utm_source=tuicool&utm_medium=referral中给出的ID3决策树实例作为例子说明

    此时根节点为“年龄”,则一开始建立的广义表应为“年龄”({<=30}“长相”子树,{>30}【不见】),其中为了区分,【...】表示叶子

    而“长相”子树也是用相同的方法递归地建立,则最终建成的广义表为:

    “年龄”({<=30}“长相”({帅}“收入”({高}【见】,{中等}“公务员”({是}【见】,{不是}【不见】),{低}【不见】),{丑}【不见】),{>30}【不见】)

    下面是代码实现,首先构建根节点,再递归地构建所有子树,直到叶子

    树节点定义(孩子兄弟表示法)

    struct TNode
    {
    	AttrType 	type; //属性名 
    	AttrValue 	value,//边权重 
    				res;  //数据 
    	TNode *firstchild, *nextsibling;
    };

    输出广义表实现

    void showTreeLists(TNode *T)
    {
    	TNode *p;
    	if(!T)
    		return;
        //输出边的权重
    	cout<<"{";
    	if(T->value!=voi)
    		cout<<name_map[T->value];
    	cout<<"}";
    
        //输出节点属性名
    	if(T->type==contact_lenses)
    		cout<<name_map[T->res];
    	else
    		cout<<type_map[T->type];
    
        //递归构建所有孩子所对应的子树
    	p = T->firstchild;
    	if (p)
    	{
    		cout<<"(";
    		while (p)
    		{
    			treelists(p);
    			p = p->nextsibling;
    			if (p)cout<<',';
    		}
    		cout<<")";
    	}
    }
    

      

  • 相关阅读:
    nginx
    mysql
    intelij maven
    redis命令大全
    绑定touch事件后click无效,vue项目解决棒法
    新的用法
    img
    vuedragable
    自己总结
    vuex的项目在id中不能运行
  • 原文地址:https://www.cnblogs.com/liziran/p/6117199.html
Copyright © 2011-2022 走看看