zoukankan      html  css  js  c++  java
  • 班课5

    1. 上周海啸的题目,利用BFS找到集合

    strongly connected component:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)

    利用BFS找到所有有向无环图,然后利用拓扑排序,从而可以继续使用greedy

    2. priority queue

    heap是一种特别的树状数据结构,给定heap中任意节点P和C,若P是C的母节点,则P的值会小于等于或大于等于C的值,前者称为min heap,后者称为max heap. heap中最顶端的节点是root node,其本身没有parent node

    priority queue: 有的queue需要按照一定顺序输出,而不是queue默认的先进先出原则(FIFO)

    3. Dijkstra‘s shortest paths algorithm

    从一个顶点到其余各顶点的最短路径的算法,每次遍历距离起始点距离最短且未访问过的顶点的邻接顶点,若是比现有的距离短就更新,直到扩展到终点为止

    a) 将初始点的举例设为0,其他设为无穷大

    b) 将所有未确定shortest path的点放在set里面,检测从起始点出发的edges,并记录其weight

    c) 将起始点从set中删除,从起始点到达的第一个点开始,继续观察从它出发的edges,若是小于已知距离替换并记录

    d) 直至set为空

    4. minimum spanning tree

    minimum spanning trees

    spanning tree: 将所有点连接且不构成cycle

    minimum spanning trees的例子有如,不同城市之间建造通信联络的成本不同,如A直接到C需要1000,但是A到B需要200,B到C需要300,就不需要直接连接A到C了,但是实际的问题要考虑整体graph而不是单独几个点,并且不能形成cycle。MST就是计算成本最少的情况

    一般做法是将MST设为无穷大,然后遍历所有spanning tree,如果更小就替换掉之前的MST,直到结束得到最小的

    5. MST的两种算法(Graph G with V nodes)

    a) Kruskal's Algorithm(不一定只有一种结果)

    从一个空的MST开始,从weight最小的edge开始不断加入,并保证新加进来的edge不会形成cycle

    不断重复直到加入了V-1个edges

    对edges进行排序的时间复杂度为O(E*logE)

    b) Prim's Algorithm

    6. dynamic programming动态规划

    通过将原问题分解为相对简单的子问题的方式求解复杂问题的方法

    如果问题的最优解所包含的子问题的解也是最优的,就称其满足最优化原理(不管初始状态和初始决策如何,对于前面决策所造成的某一状态而言,其后各阶段的决策序列必须构成最优策略)

    子问题的解一旦确定就不再改变,不受之后遇到的更大问题的求解受影响

    利用递归从下到上解决问题时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次,故而将每个子问题存在表格中,重复出现时直接调取结果

    举例:有n个活动,每个活动举行的时间都是不一样的且不能同时参加两个活动,找到一种活动的集合,使得参与活动的时间尽可能久

    这个问题可以转化为子问题

    1)用一个子序列表示选中的活动,且时间均不冲突

    2)用i做最后一个活动

    3)该活动满足12且总时间最久

    base case: 选择了第一个活动

    recursion:已经解决了所有子问题并将值存在列表里

    若选中4为最后一个活动,则表格中记录前面所有比4小且不引起冲突的活动。若是引起冲突则选取最大值

    时间复杂度O(n*(n-1)),因为对以每个点为结尾的情况,都要遍历所有比它小的点判断是否这两件事事不包含冲突

    7. 最长递增子序列

    有一个数组A包含n个数,找到最大的不一定连续的升序子序列

    子问题:找到序列A’,A’以A[i]为结尾的最长递增子序列

    base case:只有第一个元素自己

    recursion:假设已经找到了所有j<i的子问题,现在找所有的A[m],其中m<i且A[m]<A[i]

    即从第一个元素开始逐个向后遍历,每到新的一个元素就看它能否跟前面的某一个元素组成递增,若可以就在前一个的基础上加一,若有多个选择时选择最长的那个

    复杂度任然O(n^2)

    8. 找零问题

    有n种面值的硬币,使用最少的硬币个数凑出整数C

    建一个包含C列的表格,将对i的最优解存在第i列

    base case:C=1

    假设已经找到j<i的最优解,用i分别减去前面已经凑出来的钱数,计算还要添加几个硬币可以得到i(这里直接计算差额,然后在表格中查看就行),选取最小的那个

    9. 完全背包问题(物品可以重复)

    n个物品分别有价值vi以及重量wi, 背包容量为C

    建立一个表存所有的背包容量i,假设已经找到所有j<i的最优解

    思路同上面一样,随着背包容量的增加,用现有重量减去一个物品,查找剩余重量是否已经在表格中,用已经计算好的剩余重量的价值加上被减去物品的重量。对所有物品都进行该操作,找到价值最高的一个

    10. 01背包指物品不可以重复

    动态规划与分治法类似,都是把大问题拆分成小问题,通过寻找大问题与小问题的递推关系解决一个个小问题,最终达到解决原问题的效果。但是区别在于分治法在子问题与子子问题等上被重复计算了很多次,而动态规划是有记忆性的,可以通过填写表把所有已经解决的子问题答案记录下来,在新问题中需要用到的子问题可以直接提取,避免了重复计算,从而节约时间

    建立一个表格,物品件数*容量,从左到右从上到下解决问题

    不断比较选择物品i与不选,填写价格更高的,因为每件物品只能选或者不选,所以如果这次选择了i,需要用i的价格加上之前没有选择物品i的,且对应重量为背包容量-i的重量。若不选则直接对应相同重量但是不能选择i的时候

    参考:https://www.jianshu.com/p/a66d5ce49df5

    11. balanced partition

    有一系列n个整数,把这些整数分到两个子集中使得这两个子集的和的差最小

    转化为背包问题,背包大小为s/2,s是总和(即尽量平分)

    12.矩阵乘法

    有一系列矩阵,组合它们使得乘法计算数量最少,即判断两个矩阵之间是否有括号,可以转化为线性递归

    括号可以放置的位置的总数就等于和一个有n个叶子的二叉树相等

    子问题为Ai目前是1到i得到的最小乘法数量

  • 相关阅读:
    谁的朱砂痣染白了谁的白月光
    随机数
    常见面试简单汇总整理
    oss分页列举遍历文件创建软链接
    oss创建软链接
    看英文文档的好处
    js原型链相关
    js 中的this指向问题
    jquery.fn.init
    转载
  • 原文地址:https://www.cnblogs.com/eleni/p/13268909.html
Copyright © 2011-2022 走看看