数据结构(Java)--查找

本文介绍了数据结构中的查找操作,包括查找的概念、平均查找长度(ASL)及其计算方式。详细讨论了顺序查找、二分查找、分块查找、散列查找以及二叉排序树等方法,并分析了它们的优缺点和适用场景。特别地,对于散列查找,解释了冲突的概念及处理冲突的开放定址法和链地址法。
摘要由CSDN通过智能技术生成
     由于查找运算的使用频率很高,几乎在任何一个计算机系统软件和应用软件中都会涉及到,所以当问题所涉及的数据量相当大时,查找方法的效率就显得格外重要。在一些实时查询系统中尤其如此。
          1、查找条件、查找操作和查找结果
      • 一个数据结构由相同数据类型的多个数据元素所组成,一个数据元素通常由多个数据项组成。
      • 关键字是数据元素中用于识别该元素的一个或多个数据项。
      • 能够唯一识别数据元素的关键字称为主关键字。
      • 查找操作:给定一个值key,在一个数据结构中找出关键字等于key的元素。
        1. 若找到,则查找成功,返回该结点的信息或该结点在表中的位置;否则查找失败,返回相关信息。
     3、查找算法效率
        • 衡量查找算法效率的主要标准是平均查找长度(Average Search length,ASL),即查找过程中关键字的平均比较次数。

        • 其中:

          ①n是结点的个数;

          ②Pi是查找第i个结点的概率。若不特别声明,认为每个结点的查找概率相等,即
                     p1=p2…=pn=1/n

          ③ci是查找第i个结点所需进行的比较次数。

          查找成功和查找不成功的平均查找长度通常不同,分别记为ASL成功和ASL不成功
 4、顺序查找算法及效率
     顺序查找的基本思想
     n从线性表的一端开始,依次将每个元素的关键字与给定值进行比较。
     l若有相等者,则查找成功;
     l否则继续比较,直到比较完所有元素,仍未有相等者,则查找不成功,给出结果信息。
     n顺序查找又称为线性查找,主要应用于数据量较小的线性表。
     n顺序查找方法既适用于顺序表,也适用于链表。
(1)顺序表的顺序查找
(2)单链表的顺序查找
(3)顺序查找算法分析
①顺序查找的优点
算法简单,且对线性表的存储结构无
/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值