常见算法
青鬆下的坚躯
liuensong@gmail.com
展开
-
限流算法之令牌桶算法、漏铜算法
常见的限流算法有:令牌桶、漏桶。计数器也可以用来进行粗暴限流实现。令牌桶算法:令牌桶算法,是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下。假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌。 桶中最多存放b 个令牌,当桶满时,新添加的令牌被丢弃或拒绝。 当一个n 个字节大小的数据包到达,将从桶中删除n 个令牌,接着数据包被发送到网络上。 如果...原创 2020-01-14 01:12:18 · 1067 阅读 · 1 评论 -
栈实战之检查括号是否闭合
实现步骤:1、先准备一个空栈$stack,然后从左至右读取代码每个字符。2、如果读到的是左括号,就将其压入栈中,意味着后面需要有对应的右括号左闭合。3、如果读到的是右括号,就查看栈顶的元素是否匹配。如果匹配则弹出。4、最后检查栈是否为空。空表示闭合,否则为没有闭合。实现代码:/*** 检查括号是否闭合* @param string $str* @return boo...原创 2020-01-02 17:18:43 · 467 阅读 · 0 评论 -
排序算法之插入排序
插入排序算法的原理如下:1、在第一轮里,暂时讲索引1的值抽出,并保存至临时变量中。2、接着是平移阶段,我们会拿空隙左侧的每一个值域临时变量的值进行比较。3、如果该值大于临时变量值,则将该值右移,否则把临时变量值插入当前位置。4、重复步骤1~3,直到数组完成排序。插入排序算法流程图:-插入排序时间复杂度:插入排序代码实现:/** * 插入排序 * @pa...原创 2020-01-02 02:31:25 · 542 阅读 · 1 评论 -
排序算法之选择排序
选择排序算法的原理如下:1、从左到右检查数组的每个元素,找出值最小的那个值索引并记录下来。2、将步骤1记录下的最小值索引与本次检查的起点索引交换(第1次起点0,第2次起点1,第n次起点n-1)。3、重复步骤1和步骤2,直到数组排好序。选择排序算法流程图:选择排序时间复杂度:忽略常数项即:选择排序代码实现:/** * 选择排序 * @param arra...原创 2020-01-02 01:31:31 · 292 阅读 · 0 评论 -
求两个数组元素的交集
实现方式:先用hash表记录第一个数组中的元素【放在key】,和出现的次数【放在value】。 然后再遍历第二个数组,如果找到对应元素,则添加这个元素到返回数组里。 如果value值大于1,HashMap中的value值减 1,表示已经找到一个相同的了。 如果value值等于1,则删除该元素。/** * 求两个数组的交集 * param array $nums1 * param...原创 2019-12-20 21:53:08 · 362 阅读 · 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 · 1485 阅读 · 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 · 1487 阅读 · 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 · 1286 阅读 · 0 评论 -
排序算法之冒泡排序
冒泡排序算法的原理如下:1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3、针对所有的元素重复以上的步骤,除了最后一个。4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。冒泡排序算法流程图:冒泡排序时间复杂度:冒泡排序代码实现:...原创 2019-12-04 20:24:31 · 313 阅读 · 0 评论 -
排序算法之快速排序
快速排序算法的原理如下:1、首先设定一个分界值,通过该分界值将数组分成左右两部分。2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。...原创 2019-12-04 20:46:25 · 283 阅读 · 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 · 245 阅读 · 0 评论