一、什么是查找

查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

查找表(Search Table):由同一类型的数据元素(或记录)构成的集合

关键字(Key):数据元素中某个数据项的值,又称为键值。

主键(Primary Key):可唯一地标识某个数据元素或记录的关键字。

搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找。

二、无序表查找

也就是数据不排序的线性查找,遍历数据元素。

算法分析:最好情况是在第一个位置就找到了,此为O(1);最坏情况在最后一个位置才找到,此为O(n);所以平均查找次数为(n+1)/2。最终时间复杂度为O(n)

#最基础的遍历无序列表的查找算法#时间复杂度O(n)

defsequential_search(lis, key):

length=len(lis)for i inrange(length):if lis[i] ==key:returnielse:returnFalseif __name__ == '__main__':

LIST= [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]

result= sequential_search(LIST, 123)print(result)

三、二分查找(Binary Search)

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

算法核心:在查找表中不断取中间元素与查找值进行比较,以二分之一的倍率进行表范围的缩小。

1、二分查找的python代码实现

defbinary_search(lis, key):

low=0

high= len(lis) - 1time=0while low

time+= 1mid= int((low + high) / 2)if key

high= mid - 1

elif key >lis[mid]:

low= mid + 1

else:#打印折半的次数

print("times: %s" %time)returnmidprint("times: %s" %time)returnFalseif __name__ == '__main__':

LIST= [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]

result= binary_search(LIST, 1)print(result)

运行结果为:

查找次数为: 3下表为:0

2、二分查找的C语言代码实现

//main.m//二分查找//Created by 侯垒 on 2019/7/1.//Copyright © 2019 可爱的侯老师. All rights reserved.

# include

int binary_search(int array[],int key,intlen)

{int low = 0;int high = len-1;int time = 0;while (low

{

time++;int mid = (int)(low+high)/2;if (key

{

high= mid-1;

}else if(key>array[mid])

{

low= mid+1;

}else{//打印这本的次数

printf("查询次数 = %d\n",time);returnmid;

}

}

printf("查询次数 = %d\n",time);return -1;

}int main(int argc, const char *argv[])

{int array[11] = {1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444};int index = binary_search(array, 1, 11);

printf("下标是 = %d\n",index);return 0;

}

运行结果为:

查询次数 = 3下标是= 0

四、插值查找

在介绍插值查找之前,首先考虑一个新问题,为什么上述算法一定要是折半,而不是折四分之一或者折更多呢?

打个比方,在英文字典里面查“apple”,你下意识翻开字典是翻前面的书页还是后面的书页呢?如果再让你查“zoo”,你又怎么查?很显然,这里你绝对不会是从中间开始查起,而是有一定目的的往前或往后翻。

同样的,比如要在取值范围1 ~ 10000 之间 100 个元素从小到大均匀分布的数组中查找5, 我们自然会考虑从数组下标较小的开始查找。

经过以上分析,折半查找这种查找方式,不是自适应的(也就是说是傻瓜式的)。二分查找中查找点计算如下:

mid=(low+high)/2, 即mid=low+1/2*(high-low);

通过类比,我们可以将查找的点改进为如下:

mid=low+(key-list[low])/(list[high]-list[low])*(high-low),

也就是将上述的比例参数1/2改进为自适应的,根据关键字在整个有序表中所处的位置,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。

基本思想:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找。

注:对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。

复杂度分析:查找成功或者失败的时间复杂度均为O(log(n))。

1、插值查找的python代码实现

defchazhi_search(lis, key):

low=0

high= len(lis) - 1time=0while low

time+= 1

#计算mid值是插值算法的核心代码

mid = low + int((key - lis[low])/(lis[high] - lis[low]) * (high -low))print("mid=%s, low=%s, high=%s" %(mid, low, high))if key

high= mid - 1

elif key >lis[mid]:

low= mid + 1

else:#打印查找的次数

print("查询次数: %s" %time)returnmidprint("times: %s" %time)returnFalseif __name__ == '__main__':

LIST= [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]

index= chazhi_search(LIST, 1)print("下标为:%s"%index)

运行结果为:

mid=0, low=0, high=10查询次数:1下标为:0

2、插值查找的C语言代码实现

//main.m//插值查找//Created by 侯垒 on 2019/7/1.//Copyright © 2019 可爱的侯老师. All rights reserved.

#include

int chazhi_search(int array[],int key,intlen)

{int low = 0;int high = len-1;int time = 0;while (low

{

time++;//计算mid值是插值算法的核心代码

int mid = low + (int)((key - array[low])/(array[high]-array[low])*(high-low));

printf("mid=%d, low=%d, high=%d\n",mid, low, high);if (key

{

high= mid-1;

}else if (key>array[mid])

{

low= mid+1;

}else{//打印查找的次数

printf("查询次数:%d\n",time);returnmid;

}

}

printf("查询次数:%d\n",time);return -1;

}int main(int argc, const char *argv[]) {int arr[] = {1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444};int index = chazhi_search(arr, 1, 11);

printf("下标为:%d\n",index);return 0;

}

运行结果为:

mid=0, low=0, high=10查询次数:1下标为:0

python数据算法有哪些_python算法与数据结构-常用查找算法一(37)相关推荐

  1. Algorithm:【Algorithm算法进阶之路】之数据结构二十多种算法演示

    Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 目录 一.数据结构算法 1.顺序表 2.链表 3.栈和队列 4.串的模式匹配 5.稀疏矩阵 6.广义表 7.二叉树 8 ...

  2. STL算法——常用查找算法(find、find_if、adjacent_find、binary_search、count、count_if)

    5.2 常用查找算法 学习目标: 掌握常用的查找算法 算法简介: find //查找元素 find_if //按条件查找元素 adjacent_find //查找相邻重复元素 binary_searc ...

  3. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  4. C++STL常用查找算法

    C++STL常用查找算法 学习目标 算法简介 find 功能描述 函数原型 示例 总结 find_if 功能描述 函数原型 示例 总结 adjacent_find 功能描述 函数原型 示例 总结 bi ...

  5. python数据科学课后答案_Python数据科学-技术详解与商业实践-第五讲作业

    作者:Ben,著有<Python数据科学:技术详解与商业实践>.<用商业案例学R语言数据挖掘>.<胸有成竹-数据分析的SAS EG进阶>作者.2005年进入数据科学 ...

  6. python数据科学常国珍_python数据科学:技术详解与商业实践

    前言 章数据科学家的武器库 1.1数据科学的基本概念 1.2数理统计技术 1.2.1描述性统计分析 1.2.2统计推断与统计建模 1.3数据挖掘的技术与方法 1.4描述性数据挖掘算法示例 1.4.1聚 ...

  7. python数据可视化散点图案例_Python数据可视化—散点图_python 数据可视化

    Python数据可视化-散点图 PS: 翻了翻草稿箱, 发现居然存了一篇去年2月的文章...虽然naive,还是发出来吧... 本文记录了Python中的数据可视化--散点图scatter, 令x作为 ...

  8. python数据可视化的特点_python的数据分析到底是啥?python数据可视化怎么做?

    python是个啥?它一个强大的编程语言.数据分析是个啥?它一目了然,就是将数据进行分析,看看能得出什么结论.那python的数据分析到底是啥?其实就是通过这个语言将数据分析做出来,更加便捷化,更加速 ...

  9. python数据可视化是什么_Python数据可视化的四种简易方法

    数据可视化是任何数据科学或机器学习项目的一个重要组成部分.人们常常会从探索数据分析(EDA)开始,来深入了解数据,并且创建可视化确实有助于让问题更清晰和更容易理解,尤其是对于那些较大的高维度数据集.在 ...

最新文章

  1. 将matpoltlib绘制好的图片从内存中取出
  2. python绘制条形图-python matplotlib库绘制条形图练习题
  3. Linux笔记:认识shell
  4. 执行SQL-MapperProxy.invoke()
  5. 2013年 833c语言程序 江南大学 (A卷)
  6. 前端学习(2755):配置tabber其他属性
  7. Linux mount挂载和umont卸载U盘
  8. html轮播图原理,30_用js实现一个轮播图效果,简单说下原理
  9. 有必要月底Linux内核,如何确定linux内核是否会在月底插入闰秒
  10. kaike的FLAGs
  11. 【有意思的BUG】需要停止的进程
  12. 42.验证和授权(2)
  13. fsck命令--Linux命令应用大词典729个命令解读
  14. 【设计模式】【创造型模式】单例模式
  15. keli不支持中文,显示中文乱码
  16. 冒泡排序C语言(从小到大)
  17. 《Unity Shader入门精要》自学笔记(六)第九章 更复杂的光照 —— 渲染路径
  18. C#开发ActiveX控件及指纹采集
  19. where 空集_MySQL where 条件的这个坑你碰到过没
  20. TypeError: 'str' object cannot be interpreted as an integer

热门文章

  1. 使用split_size优化的ODPS SQL的场景
  2. 为什么嫁人就选程序员!
  3. 如何提升员工体验 助力企业业务增长?这个棘手的问题终于被解决了!
  4. Android 之父裁员 30%:开发者如何避免“被离职”?
  5. three.js和php,threejs--初创项目
  6. 设置android应用闪屏图片_Android实现启动页面(闪屏页面)
  7. python的整数类型_Python int 数字整型类型 定义int()范围大小转换
  8. centos 7 安装golang遇到问题: No package golang available.
  9. 使用dubbo后尽量不用要@Reference可能引起冲突
  10. Stream filter过滤案例