C++实现二叉搜索树(BST)的源码分析

版权申诉
0 下载量 57 浏览量 更新于2024-12-16 收藏 2KB RAR 举报
资源摘要信息:"bst_in" 知识点一:二叉搜索树(Binary Search Tree,BST)的基本概念 二叉搜索树是一种特殊的二叉树结构,它满足以下性质: 1. 若任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。 2. 若任意节点的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。 3. 任意节点的左、右子树也分别为二叉搜索树。 知识点二:二叉搜索树的作用和优势 二叉搜索树作为数据结构,在查找(搜索)、插入和删除操作中可以提供对数时间复杂度(O(log n)),前提是树是平衡的。由于其快速的搜索能力,二叉搜索树广泛应用于数据库索引、文件系统的目录结构等领域。 知识点三:二叉搜索树的实现 在C++中实现二叉搜索树通常需要定义一个树节点类(通常包含数据域、左子树指针和右子树指针)以及一系列操作该树的方法,例如插入、查找和删除。 知识点四:C++中实现二叉搜索树的代码示例 在给定的文件中,文件名"imp_BST.CPP"暗示了这是一个C++语言实现二叉搜索树的代码文件。代码可能包含以下几个主要部分: 1. 定义二叉树节点结构(通常是一个结构体或类,包含整型数据成员和两个指向其他同类对象的指针成员)。 2. 实现插入操作的方法,该方法会根据新插入的值与当前节点的值的比较,递归地在左子树或右子树上执行插入操作。 3. 实现查找操作的方法,用于搜索树中是否存在特定值的节点。 4. 实现删除操作的方法,需要注意删除节点时可能需要进行节点的递归替换,特别是在删除的节点有子节点的情况下。 5. 其他辅助方法,如遍历树(前序、中序、后序遍历)、获取树的高度、计算树的大小等。 知识点五:二叉搜索树的潜在问题及其解决方法 尽管二叉搜索树在理想状况下效率很高,但最坏情况下(例如插入的序列已经有序),它可能退化成一个链表,此时查找、插入和删除操作的时间复杂度变为O(n)。为了避免这个问题,通常需要通过平衡二叉树技术来维持树的平衡,例如AVL树、红黑树等。 知识点六:二叉搜索树的应用场景 二叉搜索树在计算机科学的许多领域中都有广泛的应用。例如,在数据库系统中,索引通常是通过一种平衡的二叉搜索树(如B树)实现的,以确保数据操作的效率。在编译器的符号表实现中,二叉搜索树也经常被用来快速查找变量的定义。 知识点七:BST.rar_bst_in文件的内容推测 根据文件名"BST.rar_bst_in"和描述"c++",可以推测该文件包含了用C++语言实现的二叉搜索树的相关内容,可能是源代码文件。其中"bst_in"标签表明该文件专注于二叉搜索树的内部实现和处理。 知识点八:如何处理bst_in文件中的代码 开发者在处理"BST.rar_bst_in"文件时,应仔细阅读每个函数和类的实现,理解它们各自的工作原理。对于初学者,建议手动实现一遍二叉搜索树,并与提供的代码进行比较,从而更好地掌握二叉搜索树的算法思想和编程技巧。对于有经验的开发者,可以从文件中寻找优化和扩展树功能的可能性,以及考虑树在特定场景下的应用。
2023-06-03 上传

import pandas as pd from sklearn import metrics from sklearn.model_selection import train_test_split import xgboost as xgb import matplotlib.pyplot as plt import openpyxl # 导入数据集 df = pd.read_csv("/Users/mengzihan/Desktop/正式有血糖聚类前.csv") data=df.iloc[:,:35] target=df.iloc[:,-1] # 切分训练集和测试集 train_x, test_x, train_y, test_y = train_test_split(data,target,test_size=0.2,random_state=7) # xgboost模型初始化设置 dtrain=xgb.DMatrix(train_x,label=train_y) dtest=xgb.DMatrix(test_x) watchlist = [(dtrain,'train')] # booster: params={'booster':'gbtree', 'objective': 'binary:logistic', 'eval_metric': 'auc', 'max_depth':12, 'lambda':10, 'subsample':0.75, 'colsample_bytree':0.75, 'min_child_weight':2, 'eta': 0.025, 'seed':0, 'nthread':8, 'gamma':0.15, 'learning_rate' : 0.01} # 建模与预测:50棵树 bst=xgb.train(params,dtrain,num_boost_round=50,evals=watchlist) ypred=bst.predict(dtest) # 设置阈值、评价指标 y_pred = (ypred >= 0.5)*1 print ('Precesion: %.4f' %metrics.precision_score(test_y,y_pred)) print ('Recall: %.4f' % metrics.recall_score(test_y,y_pred)) print ('F1-score: %.4f' %metrics.f1_score(test_y,y_pred)) print ('Accuracy: %.4f' % metrics.accuracy_score(test_y,y_pred)) print ('AUC: %.4f' % metrics.roc_auc_score(test_y,ypred)) ypred = bst.predict(dtest) print("测试集每个样本的得分\n",ypred) ypred_leaf = bst.predict(dtest, pred_leaf=True) print("测试集每棵树所属的节点数\n",ypred_leaf) ypred_contribs = bst.predict(dtest, pred_contribs=True) print("特征的重要性\n",ypred_contribs ) xgb.plot_importance(bst,height=0.8,title='影响糖尿病的重要特征', ylabel='特征') plt.rc('font', family='Arial Unicode MS', size=14) plt.show()

2023-07-07 上传