![](https://img-blog.csdnimg.cn/20190912113156246.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法与数据结构
肯德基套餐
这个作者很懒,什么都没留下…
展开
-
二叉树前序遍历递归与非递归
先序遍历的访问顺序为 根节点->左子树->右子数递归的方式很简单,这里就不叙述了,考虑非递归方式思路:因为先序遍历,访问左子树后,还要往上追溯,获取其父节点,然后父节点的右子树进行遍历,也就是说当前访问左子树的时候要有将其父节点保存在某个地方,可以想到用堆栈来解决这个事情。核心代码 res = [] pNode = self.root st...原创 2018-12-15 19:02:47 · 669 阅读 · 0 评论 -
弗洛伊德(Floyd)算法
Dijkstra解决的是单源路径最短,即我们只能求某一点到其他所有点的最小距离。而Floyd算法可以求任意两点间的最小距离;单源最短路径一定能用Floyd算法去解,但是Floyd时间复杂度比迪杰斯特拉要高,所以一般只有多源最短路径采用Floyd算法基本思想:这是一个动态规划的思想,核心思想为,从A到B只经过前N个中转站所能获得的最小距离为多少。可以想象到,这个算法就是一个包含三个循环的d...原创 2019-09-13 12:21:17 · 1532 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法是用来求最路径的算法, 是求单源最短路径的算法;从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径这里要注意的是,我们要求的是某一特定的点到其他点的最短路径,起点是确定的。算法流程假设起点为s一开始我们根据已知条件建立一个距离矩阵,一般为二维矩阵,matrix[i][j]表示点i到j之间的距离(注意有向无向的区别)。如果已知条件中...原创 2019-09-13 11:55:20 · 104 阅读 · 0 评论 -
吉姆拉尔森计算公式
吉姆拉尔森计算公式可以根据年月日求他是星期几class Solution: def dayOfTheWeek(self, day: int, month: int, year: int) -> str: if month <= 2 : d, m , y = day, month+12, year-1 else: ...原创 2019-09-09 15:16:37 · 1139 阅读 · 0 评论 -
求第K小三种常用方法
冒泡排序排前K个元素即可,时间复杂度为O(K*N)堆排序维护一个容量为K的大顶堆, 然后往里面添加新的元素,如果新元素小于堆顶元素,替换堆顶然后进行下沉操作时间复杂度为O(KlogN)快排因为快排每次会选择一个元素pivot放到固定的位置index,如果index >K,就对左边进行快排,index < K,就对右边进行快排,直接输出即可时间复杂度可以达到线性 O(N),...原创 2019-08-27 10:56:55 · 701 阅读 · 0 评论 -
快排最坏时间复杂度
最好的情况:每次选的pivot几乎能把数据均分成两半,这样递归树的深度就是logN,这样快排的时间复杂度为O(NlogN)最坏的情况:每次找的pivot将数组分成两部分,其中有一部分是空,这样递归树就变成了一棵倾斜的树。树的深度为n-1,这样时间复杂度就变成了O(N^2).一般当数据有序或者局部有序的时候会出现这种坏的情况,比如数组正序或者逆序,(数字完全相同的时候也是有序的特殊情况)。解决...原创 2019-08-27 09:52:25 · 15648 阅读 · 0 评论 -
快幂运算
递归法'''递归法比较好理解,如果指数能被2整除, 把底数平方,指数折半,否则,指数拆成1 + n-1,其中n-1可以被2整除'''def quick_pow_recursion(a, n): if n == 1: return a if n & 1 == 1: return a * quick_pow_recursion(a, n...原创 2019-08-24 14:48:35 · 199 阅读 · 0 评论 -
快速排序(Quicksort)
快速排序(Quicksort)平均时间复杂度: O(nlogn)O( n log n)O(nlogn)最好空间复杂度: O(1)O(1)O(1), 其它根据实现方式不同而不同稳定性:不稳定 ([1,2,2,0,0]选1为轴,[2,2,0,0]会以轴对称的形式反转)基本形式快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后...原创 2019-06-13 00:46:57 · 480 阅读 · 0 评论 -
归并排序(Merge Sort)
归并排序(Merge Sort)平均时间复杂度: O(nlogn)O( n log n)O(nlogn)空间复杂度: O(n)O(n)O(n)稳定性:稳定基本形式:归并排序是建立在归并操作上的一种有效的排序算法,将已有序的子序列合并,得到完全有序的序列,是分治算法的典型应用。常用的将两个有序序列合并成一个有序序列的算法称为二路归并。如何使子序列有序?要将有序的子序列进行合并,首先要得...原创 2019-06-13 00:44:50 · 876 阅读 · 0 评论 -
堆排序(Heapsort)
堆排序(Heapsort)平均时间复杂度: O(nlogn)O( n log n)O(nlogn)空间复杂度: O(1)O(1)O(1)稳定性:不稳定(每次会把堆顶(array[0]array[0]array[0])与数组末尾交换)算法描述堆又称为优先队列,其实他跟队列关系并不大,队列是先进先出,而优先队列的出队列的顺序不再是依照进队列的顺序,而是根据其他的依据,比如大小,谁最小谁先出队...原创 2019-06-13 00:42:26 · 440 阅读 · 0 评论 -
桶排序 (bucket sort)
桶排序 (bucket sort)最好时间复杂度:O(n),假设分了M个桶,每个桶内快排,那么总时间复杂度O(N)+O(M∗(N/M)∗log(N/M))=O(N∗(log(N/M)+1))\mathrm{O}(\mathrm{N})+\mathrm{O}\left(\mathrm{M}^{*}(\mathrm{N} / \mathrm{M}) * \log (\mathrm{N} / \...原创 2019-06-13 00:37:50 · 2364 阅读 · 0 评论 -
Nested Loop Optimization
Today a friend sent me a interview question as follow:Do experiment as follow:import datetime# condition1t1 = datetime.datetime.now()for i in range(100000): for j in range(1000): ...原创 2019-05-10 19:39:08 · 505 阅读 · 0 评论 -
Morris算法先序、中序遍历二叉树
常见的二叉树遍历算法有递归非递归形式,但实际内部都是要通过栈来进行存储,而Morris算法只需要O(1)的空间复杂度,通过调整叶子节点的指针即可完成二叉树的遍历。如上图所示,4 5 6都是叶子节点,他们的left,right都指向None,我们可以将right指针利用起来,将叶子节点的right 指针指向下一个待访问的节点,这样我们就不需要用栈,就可以挨个遍历二叉树的所有节点。Morris算...原创 2019-02-24 00:56:33 · 719 阅读 · 0 评论 -
快排的两种写法
面试的时候经常让写快排,快排有两种写法,每种写法又可以分为递归与非递归。把这四种写法烂熟于心对于面试有极大的好处。方法1第一种方法用两个指针,取数组的第一个元素作为中轴,每次留出一个空位用来存放不满足条件的元素,举个例子:3,8,7,3,5,2,6,13 作为中轴,那么第一个位置空出来得到:__,8,7,3,5,2,6,1-left = 0,right = len(array)-1,两...原创 2019-02-21 21:01:20 · 1531 阅读 · 0 评论 -
摩尔投票算法
Boyer-Moore majority vote algorithm(摩尔投票算法)Boyer-Moore majority vote algorithm(摩尔投票算法)是一种在线性时间O(n)和空间复杂度的情况下,在一个元素序列中查找包含最多的元素。它是以Robert S.Boyer和J Strother Moore命名的,1981年发明的,是一种典型的流算法(streaming algo...原创 2018-08-15 20:10:02 · 860 阅读 · 0 评论 -
二叉树后序遍历递归与非递归
后序遍历的访问顺序为 左子树-&amp;gt;右子树-&amp;gt;根节点递归的方式很简单,这里就不叙述了,考虑非递归方式思路:后序遍历跟前序和中序不同的地方在于,访问完左子树后,会回溯到父节点,此时不能访问父节点,访问完右子树后,回溯到父节点,此时才能访问父节点。所以回溯到父节点的时候,要判断上一次操作访问的是哪里,如果上一次操作访问的时左子树,那么不可访问当前节点,得先去访问当前节点的右子树,如果上...原创 2018-12-16 16:51:31 · 298 阅读 · 0 评论 -
二叉树中序遍历递归与非递归
先序遍历的访问顺序为 根节点-&amp;amp;gt;左子树-&amp;amp;gt;右子数递归的方式很简单,这里就不叙述了,考虑非递归方式思路:中序遍历,先访问左子树,访问左子树的时候,其父节点得存在堆栈里,等到左子树访问完毕后再讲堆栈中的父节点弹出,对其进行访问,访问完然后在访问其右子树核心代码 res = [] pNode = self.root stack = [] ...原创 2018-12-15 19:14:22 · 1071 阅读 · 0 评论 -
二叉索引树 (英语:Binary Indexed Tree)
二叉索引树 (英语:Binary Indexed Tree)二叉索引树又叫数目状态数组,它的存储结构是数组,但是逻辑结构是树。可以想一下堆排序的时候,我们虽然用的是数组存数,但是其逻辑上是一棵完全二叉树。为什么会引入这个结构?对于下面的问题:给定一个数组,让我们求下标在(start,end]这个区间的子数组的和,我们的做法一般是先求一个sumer数组,sumer[i]表示sum(array...原创 2019-09-14 23:27:12 · 1352 阅读 · 0 评论