折半查找是算法中减治策略的基本例子,实现起来也很简单,但是在网上看到的图片教程不觉得很乾巴麽??

在这里插入图片描述

这是一个简单的实现:

def Reduction(lists, k):

"""

:param lists: 元素列表

:param k: 查找元素

:return: int,list

"""

list_scatters = [lists]

low = 0

high = len(lists) - 1

while low <= high:

mid = int((low + high) / 2)

if k < lists[mid]:

high = mid - 1

list_scatters.append(lists[low:high + 1])

elif k > lists[mid]:

low = mid + 1

list_scatters.append(lists[low:high + 1])

else:

return mid + 1, list_scatters

return 0, []

if __name__ == "__main__":

# lists = list(map(float, input("请按顺序输入要查找的表(以空格隔开):").split()))

lists = [_ for _ in range(31)]

k = float(input("请输入想要查找的数字:"))

num, list_scatters = Reduction(lists, k)

if num != 0:

print("这个数字是你输入的数字的第{}个".format(num))

if len(list_scatters[-1]) != 1:

list_scatters.append([k])

else:

pass

else:

print("查找失败!")

在这里插入图片描述

结果就一个这,多干巴…

所以我整了个这:(这个gif爲了能看的更加清晰,我设置的帧与帧间隔时间有点长(5秒),你们可别以爲是静态图啊…)

(这个例子和上面一样,是0~30一共31个有序的点,查找第18个(序号爲17))

在这里插入图片描述

怎麽生成的呢?我用的是matplotlib.animation中的FuncAnimation画动态图:

先上源码:

import matplotlib.pyplot as plt

import matplotlib.animation as animation

def Reduction(lists, k):

"""

:param lists: 元素列表

:param k: 查找元素

:return: int,list

"""

list_scatters = [lists]

low = 0

high = len(lists) - 1

while low <= high:

mid = int((low + high) / 2)

if k < lists[mid]:

high = mid - 1

list_scatters.append(lists[low:high + 1])

elif k > lists[mid]:

low = mid + 1

list_scatters.append(lists[low:high + 1])

else:

return mid + 1, list_scatters

return 0, []

def draw(list_scatters):

"""

:param list_scatters: list

:return: gif

"""

fig, ax = plt.subplots()

def init():

# 初始化函数用于绘製一块乾淨的画布,爲后续绘图做准备

ax.spines['right'].set_color('none')

ax.spines['top'].set_color('none')

ax.spines['left'].set_color('none')

def update(lists):

plt.scatter(lists, [0 for _ in range(len(lists))], s=1 / len(lists) * 300)

plt.title("还剩{}个点".format(len(lists)))

plt.yticks(())

ani = animation.FuncAnimation(fig, update, frames=list_scatters, init_func=init, interval=5000)

ani.save("123.gif", writer='pillow')

if __name__ == "__main__":

# lists = list(map(float, input("请按顺序输入要查找的表(以空格隔开):").split()))

lists = [_ for _ in range(31)]

k = float(input("请输入想要查找的数字:"))

num, list_scatters = Reduction(lists, k)

if num != 0:

print("这个数字是你输入的数字的第{}个".format(num))

if len(list_scatters[-1]) != 1:

list_scatters.append([k])

else:

pass

# print(list_scatters)

draw(list_scatters)

else:

print("查找失败!")

然后再说FuncAnimation的参数:

第一个fig可以理解爲动画所在的画布;

第二个update就是每一帧的函数;

第三个frames传入的是update的参数;

第四个init_func是初始化的图形(代码中对比的是init函数(去除上、左、右边框));

第五个interval就是帧与帧之间的间隔(延时(我这里设置的是5秒));

还有一些其他的参数我没有用到,可以去看官方文档

标签: Python

顶一下

(0)

0%

踩一下

(0)

0%

python123第k序元素查找_Python实现折半查找并用matplotlib实现动态过程可视化相关推荐

  1. python123第k序元素查找_二级个人笔记

    [资料]考纲+b站+蓝皮书补充 考试大纲(11/11):Python123 b站视频(30/30) 北理视频() 蓝皮书() 刷题: 一.程序设计的基本方法 1.程序运行(交互式:文件式) 2.编程方 ...

  2. python第k序元素查找列表_【Python】第8次练习:列表——程序填空题 -合并队列、列表元素零的移动、列表逆序输出、第K序元素查找...

    [Python]第8次练习:列表--程序填空题 -合并队列.列表元素"零"的移动.列表逆序输出.第K序元素查找 1.程序填空题 -合并队列 题目:某班男女两队同学各若干人,男生已按 ...

  3. C语言之二分查找法或折半查找法剖析(经典例题,经典解析)

    二分查找法(也叫折半查找法): 什么是二分查找? 具体查找的方式? 两种方法剖析 易错点列举 先举例题: int arr[]={1,2,3,4,5,6,7,8,9,10}; 找出7所在的位置. 分析之 ...

  4. 二分查找算法(折半查找算法)

    二分查找算法(折半查找算法) 二分查找又称折半查找.二分搜索.折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn). 二分查找算法仅适用于有序序列,它只能用在升序序列或者 ...

  5. 【查找算法】折半查找法

    本篇文章将介绍折半查找算法. 文章目录 何为折半查找? 算法实现 递归实现 效率分析 何为折半查找? 上一篇文章介绍了顺序查找算法,我们知道,虽然顺序查找算法适用性高,但效率太低,那么能不能在此基础上 ...

  6. 数据结构之查找算法:折半查找

    查找算法:折半查找 思维导图: 算法思想: 代码实现: 判定树: 折半查找判定树的构造: 顺序查找与折半查找对比: 思维导图: 算法思想: 代码实现: typedef struct {int *ele ...

  7. 查找算法:折半查找算法实现及分析

    折半查找算法介绍 折半查找(Binary Search)又称为二分查找.它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储.从算法名称可以看出算法的思路,先取有序序列 ...

  8. 快速排序查询第k大元素C语言,快速排序和查找第K大元素

    /* 输入n个整数和一个正整数k(1<=k<=n),输出这些整数从小到大排序后的第k个(例如,k=1就是最小值).n<=10^7. 快速排序的时间复杂度为:最坏情况下:O(n^2), ...

  9. 查找——1、折半查找法

    1.折半查找又称为二分查找,是一种效率较高的查找方法. 2.折半查找的前提条件: 查找表中的所有记录是按关键字有序(升序或降序) . 查找过程中,先确定待查找记录在表中的范围,然后逐步缩小范围(每次将 ...

最新文章

  1. java服务器http post_使用Java程序通过http post访问ABAP Netweaver服务器
  2. 图的两种遍历算法——BFS和DFS
  3. cos html cache插件,关于Cos-Html-Cache插件不能创建首页缓存的解决办法
  4. python爬取虾米音乐_Python爬取620首虾米歌曲,揭秘五月天为什么狂吸粉?!
  5. 最小二乘法矩阵微分偏导法证明
  6. mcq 队列_MCQ | 量子密码学
  7. php 上传大文件400,PHP fastcgi模式上传大文件(大约有300多K)报错
  8. gdb 调试命令的使用及总结
  9. Java数据结构与算法(26) - ch12堆(堆实现)
  10. JS-分支结构(单向-双向-多向-嵌套)
  11. 混合云是趋势?阿里云与私有云厂商 ZStack合作
  12. Python撰写mail
  13. 为什么用dict.get(key)而不是dict [key]?
  14. c# 多线程 执行事件 并发_阿里P9大牛对多线程并发问题的一些总结
  15. python绘图工具reportlab介绍
  16. 相对url和相对路径
  17. java汉字转拼音或效验汉字是否存在(过滤)
  18. 【Filecoin周报-62】倒计时1天,太空竞赛准备怎么样了?
  19. 力扣(LeetCode)904. 水果成篮(C语言)
  20. word图片另存为变黑色_别处复制过来的 图像在word中粘贴后变黑怎么处理?

热门文章

  1. ceph pool 相关命令
  2. ubuntu package XXX needs to be reinstalled,but I can't find an archive 问题修复
  3. 2019年3月8日比赛(知网是什么)
  4. mongoDB数据库操作工具库
  5. Spark Steaming 点滴
  6. 在bootstrap ace样式框架上修改的后台管理型模板(Tab页后台管理模板)
  7. 【小白的CFD之旅】16 流程
  8. dfasdfasdfas
  9. valgrind——Callgrind检测程序代码的运行时间和调用过程,程序分析性能。
  10. 贝叶斯定理——数学之美