自己总结的算法导论考试用的算法

 

Dijkstra算法

循环n-1次: 

1. 在没有扩展过的点中取一距离最小的点u,并将其状态设为已扩展。 2. 对于每个与u相邻的点v,如果dist[u] + w[uv] < dist[v],那么把dist[v]更新成更短的距离dist[u] + w[uv]。此时到点v的最短路径上,前一个节点即为u 

结束:此时对于任意的udist[u]就是su的距离。

 

每次加入一个点的时候,都要判断每一个点经过该点到达目标点的距离,,来比较不经过这个点的距离大小,如果比不经过的小,那么要想到达目标点路径最小的话,必须经过加入的这个点

 

 

 

NP  完全问题证明

 1然而有些问题很难找到多项式时间的算法(或许根本不存在),比如"找出无向图中哈密尔顿回路"问题。但是我们发现如果给了我们该问题的一个答案,就可以在多项式时间内判断这个答案是否正确。给出一个任意的回路,我们很容易判断它是否是哈密尔顿回路(只要看是不是所有的顶点都在回路中就可以了)。这种可以在多项式时间内验证一个解是否正确的问题成为NP问题,又称易验证问题类。

 

2复杂性理论中最具理论意义的当数NP完全性问题(NPC问题),即由于"P=NP是否成立"这个问题难以解决,从NP类的问题中分出复杂性最高的一个子类,把它叫做NP完全类。已经证明,任取NP类中的一个问题,再任取NP完全类中的一个问题,则一定存在一个具有多项式 
时间复杂性的算法,可以把前者转变成后者。这就表明,只要能证明NP完全类中有一个问题是属于P类的,也就证明了NP类中的所有问题都是P类的,即证明了P=NP 

 

 

最大独立集

最大独立集就是其补图的最大团
poj1419是一个很直白的求最大独立集的问题,可以试着做做

二分图的最大独立集

如果一个图是二分图,那么它的最大独立集就是多项式时间可以解决的问题了 |最大独立集| = |V|-|最大匹配数|
证明:
设最大独立集数为U,最大匹配数为MM覆盖的顶点集合为EM
为了证明|U|=|V|-|M|,我们分两步证明|U|<=|V|-|M||U|>=|V|-|M|
先证明 |U|<=|V|-|M|
M中的两个端点是连接的,所有M中必有一个点不在|U|集合中,所以|M|<=|V|-|U|
再证明|U|>=|V|-|M|
假设(x,y)属于M
首先我们知道一定有|U|>=|V|-|EM|,那么我们将M集合中的一个端点放入U中可以吗?
假设存在(a,x)(b,y)(a,b)不在EM集合中
如果(a,b)连接,则有一个更大的匹配存在,矛盾
如果(a,b)不连接,a->x->y->b有一个新的增广路,因此有一个更大的匹配,矛盾
所以我们可以了解到M中的一个端点放入U中肯定不会和U中的任何一个点相连,所以|U|>=|V|-|EM|+|M|=|V|-|M|
所以,|U|=|V|-|M|

 

 

 

 

 

 

 

 

 

 

 

 

第一章:算法基础

 

一:插入排序算法思想:

前面一部分已经排好序了,,对2n个数插入已经排好序的数组中

1,插入第i个数时,先把这数ai】存入key中,然后在已经排好序的数组中找到位置(比key大的向后移动,流出来一个位置给key,把它放进去,,此时有i个数有序了)

二:看笔记本上的概念:

 

 

 第二章 分治法与递归式求解

 

一:分治递归时间复杂度

 

 

 

 

 

 

 

 

 

堆排序:

 

// given an unsorted array A, make A a heap

BuildHeap(A)

{

heap_size(A) = length(A);

for (i = ëlength[A]/2û  downto 1)

Heapify(A, i);

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值