常见算法
青鬆下的坚躯
liuensong@gmail.com
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
限流算法之令牌桶算法、漏铜算法
常见的限流算法有:令牌桶、漏桶。计数器也可以用来进行粗暴限流实现。 令牌桶算法: 令牌桶算法,是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下。 假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌。 桶中最多存放b 个令牌,当桶满时,新添加的令牌被丢弃或拒绝。 当一个n 个字节大小的数据包到达,将从桶中删除n 个令牌,接着数据包被发送到网络上。 如果...原创 2020-01-14 01:12:18 · 1312 阅读 · 1 评论 -
栈实战之检查括号是否闭合
实现步骤: 1、先准备一个空栈$stack,然后从左至右读取代码每个字符。 2、如果读到的是左括号,就将其压入栈中,意味着后面需要有对应的右括号左闭合。 3、如果读到的是右括号,就查看栈顶的元素是否匹配。如果匹配则弹出。 4、最后检查栈是否为空。空表示闭合,否则为没有闭合。 实现代码: /** * 检查括号是否闭合 * @param string $str * @return boo...原创 2020-01-02 17:18:43 · 583 阅读 · 0 评论 -
排序算法之插入排序
插入排序算法的原理如下: 1、在第一轮里,暂时讲索引1的值抽出,并保存至临时变量中。 2、接着是平移阶段,我们会拿空隙左侧的每一个值域临时变量的值进行比较。 3、如果该值大于临时变量值,则将该值右移,否则把临时变量值插入当前位置。 4、重复步骤1~3,直到数组完成排序。 插入排序算法流程图: - 插入排序时间复杂度: 插入排序代码实现: /** * 插入排序 * @pa...原创 2020-01-02 02:31:25 · 615 阅读 · 1 评论 -
排序算法之选择排序
选择排序算法的原理如下: 1、从左到右检查数组的每个元素,找出值最小的那个值索引并记录下来。 2、将步骤1记录下的最小值索引与本次检查的起点索引交换(第1次起点0,第2次起点1,第n次起点n-1)。 3、重复步骤1和步骤2,直到数组排好序。 选择排序算法流程图: 选择排序时间复杂度: 忽略常数项即: 选择排序代码实现: /** * 选择排序 * @param arra...原创 2020-01-02 01:31:31 · 350 阅读 · 0 评论 -
求两个数组元素的交集
实现方式: 先用hash表记录第一个数组中的元素【放在key】,和出现的次数【放在value】。 然后再遍历第二个数组,如果找到对应元素,则添加这个元素到返回数组里。 如果value值大于1,HashMap中的value值减 1,表示已经找到一个相同的了。 如果value值等于1,则删除该元素。 /** * 求两个数组的交集 * param array $nums1 * param...原创 2019-12-20 21:53:08 · 442 阅读 · 0 评论 -
求N以内的所有质数(素数)
质数定义:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 /** * 求n以内的质数(素数) * param int $n * return array */ function prime_numbers(int $n):array { $result = [2]; //偶数只有2是质数 for ($i = 3; $i <= $n; $i+=2) { //...原创 2019-12-20 20:38:07 · 1592 阅读 · 0 评论 -
将一个数组中的元素随机打乱
实现方式:遍历数组,取0~数组长度间的一个随机值$rand_index为键值与当前位置$i的值对换。 /** * 将一个数组中的元素随机打乱 * * param array $arr * return array */ function custom_shuffle(array $arr):array { $length = count($arr); for($i ...原创 2019-12-20 20:19:21 · 1667 阅读 · 0 评论 -
数组元素反转函数实现
实现方式:数组首尾对应位置的值替换。可以想象成将数组对折了一下,然后对应的值交换。 /** * 数组元素反转函数 * param $arr array * return array */ function reverse(array $arr) :array { $left = 0; $right = count($arr) - 1; while ($left < $r...原创 2019-12-20 14:59:48 · 1376 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡排序算法的原理如下: 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3、针对所有的元素重复以上的步骤,除了最后一个。 4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 冒泡排序算法流程图: 冒泡排序时间复杂度: 冒泡排序代码实现:...原创 2019-12-04 20:24:31 · 383 阅读 · 0 评论 -
排序算法之快速排序
快速排序算法的原理如下: 1、首先设定一个分界值,通过该分界值将数组分成左右两部分。 2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。 3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。...原创 2019-12-04 20:46:25 · 361 阅读 · 0 评论 -
查找算法之二分查找算法
查找过程: 将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。 算法要求: 1.必须采用顺序存储结构。 2.必须按关键字大小有序排列。 代码实现: /** * 二分查找算法 * * @param array ...原创 2019-12-04 20:55:37 · 359 阅读 · 0 评论
分享