算法总结

  • 快速union要画分支图合并

  • 快速find要列表找到代替的点

  • 希尔排序knuth序列是 13-4-1,sedewick序列是(1,5,19,41),横向长度=h(13-->4->1),然后纵向对于每一列插入排序。

  • 计数排序的计数数组中的每一个数都是加上之前的数就是位置数组

  • merge-sort就是分裂成每个元素再按照大小合并

  • 快速排序找到一个pivot然后从左右找依次比pivot小的数和大的数排序,递归这个步骤

  • 复杂度展开要展开递归方程找规律

  • huffman代码是贪心算法,每次都找最小的合并,画出二叉树,左0右1,每一个子叶是字母

  • pre-order是先根再左右子树,

  • in-order是先遍历先左子树再根再右子树

  • post-order是先左右子树最后根

  • 最少需要preorder和inorder才能找到原BST,最后用post-order验证

  • BST从叶插入左小右大,删除节点要找到前序或者后继

  • BST从根部插入要旋转,插入的反方向旋转,向R/L旋转就把子树的R/L换成父树的L/R

  • interval-BSt从叶插入左小右大,标明子树的最大值

  • interval-bst寻找,哪边的max大于[a,b]中的a就向哪边递归

  • 一次hash如果collision就+1

           ***平方hash***
           第几次collision就(j+i^2)mod k,j是第一次collision的值
           ***二次hash ***
          h1=k mod 19
          h2=1+k mod 97 
           h(k)=((k mod 19)+(1+k mod 97))mod 19 注意这里没有乘以collision的次数
               比如(45%19+1+45%97)%19=  15
                   collision!
                   (15%19+1+45%97)%19=4 ok
    
  • heapsort每次都要保证最大堆,按顺序插入,先左后右
    priority queen删除最大的节点要先把最大的节点和最小的额节点交换后删除,然后再进行最大堆整理

  • DFS按照字母表顺序深入搜索,递归时返回的每一步都检查是否有新的路线
    被指向的和指出的(A,B)比:

    / |A | B
    ----|----|----
    T | > | < |
    B | < | >|
    F | > | > |
    C | < | < |

图算法:

  • acyslic无环意思就是DFS没有B标记

最短路径算法

  • Dijkstra是每次都找权重最小的边松弛,直到所有定点都被松弛
  • bellman是对每条边松弛知道不再变化

最小生成树算法

  • prim算法是划线每次都找最短的
  • kruskal是找出所有最短的边,直到再找一个就会连成环

  • Kosaraju强连通分量,画一个反向图进行DFS得出(discover,endprocessing),在原图根据endpro递减顺序来进行DFS,每一块DFS开始都是一个SCC

对于DAG的拓扑排序

  1. 从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。
  2. 从图中删除该顶点和所有以它为起点的有向边。

重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。

你可能感兴趣的:(算法总结)