算法
文章平均质量分 84
测试开发小记
欢迎关注微信公众号【测试开发小记】,分享测试开发相关技术笔记,包括Python、测试工具、自动化测试、数据库、Linux、持续集成等
展开
-
Linux Bash编程:Fisher–Yates shuffle 洗牌算法
本文介绍使用shell语法实现Fisher–Yates shuffle 洗牌算法。目录Fisher-Yates shuffle 算法简介shell实现Fisher-Yates shuffle 算法简介Fisher–Yates shuffle 洗牌算法可以用于对数组进行随机排列,它的时间复杂度为O(n),伪代码如下:To shuffle an array a of n elements (indices 0..n-1):for i from n - 1 downto 1 do j = random原创 2021-09-25 08:54:24 · 254 阅读 · 0 评论 -
Linux Bash编程:将整数分解为n个随机数
本文介绍使用shell实现将一个整数m随机分解为n个数。要求:将一个整数m分解为n个随机数,n个随机数之和要等于m指定随机数的最小值分析:这与leetcode上的两道题类似:343. 整数拆分剑指 Offer 14- I. 剪绳子下面来介绍一种思路:随机抽取 n-1 个区间为(0, m)的数,得到数组a将0和m加入数组a中对数组a进行升序排序按顺序计算数组a中相邻元素的差值:后一个元素减去前一个元素。差值组成的数组就是我们要的结果。shell脚本SplitInt原创 2021-09-20 09:15:15 · 540 阅读 · 0 评论 -
算法笔记:位运算
计算机中的数据都是以二进制的形式存储在设备中,虽然十进制比二进制所需要的存储空间少,但二进制在硬件实现上要简单很多,而且在数模转换上也更加容易,因为只需要两种状态,所以计算机的底层运算都采用二进制。位运算就是对二进制数据进行的运算。使用合理的位运算可以提高代码在机器上的执行效率,本文将介绍常见的位运算以及Python中的位运算。目录位运算符Python位运算与 - &或 - |非 - ~异或 - ^左移 - <<右移 - >>位运算其它应用位运算符常见位操作符如下表:原创 2021-06-08 21:31:14 · 317 阅读 · 0 评论 -
常见搜索算法(二):二分查找
搜索具有n个元素有序数组的某个元素时,最直接的方法就是对每个元素进行遍历,也就是线性搜索,时间复杂度为O(n)。 还有一种更高效的搜索方法就是本文要介绍的二分查找,时间复杂度为O(logn),本文介绍使用Python实现二分查找。目录二分查找python实现二分查找时间复杂度总结二分查找二分查找要求查找数组是有序的,将有序的数组分成两半, 如果搜索值小于中间位置记录的值,则进一步查找前一个子表。 否则查找后一个子表。 重复上面的步骤,直到找到该值或不存在(间隔为0)。使用二分查找算法的前提:查找数原创 2021-06-04 07:35:47 · 650 阅读 · 0 评论 -
常见搜索算法(一):深度优先和广度优先搜索
搜索算法是非常常用的算法,用于检索存储在某些数据结构中的信息。最简单直接的就是暴力搜索,也就是线性搜索,但它的时间复杂度较高,在实际工程应用中很少使用,需要对它进行优化。比如二分查找,贪心算法等搜索算法,在算法笔记:树、堆和图中,提到了对图和二叉树的搜索算法:深度优先搜索(DFS)和广度优先搜索(BFS),如果知道起点和终点状态的情况下,还可以使用双向BFS。DFS和BFS根据特定的顺序进行依次搜索,效率也不高,启发式搜索(heuristic search)也就是A*算法引入估价函数进一步提升了搜索效率,原创 2021-05-30 17:42:18 · 2226 阅读 · 0 评论 -
算法笔记:树、堆和图
前面的文章介绍过链表,它其实就是特殊化的树,而树是特殊化的图,堆是一种特殊的树。本文将介绍这几种数据结构。TOC图-Graph图的定义图是一组顶点和一组边的集合,每条边连接一对顶点。在现实生活中,到处都会遇到图网络的概念,将问题空间表示为网络,比如计算机网络,社交网络等,由一个个节点和连接他们的边组成。图可以表示为Graph(V, E):1、顶点V (vertex)出度:顶点的出边条数入度:顶点的入边条数2、边E (edge)有向和无向权重图的分类图主要包括以下几类:原创 2021-05-20 21:25:04 · 518 阅读 · 0 评论 -
算法笔记:哈希表、映射和集合
hash函数是根据关键字key计算出应该存储地址的位置,哈希函数把key转成哈希值来定位数据存储的位置,是基于哈希函数建立的一种查找表,Python 中的字典就是用哈希表来实现的。本文主要介绍哈希表、映射和集合这三种数据结构以及他们在python中用法。目录哈希表-Hash table哈希表哈希碰撞python 字典创建字典访问元素删除元素清除字典元素合并字典获取字典key,value值字典排序映射-Mappython 映射函数集合-Setpython集合并集交集差集对称差集增加元素删除元素清空集合冻结集原创 2021-05-16 22:47:08 · 7419 阅读 · 1 评论 -
算法笔记:数组、链表、栈和队列
目录数组-Array链表-Linked List单向链表双向链表跳表-Skip List栈-Stack队列python中的列表和元组列表和元组常用方法创建列表增加元素删除元素切片列表推导式其它方法复杂度分析参考资料从逻辑结构上来说,数组和链表这两种数据结构都属于线性表,从物理存储来看,数组占用一块连续的内存区,而链表在内存中是分散的,由于这种物理结构差异,在对数组和链表进行增删改查操作的时间复杂度不同。栈和队列是特殊的线性表,数组和链表都可以用来实现栈和队列,本文将简要介绍这几种数据结构。数组-Arra原创 2021-04-29 21:22:24 · 462 阅读 · 3 评论 -
算法笔记:时间复杂度和空间复杂度
目录时间复杂度常见时间复杂度主定理(Master Theorem)空间复杂度算法复杂度包括空间复杂度和时间复杂度,是衡量算法执行效率的重要指标。为了充分利用计算资源,提高业务处理效率,最有效的一种解决方式就是优化算法。在介绍空间复杂度和时间复杂度之前先问一个问题:为什么不通过执行代码,然后统计算法执行的时间和占用的内存大小来度量算法执行效率呢?答案显而易见,算法执行时间受硬件影响,同一段代码在不同机器上执行时间可能都会不一样。再者,执行时间也受数据影响,比如数据规模,还有比如排序算法中,如果排序数据长度原创 2021-04-26 14:45:12 · 443 阅读 · 0 评论 -
算法笔记:递归、动态规划
目录递归、分治和动态规划德罗斯特效应递归、分治和动态规划迭代和递归的区别分治动态规划解法斐波那契数解法1:暴力递归解法2:记忆化存储解法3:动态规划解法4:自底向上迭代动态规划是求解决策过程最优化的过程,可以高效求解那些可以分解为高度重复子问题的问题,应用非常广泛,比如解决最短路线、NLP等实际问题。递归、分治和动态规划德罗斯特效应德罗斯特效应(Droste effect)是递归艺术中的一种表现形式,德罗斯特效应即在一幅图像中,某个局部图像与整体图像类似,而在这个局部中,又有更小的部分与这个局部类似原创 2021-04-03 12:21:44 · 454 阅读 · 0 评论