数据结构和算法总结

总结:by Seven
本文为数据结构和算法的知识总结,包括1,常见的数据结构(数组,链表,队列,栈,堆,树,图),2,算法思想(蛮力,减治分治转治,贪心,动态规划) 3,排序算法,4,字符串算法等方面。具体的知识点和算法见其他系列文章。

1.数据结构

底层实现:数组array, 链表list

常用数据结构:

  • 数组: 储存元素的地址连续,根据下标查找(偏移寻址)快

  • 链表: 地址不连续,增加删除元素快。

  • 队列queue:先进先出,对于树的层序遍历和图的BFS可以使用该结构

  • 栈stack:先进后出,对于图的DFS(深度优先遍历)可以使用该结构

  • 堆(优先队列)heap:

    • 优先队列,提供插入元素和删除最小元素,链表和二叉查找树都可以实现,但不是最好,堆实现最好

    • 任意非终端节点的值不大于左节点和右节点为最小堆。

    • 建堆方法1:O(n),全部放好,自底向上;

    • 建堆方法2:O(NlogN),每插入一个元素,变化一次

    • 删除最大元素:时间复杂度O(logN), 然后开始往下过滤.

    • 插入一个元素:O(logN), 插入到最后,然后开始网上滤.

    • 二叉树:

      ​ 二叉树的前序 中序 后续遍历;

    • 完全二叉树(应用:二叉堆):

    • 二叉查找树:左子树<根节点<右子树

    • 平衡二叉查找树:

      • AVL树:左右旋,两次旋转,每次插入旋转的复杂度:logN
      • 红黑树:根节点是黑色,null是黑色,红节点的附近只能是黑色,单条路径上的黑色节点数量一样。保证了:如果黑色高度是n,则单条最短路线是n-1,最长路线是2(n-1).
      • 伸展树:splay tree
    • 2-3 tree:

      • 2-3 trees and 2-3-4 trees are search trees that allow more than one item to be stored in a tree node.
    • 图的表示

      • adjacency list, adjacency table 邻接矩阵 邻接表
      • Complexity: V+E,V*V (V为顶点数,E为边的数量)
    • 图的遍历:

      • 复杂度:n
      • 深度优先遍历(先序遍历,栈或递归),
      • 广度优先遍历(层序遍历,队列),
      • 通过遍历判断图是否有环:判断是否有back edge.
    • 图的拓扑排序:

      • 统计所有点的入度,从入度为0开始循环调用,放入队列中。

      • 深度遍历的栈实现,-

    • 图的最小生成树:

      • Prime’s Algorithm。贪婪算法,

      • Kruskal’s Algorithm

    • 图的最短路径:

      • Djisterla算法:单原点到所有点的最短路径。单原点非循环正权重最短路径。
    • 可达性和所有点对之间的最短距离

      • DP,3层for循环,以每个点作为垫脚石

        if (e[i][k] && e[k][j]) {
            e[i][j] = true
        }
        

2.常见算法思想

  • 蛮力

  • 减治分治转治

    • 减治:decrease and conquer, 将每个大问题减少为更小的问题,
    • 分治:divide and conquer, 将每个大问题分为两个或以上更小的问题。
    • 转治:transfer and conquer, 将大问题转化为其他问题解决,预先排序。
    • 区别:
      • 减治将一个问题转化为一个更小的问题,如二分查找法
      • 分治将一个问题转化为多个更小的问题,如
  • 贪心:总是认为当前是最好的,

    • Prim算法: 图的最小生成树,
      • 用一个数组记录所有点的到任意一个起始点的距离,初始值为无穷
      • 初始化一个最小堆,将该数组放入
      • 依次弹出最小堆的最小点,更新该点到邻接点的距离,在循环
    • 图的djesterla 图的单源点最短路径
      • 和Prim算法类似,
      • 第三步更新该点到邻接点的距离为累加值
    • Huffman encoding for data compression:
      • 每次取频率最低的两个字母作为一个新的组合
      • 根据概率为所有元素进行构造树编码,概率高的编码少,效率高。
  • 动态规划

    • dynamic programming 多阶段决策过程的最优化理论。我们想要解决一个递归关系,而递归涉及到重叠的实例。通过组合子实例的最优解,可以得到实例的最优解。

    • Fibonacci, bottom-up;

    • Coin-row problem: S(n)= {s(n-1),s(n-2)+Vn};

      ​ 有一排硬币,只能选择不相邻的硬币,求最大价值。

    • the Knapsack problem:


    f [ i ] [ v ] = m a x ( f [ i − 1 ] [ v ] , f [ i − 1 ] [ v − w [ i ] ] + v a l [ i ] ) f[i][v]=max( f[i-1][v],f[i-1][v-w[i]]+val[i] ) f[i][v]=max(f[i1][v],f[i1][vw[i]]+val[i])

    • 自顶向下求解最大值,问题:重复计算

    • 方法1:自下向上求出所有的最大值,存在浪费,

    • 方法2:自上向下求出的值进行记录,避免重复计算。

    • Warshall’s Algorithm: Computing the transitive closure of a directed graph

      • 计算一个图中,经过k步哪些点是连通的。
      • 三次循环,第一层,从1到k,第二三层,矩阵求积。
    • Floyd–Finding shortest distances in weighted directed graphs

  • 递归迭代

    • 递归和栈(先进后出)在一定程度上可以转换

3.树

4.图

5.排序算法

需要重点掌握熟练写出来的算法是:1 5 6 7.

  • 1.冒泡排序bubble sort,依次交换向后放
  • 2.选择排序selection sort,每次比较选择最小的下标放在开头,减少了交换的次数
  • 3.插入排序insection sort,减治算法,减变治排序
  • 4.希尔排序Shell sort,减治法,减少每次减少的数值,直到1.
  • 5.快速排序quick sort,快速排序的基本思想是:采取分而治之的思想,把大的拆分为小的,每一趟排序,把比选定值小的数字放在它的左边,比它大的值放在右边;重复以上步骤,直到每个区间只有一个数。此时数组已经排序完成。
  • 6.归并排序merge sort,归并排序的基本思想:分治,一分二,然后比较大小合并到一起
  • 7.堆排序 heap sort,找堆最大值N×logN
  • 特定问题排序:8. Sorting by counting: 数字很多,但种类很小,hashing思想,数字的种类作为index,计算每个index的数量,进行排序。 复杂度:N

6.字符串算法

  1. Horspool’s String Search Algorithm:

  2. 其他字符串匹配算法:

  3. hashing: 通过时间换空间的最佳例子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值