数据结构:哈希搜索深度解析

版权申诉
0 下载量 78 浏览量 更新于2024-07-03 收藏 153KB PDF 举报
“27_searching_03.pdf是关于数据结构的英文教学课件,主要探讨了搜索技术,特别是哈希(Hashing)相关的概念,包括哈希函数和冲突解决策略,如开放寻址法(Openhashing)和闭合寻址法(Closedhashing)。” 在数据结构领域,搜索是核心操作之一,它涉及查找特定元素或记录。本课件详细介绍了哈希搜索方法,这是一种高效的数据检索技术。哈希(Hashing)是一种通过计算哈希函数将键值(Key)映射到数组中的特定位置来快速定位数据的方法。哈希函数h负责将键转化为数组的索引,而哈希表(Hashtable)则是存储这些键值对的数组。 基本思想是利用哈希函数将键迅速转换为数组的索引位置。理想情况下,如果元素e的键是k,并且使用哈希函数h,那么元素e会被存储在哈希表的h(k)位置。搜索元素e时,只需计算h(k),就可以找到相应的数组位置。如果该位置没有元素,则表示哈希表中不存在元素e。 以学生记录的字典为例,键可以是ID号码(如95100)。通过哈希函数,我们可以将ID号码映射到哈希表的一个槽(Slot)中,这样在需要查找特定学生信息时,能迅速定位到对应记录,提高查询效率。 然而,哈希过程中可能会遇到一个问题,即不同的键可能通过哈希函数映射到同一个位置,这称为冲突(Collision)。课件中提到了两种常见的冲突解决策略: 1. 开放寻址法(Openhashing):当发生冲突时,不是在冲突的位置存储元素,而是寻找下一个空槽来存放。这通常通过线性探测、二次探测或双哈希等方法实现。 2. 闭合寻址法(Closedhashing),也称为链地址法,每个槽位关联一个链表,所有哈希到同一位置的元素都链接在这个链表上。当查找时,先计算哈希值,然后沿着链表搜索。 这些概念和技术对于理解和优化数据结构,尤其是处理大量数据的系统,具有重要意义。掌握哈希搜索可以帮助开发者设计出更高效的数据访问和存储方案。

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 上传