决策树算法ID3算法源代码&数据文件

本文提供了ID3算法的C++实现,包括决策树的插入、删除操作,以及数据处理函数。代码中展示了如何读取数据、计算信息增益、生成决策树并输出决策规则。
摘要由CSDN通过智能技术生成

//
/*
*
*
*
* 文件名称:ID3.cpp
*
* 摘 要:ID3算法实现

*
* 当前版本:1.0

* 完成日期:2011.01.13

 

*/


#include <stdio.h>
#include <iostream>
#include <vector>
#include <math.h>
#include <string.h>

using namespace  std;


typedef struct tnode
{
 char tdata[100];

}tnode;

typedef struct Tree_Node
{
 char name[100];
 bool isLeaf; //标记是否叶子节点

 vector<tnode> att_list;//属性名称列表

 vector<Tree_Node * > child_list;


}Tree_Node,* pTreeNpde;

typedef struct dnode
{
 vector<tnode>row;
}dnode;

typedef struct D_Node
{
 vector<dnode>DB;
 vector<tnode> attr_name;
 tnode class_name;
 
}D_Node;

D_Node G_DB;
pTreeNpde Root = NULL;

 


typedef struct FreeQNode
{
 char name[100];
 int count;
 vector<int> Set_ID;
}FreeQNode;

typedef struct FreeQNodeDouble
{
 char name[100];
 int count;
 vector<int> row_id;

 vector<FreeQNode> classes;//存放分类属性列表及相应的出现次数
}FreeQNodeDouble;

typedef struct attr_node
{
 int attr_id;
 vector<tnode> attr_name;
 vector<int> count_list;
 
}attr_node;

vector<attr_node> G_Attr_List;


typedef struct binNode
{
 char name[100];
 int count;
 vector<int> Set_ID;

 struct binNode * lchild;
 struct binNode * rchild;
}binNode;

typedef struct binNodeDouble
{
 char name[100];
 int count;
 vector<int> row_id;
 struct binNodeDouble * lchild;
 struct binNodeDouble * rchild;

 vector<FreeQNode>  classes;

}binNodeDouble;

 

 

void insert_tree(binNode  * & r, char str[100])
{

 if (NULL == r)
 {
 
  binNode * node = new binNode;
  strcpy(node->name,str);
  node->count = 1;
  //printf("[%s,%d]\n",node->name,node->count);
  node->lchild = node->rchild = NULL;
  r = node;
 }
 else
 {
  if (strcmp(r->name,str) == 0)
  {
   r->count ++;
  }
  else if (strcmp(r->name,str) < 0)
  {
   insert_tree(r->lchild,str);
  }
  else
  {
   insert_tree(r->rchild,str);
  }
 }

}

void delete_bin_tree(binNode *& r)
{
 if (r != NULL)
 {
  delete_bin_tree(r->lchild);
  delete_bin_tree(r->rchild);
  delete(r);
  r = NULL;
 }
}


void Bin_tree_inorder(binNode * r,vector<FreeQNode> & Fq)
{
 if (r != NULL)
 {
  Bin_tree_inorder(r->lchild,Fq);

  FreeQNode ft;
  //printf("%s,%d\n",r->name,r->count);
  strcpy(ft.name,r->name);
  ft.count = r->count;
  for (int i= 0;i < r->Set_ID.size();i++)
  {
   ft.Set_ID.push_back(r->Set_ID[i]); //保存子集对应的ID号
  }

  Fq.push_back(ft); //此处少了这条语句,造成结果无法返回

  Bin_tree_inorder(r->rchild,Fq);

 }
}


void Get_attr(binNode * r,attr_node & attr)
{
 if (r != NULL)
 {
  Get_attr(r->lchild,attr);

  tnode t;
  strcpy(t.tdata,r->name);

   
  //printf("%s,%d\n",r->name,r->count);
  attr.attr_name.push_back(t);
  attr.count_list.push_back(r->count);//保存出现次数
  
  Get_attr(r->rchild,attr);
  
 }
}


void insert_tree_double(binNodeDouble *& r, int DB_ID,char attr_name[100],char class_name[100])
{
 
 if (NULL == r)
 {
  binNodeDouble * node = new binNodeDouble;
  strcpy(node->name,attr_name);
  node->count = 1; 
  node->row_id.push_back(DB_ID);

  node->lchild = node->rchild = NULL;  


  FreeQNode fq;
  strcpy(fq.name,class_name);
  fq.count = 1;
  fq.Set_ID.push_back(DB_ID); //保存子集所对应的ID号
  node->classes.push_back(fq);
  r= node;
 }
 else
 {
  if (strcmp(r->name,attr_name) == 0)
  {
   r->count ++;
   r->row_id.push_back(DB_ID);//这里也需要保存相应的ID号

   bool found = false;

   for (int i = 0; i< r->classes.size()

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值