算法+数据结构

选择排序

选择排序

时间复杂度:O(n^2);空间复杂度:O(1);N次(0与1交换,1与2交换,2与3交换);0-N-1找最小值与0位置置换,1-N-1找最小与1位置换…

冒泡排序

时间复杂度:O(n^2);空间复杂度:O(1);从左向右挨个与自己相比; 处理相等的态度,决定了冒泡排序是否稳定。

插入排序

时间复杂度:O(n^2),确保最差例子,最好是O(n);空间复杂度:O(1);从右网左挨个与自己相比,从右往左,0-0有序,0-1有序,0-2有序。

归并排序

分别左侧有序,右侧有序,然后左右指针遍历挨个比较;不会浪费排序结果;相等时先拷贝右边稳定性会被破坏;递归,左右两组,分别有序,在合并;非递归,假设一个数组10个数。k=2,就是每两个有序然后k=3,每三个排序;时间复杂度:O(n*logN).

随机快排

1.0,2.0:时间复杂度O(N^2),空间复杂度O(N);荷兰国旗问题;3.0时间复杂度O(n*logN);空间复杂度O(logN),也就是记中点的空间。

说明:对一定是完全二叉树,完全二叉树不一定是堆;大根堆(父比子大),小根堆(父比子小);从下到上,时间复杂度:O(N),空间复杂度(1);从上到下 O(n*logN).

二叉树

遍历:先序,中序,后序,说白了就是递归,取不同次数;宽度优先遍历,也就是按层;二叉树的序列化和非序列化;二叉树的递归套路;满二叉树:全满;完全二叉树:上一层全满,本层最少一个左;左孩子2i+1,有孩子2i+2.父(i-1)/2;SB树,红黑树,AVL树,加节点开启往上梳理;平衡二叉树(BT,又称AVL树):左节点比父小,右节点比父大,且左子树与右子树的高度差最大为1,所以平衡二叉树是搜索二叉树,反之;搜索二叉树(BST):左节点比父小,有节点比父大,treemap底层用平衡搜索二叉树;SB树(SIZE BALANCE TREE)叔叔节点数大于等于侄子节点数。跳表。红黑树:特性,节点只有红黑,头尾都是黑,红节点不能相连,每条链黑节点数一样;违规:插入5中,插入8中。搜索二叉树增加删除细节。有序表和红黑树的区别。AVL SB树 四种情况。有序表:LL RR旋转一次,LR先右旋 在左旋。
二叉树递归套路:1假设以X节点为头,假设可以向X左树和X右树要任何信息2在上一步的假设下,讨论以X为头结点的树,得到答案的可能性(最重要)3列出所有可能性后,确定到底需要向左树和右树要什么样的信息4把左树和右树信息求全集,就是任何一颗子树都需要返回的信息S 5递归函数都返回S,每棵树都这么要求 6写代码,在代码中考虑如何把左树和右树信息整合出整个树的信息

贪心算法

1.0单独拿字典序排序;2.0X,Y X.Y<Y.X;排序的传递性;(a+b).compareTo(b+a);总是在当前位置做出最优决定;常用技巧:堆(大小),排序;

并查集

isSameSet,union都可以将时间复杂度做到O(1)

动态规划

TSP商旅问题;尝试模型:从左往右的尝试模型,123全排列,facebook字母与数字对应,背包货物;范围上的尝试模型(组织):拿牌,但是不想让对手拿到好的,博弈论,双方都不会在对方单独改变策略的情况下让对方得到收益。寄信 (i-1)(f(i-1)+f(i-2))。 N皇后,位运算,时间复杂度O(NN)。纸片 盖 字符串 最优解缓存;多样本位置全对应,最小子序列;寻找业务限制;
要点:有重复解得暴力递归可以优化;暴力->记忆(缓存)->经典规划->最优;缓存或者记忆化搜索;可变参数+重复解用缓存;把所有可变参数的集合作为代表状态的组合的话,任何尝试都是无后效性的;可变参数数量能少则少,可变参数的数量越多缓存命中率越低。
设计暴力递归过程的原则:每一个可变参数的类型一定不要比int复杂;原则1可以违反,让类型突破到一维线性结构,那必须是唯一可变参数;如果到了原则2只需要做到记忆化搜索即可;可变参数的个数能少则少;
字符串的子序列和子串:子串必须连续,子序列不必须连续;
中序无法成套的序列化和反序列化。

暴力递归

汉诺塔问题,时间复杂度2^n-1;递归栈可以保存信息;分支限界也是暴力递归。

双端队列

单调栈 O(n);数据状态和问题本身:滑动窗口,双指针。

类似斐波拉契数列的递归

著名算法

hash表

布隆过滤器:样本量,预期失误率,黑名单,K个hash函数,适用范围:确定大小,确定hash函数个数,确定失误率。hash在使用时认为时间复杂度为O(1).

宽度优先遍历:先是离自己最近的,每层无序;拓扑排序一定是邮箱无环图(DAG);邻接表,邻接矩阵。

基数排序

经典:时间复杂度o(N*log10max),空间复杂度o(M)
橘排序:先按照个位排序再按照十位数字排序最后按照百位排序,空间复杂度 distinct个数

计数排序

不基于比较,与样本数据强相关;0位置记录为0的个数,最后依次取出

前缀树Trie

时间复杂度O(n)

MAP

HASHMAP增删改查时间复杂度o(1);treemap(红黑树)

递归

时间复杂度:T(N)=aT(N/b)+O(Nd)。LOG(b,a)<d,O(Nd)。log(b,a)>d,O(Nlog(b,a))。log(B,A)==D,O(nDLOGN)

链表

单向链表,双向链表;快慢指针,找到链表第一个入环点,如果无环反回null。两个有环链表相交,一定用一个公共环。一个链表有环,一个无环不可能相交

加一个,减一个,getMin都是O(1)。

队列

加一个,减一个,getMin都是O(1)

运算

0n=n;nn=0;异或运算就是无进位相加;n&(~n+1)可以算出最后一个1的数。

对数器

二分查找

时间复杂度:O(LOGN);L+((R-L)>>1)=(R+L)/2;2n+1=(N<<1)(1).

其他

32位第一位是符号位;linkedlist.get(I)不是常数时间操作;O(N2)低于o(N*LOGN),N2浪费了比较行为。动态规划一定来自暴力递归。

排序比较

排序算法总结:1不基于比较的排序,对样本数据有严格要求,不易改写;2基于比较的排序,只要规定好两个样本怎么比大小就可以直接复用; 3基于比较的排序时间复杂度是o(nlogN)4时间复杂度O(nlogn),额外空间复杂度低于O(n),且稳定的基于比较的排序是不存在的;5为了绝对的速度选择快排,为了稳定选归并。

猜你喜欢

转载自blog.csdn.net/u014162993/article/details/112252403