| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python算法 快速找到单一元素——分析算法效率 -> 正文阅读 |
|
[Python知识库]Python算法 快速找到单一元素——分析算法效率 |
需求给定数组vec,元素个数为(2n+1)(n为正整数)。其中,n个数据出现了两次,有一个出现了一次,把这个出现一次的数记为k,举例如下:
求函数f(vec)=k 生成随机数据用来测试
记录时间装饰器
实现1普普通通地实现,正常思路:出现一次就加进另一个列表,再出现一次就尝试删除,若不存在就添加进去,最终应该只剩下一个元素(新列表里)
测试数据规模:(50000个数据,13478出现了奇数次)
多次测试取平均值,大约是12~13s的样子。 分析时间消耗空间消耗还好,这次主要看效率。 改进避免如上所述的大型时间消耗,更改思路如下:
这么说,只需要判断
值得关注的点在于,这里还是要用循环里的try-except,因为如果范围给的是500,要找的数是499,i+1的索引就会越界。但是相比之下无关紧要,except的检查相关大段消耗只会在try失败的时候触发,在虚拟机内部是不需要每次循环都回溯栈、各种校验的。 最终算法——实现2在lst的范围足够大的时候,上述算法都无法应对——第一种时间复杂度几何增长,第二种线性增长,都不是很理想。
这个性质正好用在这个算法中。出现两次连续异或就能抵消,而且位运算不管在哪种语言里都是最快速的解决方案。
相比之下很短小,但十分有用。 加大规模,将
目标数用最大值减去较小值是为了避免solution1_better算法过早结束,它是顺向遍历。 多次测量下,前者平均1.56s,后者稳定在0.14s,相差近十倍。 总结二进制位运算在相同处理器的执行下效率是最高的,使用最少的时钟周期。所以在需要大规模运算的高效算法,又对时间要求特别紧张的时候,善于运用位运算能达到极佳的效果。 源码已上传至gitee |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 19:31:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |