随笔分类 - 数据结构
摘要:首先考虑归并排序: 归并排序为什么能相比普通的排序方法,将时间复杂度从O(n^2)提升至O(nlogn)? 最主要的一点是引入了两个有序数组合并的思想,真正提升效率就是在这个地方。 首先我们考虑,如果两个数组无序的话,比如: 如果使用O(n^2)的方法,在这样一个数组中,每一个数都要跟其他的数比较一
阅读全文
摘要:链接:https://www.nowcoder.com/questionTerminal/fe9be0ec96a14b39b2ec5c90fd7d554b?orderByHotValue=1&page=1&onlyReference=false来源:牛客网估计递归问题复杂度的通式,只要复杂度符合以下
阅读全文
摘要:对红黑树的插入处理,真正需要考虑的有以下几点: 1).插入位置:插入在外侧还是内侧。插入位置影响的是单次旋转是否足够使新树遵守红黑树规则,具体看下面分析。 2).伯父节点的颜色:伯父节点的颜色是红色还是黑色。红色时只要变换颜色即可处理,而黑色则需要进行旋转了。 3).曾祖父节点的颜色:曾祖父点的颜色
阅读全文
摘要:TopK算法,用于寻找若干个数据中最大或最小的K个数。 实现TopK有两种方法,一种是基于快排的思想,一种是基于堆排的思想。 他们区别在于: 快排:时间复杂度O(n) 需要修改输入数组 不能处理海量数据,因为内存不够加载 堆排:时间复杂度O(nlogk) 不需要修改输入数组 可以处理海量数据 基于快
阅读全文
摘要:插入排序: 1).直接插入排序: 假设当前排序到了第i个元素arr[i],则此时i左侧[0,i-1]已经有序,对于arr[i]来说,如果arr[i]>=arr[i-1],则不用排序,直接进入[i+1];否则要在左侧有序表中找到一个合适的位置j令arr[j]<=arr[i]<arr[j+1]。 每一趟
阅读全文
摘要:转载自http://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html 分析一下常见的排序算法的稳定性,每个都给出简单的理由。 冒泡排序冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个
阅读全文
摘要:AVL树是非常重要的一种数据结构,这里实现了在AVL树中的插入操作,包括插入后整个树的自平衡。 这里有几点值得注意的地方: 1).左旋L_Rotate与右旋R_Rotate操作: 这两个操作传递进来的参数是以TreeNode*&的形式传递进来的,也就是说传递的是指针的引用,效果等价于传递二级指针 如
阅读全文
摘要:图的关节点: 如果删去某个节点及依附在该节点上的边后,该图被分割为两个或两个以上的连通图,则该节点为关节点。 计算关节点的关键思路: 在该图的深度优先生成树上,如果某个节点的孩子节点(不一定是二叉树,孩子节点可能大于2)的子树中,所有孩子节点的子树中都有回边能回到该节点的祖先上,则该节点不是关键节点
阅读全文
摘要:迪杰斯特拉算法用于计算:某点v0到其他所有点的最短路径,时间复杂度为O(n^2) 初态: 设定V为所有顶点的集合。 设定S为已经得到的最短路径的顶点vi的集合。即S中的顶点vi,都是已经确定下来v0到vi间的最短距离的顶点的集合。 设定V-S为尚未计算得到最短路径的顶点集合。 初态下,S为空,V-S
阅读全文
摘要:非递归写法: 对一个节点来说,当遍历它时,要求它的右子树已经遍历完。 因此,为了判断当前节点到底需不需要遍历,引入pLast为上一次遍历的节点。 当pCur->right==pLast||pCur==NULL时,说明右子树已经遍历完了,应该遍历该节点了。 否则,说明该节点右子树尚未遍历,将右子树的根
阅读全文
摘要:KMP算法第一次看起来稍微有点复杂,其实原理还是很简单的,想清楚就理解了。 举个简单的栗子: 主串s:abcabfd 模式串t:abcabe 如果使用比较原始的方法,一个个字符进行比较,当进行到主串的i=5,s[5]=f的位置,发现与j=5,t[5]=e不匹配,则只能重新从i=2开始,与j=1再进行
阅读全文