二叉搜索树在数据结构中的应用与优势

版权申诉
0 下载量 129 浏览量 更新于2024-07-03 收藏 711KB PDF 举报
“这是一份关于数据结构的英文教学课件,重点讲述了搜索算法,特别是二叉搜索树(Binary Search Trees, BST)的概念、操作以及平衡树(如AVL树)的相关知识。” 在计算机科学中,数据结构是组织和管理大量数据的一种方式,它对提升算法效率至关重要。本课件主要探讨了数据结构中的一个重要主题——搜索,具体聚焦于二叉搜索树。二叉搜索树是一种特殊的二叉树,其特性在于每个节点的值都大于左子树中所有节点的值,并小于右子树中所有节点的值。这种结构使得搜索、插入和删除操作变得高效。 搜索是数据处理的基本操作,对于有序数组,二分查找算法可以快速定位目标元素。然而,当需要插入新元素时,如果数组已经排序,可能会导致大量的元素移动,从而降低了插入效率。二叉搜索树的出现解决了这个问题,它允许我们在保持搜索高效的同时,也能够快速地进行插入操作。在二叉搜索树中,搜索、插入和删除操作的时间复杂度理论上都可以达到O(log n),其中n是树中节点的数量。 二叉搜索树的操作包括: 1. **搜索**:从根节点开始,根据节点值与目标值的比较,向左子树或右子树递归查找。由于树的结构特性,搜索速度非常快。 2. **插入**:同样从根节点开始,找到适合新节点的插入位置。如果新节点的值小于当前节点,向左子树移动;反之,向右子树移动。若到达叶子节点,新节点就插入到该位置。 3. **删除**:稍微复杂,可能涉及调整树的结构以保持二叉搜索树的性质。删除节点可能需要将其他节点上移或者合并子树。 然而,未经平衡的二叉搜索树可能会退化成链表,导致搜索性能下降。为了保持树的平衡,出现了平衡二叉树,例如**AVL树**。AVL树是一种自平衡的二叉搜索树,它的任何节点的两个子树的高度差不超过1,这确保了其搜索、插入和删除操作的平均时间复杂度仍为O(log n)。 在AVL树中,通过旋转操作(左旋、右旋和双旋)来维护树的平衡。当插入或删除节点导致不平衡时,会自动进行相应的旋转,以恢复树的平衡状态。这样的平衡策略确保了AVL树在大多数情况下都能保持高效的性能。 这份教学课件深入浅出地介绍了二叉搜索树及其操作,同时也引入了平衡二叉树的概念,对于理解数据结构中的搜索算法和优化有极大的帮助,尤其对从事数据分析、大数据处理和数据挖掘等领域的人士来说,是不可或缺的基础知识。

def compute_mAP(trn_binary, tst_binary, trn_label, tst_label): """ compute mAP by searching testset from trainset https://github.com/flyingpot/pytorch_deephash """ for x in trn_binary, tst_binary, trn_label, tst_label: x.long() AP = [] Ns = torch.arange(1, trn_binary.size(0) + 1) Ntest = torch.arange(1, tst_binary.size(0) + 1) print("trn_binary.size(0):",trn_binary.size(0)) print("tst_binary.size(0):", tst_binary.size(0)) print("Ns:",Ns) print("Ns:", Ntest) # print("Ns(train):",Ns) for i in range(tst_binary.size(0)): query_label, query_binary = tst_label[i], tst_binary[i] # 把测试图像编码和标签赋值给->查询图像编码和标签 _, query_result = torch.sum((query_binary != trn_binary).long(), dim=1).sort() # 判断查询图像编码是否等于训练图像编码,相等的总和,并排序。 print("查询标签-----------------------------------------------------:",query_label) print("查询二进制:", query_binary) print(len(query_binary)) print("查询结果:",query_result) print("是否相等:",query_binary != trn_binary) print("查询结果1:", torch.sum((query_binary != trn_binary).long(), dim=1)) print("查询结果2:",torch.sum((query_binary != trn_binary).long(), dim=1).sort()) correct = (query_label == trn_label[query_result]).float() # 正确匹配的二进制编码个数 print("trn_label[query_result]:",trn_label[query_result]) num_ones = torch.sum(correct == 1) print("查询正确的个数:",num_ones) print("查询正确:",correct) P = torch.cumsum(correct, dim=0) / Ns print("torch.cumsum(correct, dim=0)",torch.cumsum(correct, dim=0)) print("查询正确/Ns",torch.Tensor(P)) #每个位置的精度 P AP.append(torch.sum(P * correct) / torch.sum(correct)) # print("---:",AP) acc = num_ones / tst_binary.size(0) print("ACC================================== ", acc) mAP = torch.mean(torch.Tensor(AP)) return mAP 请问怎么将这段代码改成EER评估指标的代码

2023-07-12 上传