LeetCode分类练习-Task03:查找1

查找/搜索

得益于大二下的《数据结构与算法》,我对于排序和查找进行了比较系统的学习(在我看来排序的前提就是查找,找不到怎么排序呢)。
想要在一组数据中查找想要的东西,就不可避免的需要遍历数据,那么有效的缩小需要遍历的范围,从而提升程序运行速度,就是算法存在的意义,对于不同种类的数据,需要不同的算法去适合和优化。

python有与查找相关的功能和函数,例如简单常用的↓

str.find(str, beg=0, end=len(string))
if _ in str

这些功能和函数具有普适性,对于绝大多数情况都适用,但换而言之,它对一些具有特点的数据或者数量庞大的数据并没有很好的适应,是十分低效的方法。

六大查找算法

  1. 顺序查找

顺序查找又称为线性查找,是一种最简单的查找方法,也是其他算法的基础。适用于线性表的顺序存储结构和链式存储结构。

基本思路
从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1。

缺点: 是当n 很大时,平均查找长度较大,效率低;
优点: 是对表中数据元素的存储没有要求。另外,对于线性链表,只能进行顺序查找。

  1. 分块查找

要求是顺序表,分块查找又称索引顺序查找,它是顺序查找的一种改进方法。

算法思想于算法描述

将n个数据元素"按块有序"划分为m块(m ≤ n)。
每一块中结点不必有序,但块与块之间必须"按块有序"(类似推排序)
即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;
而第2块中任一元素又都必须小于第3块中的任一元素,……
1、先选取各块中的最大关键字构成一个索引表;
2、对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;
3、在已确定的块中用顺序法进行查找。
  1. 二分查找(Binary Search)

二分查找是十分常用的查找方法,是一种在有序数组中查找某一特定元素的查找算法。这种查找算法每一次比较都使查找范围缩小一半。

基本思路于算法描述

给予一个包含 n个带值元素的数组A 
    1、 令 L为0 , R为 n-1 ,T为目标值;
    2、 如果L>R,则结束搜索 ;
    3、 令 m (中间值元素)为  ⌊(L+R)//2⌋(取整);
    4、 如果 m<T,令 L为 m + 1 并回到步骤二 ;
    5、 如果 m>T,令 R为 m - 1 并回到步骤二;
  1. 插值查找

插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的 查找方法,其核心就在于插值的计算公式 m i d = l o w + i n t ( ( h i g h − l o w ) ∗ ( k e y − l i s [ l o w ] ) / ( l i s [ h i g h ] − l i s [ l o w ] ) ) mid = low + int((high - low) * (key - lis[low])/(lis[high] - lis[low])) mid=low+int((highlow)(keylis[low])/(lis[high]lis[low]))
插值查找基于二分查找算法,自然也是需要有序数组,其将查找点的选择改进为自适应选择,可以提高查找效率。
优点:时间复杂度o(logn)但对于表长较大而关键字分布比较均匀的查找表来说,效率较高。

  1. 哈希查找

哈希查找也是非常常用的查找算法,哈希表就是一种以键-值(key-indexed) 存储数据的结构,只要输入待查找的值即key,即可查找到其对应的值。对于无冲突的Hash表而言,查找复杂度为O(1)

算法流程

将n个数据元素"按块有序"划分为m块(m ≤ n)。
1、用给定的哈希函数构造哈希表;
2、 解决地址冲突;
3、在哈希表的基础上执行哈希查找。
  1. 树表查找
    树表查找有几种方法,这里只说明二叉树查找算法

二叉树查找算法。
二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。 这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树,对于没有要大量处理的数据来说比较麻烦。

二叉查找树或者是一棵空树,或者是具有下列性质:

1、若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2、若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3、任意节点的左、右子树也分别为二叉查找树。
4、对二叉查找树进行中序遍历,即可得到有序的数列。
     

刷题

35. 搜索插入位置
202. 快乐数
205. 同构字符串
242. 有效的字母异位词
290. 单词规律
349. 两个数组的交集
350. 两个数组的交集 II
540. 有序数组中的单一元素
451. 根据字符出现频率排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值