python123第k序元素查找_Python实现折半查找并用matplotlib实现动态过程可视化
折半查找是算法中减治策略的基本例子,实现起来也很简单,但是在网上看到的图片教程不觉得很乾巴麽??
在这里插入图片描述
这是一个简单的实现:
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实现动态过程可视化相关推荐
- python123第k序元素查找_二级个人笔记
[资料]考纲+b站+蓝皮书补充 考试大纲(11/11):Python123 b站视频(30/30) 北理视频() 蓝皮书() 刷题: 一.程序设计的基本方法 1.程序运行(交互式:文件式) 2.编程方 ...
- python第k序元素查找列表_【Python】第8次练习:列表——程序填空题 -合并队列、列表元素零的移动、列表逆序输出、第K序元素查找...
[Python]第8次练习:列表--程序填空题 -合并队列.列表元素"零"的移动.列表逆序输出.第K序元素查找 1.程序填空题 -合并队列 题目:某班男女两队同学各若干人,男生已按 ...
- C语言之二分查找法或折半查找法剖析(经典例题,经典解析)
二分查找法(也叫折半查找法): 什么是二分查找? 具体查找的方式? 两种方法剖析 易错点列举 先举例题: int arr[]={1,2,3,4,5,6,7,8,9,10}; 找出7所在的位置. 分析之 ...
- 二分查找算法(折半查找算法)
二分查找算法(折半查找算法) 二分查找又称折半查找.二分搜索.折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn). 二分查找算法仅适用于有序序列,它只能用在升序序列或者 ...
- 【查找算法】折半查找法
本篇文章将介绍折半查找算法. 文章目录 何为折半查找? 算法实现 递归实现 效率分析 何为折半查找? 上一篇文章介绍了顺序查找算法,我们知道,虽然顺序查找算法适用性高,但效率太低,那么能不能在此基础上 ...
- 数据结构之查找算法:折半查找
查找算法:折半查找 思维导图: 算法思想: 代码实现: 判定树: 折半查找判定树的构造: 顺序查找与折半查找对比: 思维导图: 算法思想: 代码实现: typedef struct {int *ele ...
- 查找算法:折半查找算法实现及分析
折半查找算法介绍 折半查找(Binary Search)又称为二分查找.它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储.从算法名称可以看出算法的思路,先取有序序列 ...
- 快速排序查询第k大元素C语言,快速排序和查找第K大元素
/* 输入n个整数和一个正整数k(1<=k<=n),输出这些整数从小到大排序后的第k个(例如,k=1就是最小值).n<=10^7. 快速排序的时间复杂度为:最坏情况下:O(n^2), ...
- 查找——1、折半查找法
1.折半查找又称为二分查找,是一种效率较高的查找方法. 2.折半查找的前提条件: 查找表中的所有记录是按关键字有序(升序或降序) . 查找过程中,先确定待查找记录在表中的范围,然后逐步缩小范围(每次将 ...
最新文章
- java服务器http post_使用Java程序通过http post访问ABAP Netweaver服务器
- 图的两种遍历算法——BFS和DFS
- cos html cache插件,关于Cos-Html-Cache插件不能创建首页缓存的解决办法
- python爬取虾米音乐_Python爬取620首虾米歌曲,揭秘五月天为什么狂吸粉?!
- 最小二乘法矩阵微分偏导法证明
- mcq 队列_MCQ | 量子密码学
- php 上传大文件400,PHP fastcgi模式上传大文件(大约有300多K)报错
- gdb 调试命令的使用及总结
- Java数据结构与算法(26) - ch12堆(堆实现)
- JS-分支结构(单向-双向-多向-嵌套)
- 混合云是趋势?阿里云与私有云厂商 ZStack合作
- Python撰写mail
- 为什么用dict.get(key)而不是dict [key]?
- c# 多线程 执行事件 并发_阿里P9大牛对多线程并发问题的一些总结
- python绘图工具reportlab介绍
- 相对url和相对路径
- java汉字转拼音或效验汉字是否存在(过滤)
- 【Filecoin周报-62】倒计时1天,太空竞赛准备怎么样了?
- 力扣(LeetCode)904. 水果成篮(C语言)
- word图片另存为变黑色_别处复制过来的 图像在word中粘贴后变黑怎么处理?