算法
文章平均质量分 68
主要介绍算法基础、leetcode等
patriot_28
这个作者很懒,什么都没留下…
展开
-
B树和B+树简介
B树特性B树,又称多路平衡查找树,B树中所有节点的孩子个数的最大值称为B树的阶,通常用m表示。一棵m阶B树或为空树,或为满足如下特性的m叉树:树中每个节点至多有m棵子树,即至多含有m-1个关键字。若根节点不是终端节点,则至少有两棵子树。除根节点外的所有非叶节点至少有ceil(m/2)棵子树,即至少含有ceil(m/2)-1个关键字。所有非叶节点的结构如下:|n|P0|K1|P1|K2|P2|…|Kn|Pn|其中,Ki(i=1,2,…,n)为节点的关键字,且满足K1 < K2 <原创 2021-08-04 17:39:01 · 298 阅读 · 0 评论 -
平衡二叉树及PHP实现~
性质平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),除了具有二叉查找树的性质,还具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树也是平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。平衡因子一个节点的平衡因子就是该节点左子树的高度减原创 2021-08-04 15:07:11 · 277 阅读 · 1 评论 -
KMP算法及PHP实现
简介模式匹配(Pattern Matching) 即子串定位运算(Index函数)。算法目的:确定主串中所含子串第一次出现的位置(定位) ——即如何实现 Index(S,T,pos)函;初始条件:串S和T存在,T是非空串,1≤pos≤StrLength(s) 操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。注:S称为被匹配的串,T称为模式串。若S包含串T,则称“匹配成功”。否则称 “匹配不成功” 。对于KMP算法,看代码比看各种介原创 2021-07-24 08:52:40 · 348 阅读 · 5 评论 -
霍夫曼树分析及PHP实现
概念路径:树中一个结点到另一个结点之间的分支序列构成两个结点间的路径路径长度:路径上的分支数目树的路径长度:树根到每个结点的路径长度的和结点带权路径长度:结点到树根的路径长度与结点的权的乘积树的带权路径长度:树的带权路径长度为树中所有叶子节点的带权路径长度之和,通常记作WPL=∑WkLk。假设有n个权值{w1,w1,…wn},试构造一棵有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度WPL最小的二叉树称作最优二叉树或霍夫曼树。前缀编码:设计长短不等的编码,必须是任一字符的编原创 2021-07-23 20:04:06 · 330 阅读 · 3 评论 -
掌握了数据存储方式基本上就掌握了数据结构
线性表顺序存储// 静态分配typedef struct{ ElemType data[MaxSize]; int length;} SqList;// 动态分配typedef struct{ ElemType *data; // 存储空间基址 int MaxSize; // 当前分配的存储容量 int length; // 当前长度} SqlList;链式存储// 单链表typedef struct LNode{ ElemType data; struct LNod原创 2021-07-21 10:31:29 · 111 阅读 · 0 评论 -
红黑树原理分析及PHP实现
简介红黑树二叉搜索树中的一种,可以保证在最坏情况下基本动态集合操作(SEARCH、PREDECESSOR、SUCCESSOR、MINIMUM、MAXIMUM、INSERT、INSERT)的时间复杂度为O(log n)。红黑树是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。红黑树的应用比较广泛,主要是用它来存储有序的数原创 2021-06-23 00:26:05 · 466 阅读 · 1 评论 -
一致性hash算法,PHP示例
直接给代码:class FlexiHash{ private $servers = []; private $is_sorted = false; private $server_total=0; // 新增服务器时 public function addServer($server) { $server_pos = $this->mHash($server); if(!isset($this->servers[$server_pos])){ $this->原创 2020-10-12 00:29:49 · 62 阅读 · 0 评论 -
插入排序算法(PHP实现)
代码:<?phpfunction insertion_sort_for($arr){ $arr_len=count($arr); // 把后一个跟前面的值进行比较,需要的话挪位后移 for ($i=1; $i < $arr_len; $i++) { // 临时存放当前元素,便于前面的部分适当后移后插入到适当位置 $current = $arr[$i]; // 标记位,因为0表示第一个位置,使用-1避免冲突 $index = -1; // 从后往前适当后原创 2020-07-21 21:24:52 · 169 阅读 · 0 评论 -
选择排序算法(PHP实现)
<?phpfunction selection_sort($arr){ $arr_len=count($arr); if($arr_len<1){ return []; } for ($i=0; $i < $arr_len-1; $i++) { $min=$arr[$i]; // 默认为剩下的数中的第一个 for ($j=$i+1; $j < $arr_len; $j++) { // 找到剩下部分最小的挪到前面 if($arr[$j]<$m原创 2020-07-20 21:16:36 · 111 阅读 · 0 评论 -
很简单的冒泡排序算法(PHP实现)
<?phpfunction bubble_sort($arr){ $arr_len=count($arr); for ($i=1; $i < $arr_len; $i++) { for ($j=0; $j < $i; $j++) { if($arr[$i]<$arr[$j]){ $tmp=$arr[$j]; $arr[$j]=$arr[$i]; $arr[$i]=$tmp; } } } return $arr;}原创 2020-07-20 20:41:13 · 104 阅读 · 0 评论 -
将两个有序数组拼接后查找顺序开始不一致的地方(PHP实现)
<?phpfunction find_break_point_in_merged_arrays($arr, $low, $high){ if(empty($arr)){ return 'not array'; } $mid = intval(($low+$high)/2); if(!empty($arr[$mid-1]) && $arr[$mid-1]>$arr[$mid]){ return $arr[$mid]; } else if(!empty(原创 2020-07-18 18:53:40 · 109 阅读 · 0 评论 -
将一个顺序数组截成两块并交换位置,获取两块的断点(PHP实现)
<?phpfunction find_break_point($arr, $low, $high){ $mid = intval(($low+$high)/2); if ($mid<$arr[$low]){ if(!empty($arr[$mid-1]) && $arr[$mid-1]>$high){ return $arr[$mid]; } else if(empty($arr[$mid-1])){ return $arr[$mid];原创 2020-07-18 16:21:45 · 111 阅读 · 0 评论 -
用php参考实现的二维数组排序代码
<?phpfunction two_dimension_array_sort($two_dimension_array, $column_name, $sort_type='asc') { $new_arr = $selected_column_arr = []; $selected_column_arr=array_column($two_dimension_array, $column_name); // 关键,如下可以获得排序后的key顺序 ($sort_原创 2020-07-17 17:44:24 · 109 阅读 · 0 评论 -
堆排序也就这么点代码(PHP实现)
代码:<?phpfunction heap_sort($arr){ $arr_len = count($arr); $new_arr=[]; for ($i=0; $i < $arr_len; $i++) { // 每次找到最小的一个 $arr=ajust_heap($arr); // 调整堆 $popped_arr_len = count($arr); // 交换根节点和最后一个叶子节点 $tmp=$arr[0]; $arr[0]=$arr[$popp原创 2020-07-31 14:09:04 · 152 阅读 · 0 评论 -
超简单的基数排序(PHP实现)
代码:<?phpfunction radix_sort($arr){ $arr_len=count($arr); if($arr_len<=1){ return $arr; } $max=max($arr); // 用Math的max函数获取数组中的最大值 $max_len=strlen($max); // 获取最大的数的位数 $radix=1; // 基数,从最后一位数开始 for ($i=0; $i < $max_len; $i++) { // 按最大位原创 2020-07-30 18:25:20 · 238 阅读 · 0 评论 -
空间换时间的计数排序(PHP实现)
代码:<?phpfunction counting_sort($arr){ $arr_len=count($arr); // 获取数组中最小值、最大值 [$min, $max]=getMaxMin($arr); $buckets=[]; // 空间换时间, 生成一定量的桶(值->个数的映射) for ($i=0; $i < $max+1; $i++) { $buckets[$i]=null; } foreach ($arr as $key =>原创 2020-07-27 21:20:28 · 146 阅读 · 0 评论 -
空间换时间的桶排序算法(PHP实现)
代码:<?phpfunction bucket_sort($arr){ $arr_len = count($arr); $bucket_size=10; // 获取数组中最小值、最大值 [$min, $max]=getMaxMin($arr); $scope=intval(($max-$min)/$bucket_size); // 初始化$buckets,这样才能按键顺序增长 for ($i=0; $i < $scope; $i++) { $buckets[原创 2020-07-24 21:32:12 · 195 阅读 · 0 评论 -
归并排序(PHP实现,非递归,不实用,仅供学习)
时间复杂度为 log2NNN代码:<?phpfunction merge_sort($arr){ $arr_len=count($arr); // +1 可以避免少比较一次 $last_merge_len=intval($arr_len+1/2); $merge_len=2; // 从小到大进行归并 while($merge_len<$last_merge_len){ $tmp_arr=[]; //使用临时数组保存计算结果 // 每次需要合并的个数 $c原创 2020-07-24 13:16:25 · 107 阅读 · 0 评论 -
归并排序(PHP实现,使用递归方式)
代码:<?phpfunction merge_sort($arr){ $arr_len=count($arr); if(1==$arr_len){ return $arr; } $mid=intval($arr_len/2); $left_arr=array_slice($arr, 0, $mid); $left_arr=merge_sort($left_arr); $right_arr=array_slice($arr, $mid); $right_arr=merg原创 2020-07-24 10:47:21 · 112 阅读 · 0 评论 -
希尔排序(shell sort)是插入排序的改进版(PHP实现)
代码:<?phpfunction shell_sort($arr){ $size = 2; $arr_len = count($arr); $gap = floor(($arr_len + 1) / $size); // 两个可比较的数之间的距离 while ($gap > 0) { // 按$gap展开比较,注意”$i = $gap; $i < $arr_len;“ for ($i = $gap; $i < $arr_len; $i++) {原创 2020-07-23 21:13:31 · 145 阅读 · 0 评论 -
实现链表数据结构--PHP
PHP实现链表实现代码:<?phpnamespace App\Algorithom\DataStructure;class LinkedList{ private $header; private $tail; public function __construct() { $this->header=null; $this->tail=null; } // 遍历 public function traverse(){ $node=$this-&g原创 2020-07-08 01:30:42 · 142 阅读 · 0 评论 -
快速排序算法(PHP实现)
方法1<?php$arr=[2,13,1,5,99,234,23];function quick_sort($arr){ $arr_total=count($arr); if($arr_total>1){ $mid=$arr[0]; $arr_left=[]; $arr_right=[]; for($i=1;$i<$arr_total;$i++){ if($mid>$arr[$i]){ $arr_left[]=$arr[$i]原创 2020-06-01 10:39:26 · 151 阅读 · 0 评论 -
游程编码算法(PHP及javascript实现)
PHP<?php/*input:aaabbcccaaboutput:3a2b3c2a1b */$str='aaabbcccaab';function char_count($str){ //最简洁的算法 $newstr=''; $n=1; for($i=0;$i<strlen($str);$i++){ if($i+1<strlen($str)){ if($str[$i]==$str[$i+1]){ $n++; } else{ $原创 2020-06-01 14:20:28 · 356 阅读 · 1 评论 -
求数组中某两个数之和为指定值,第一次刷leetcode
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/two-sum著作权归原创 2020-08-05 19:39:42 · 225 阅读 · 0 评论