第 27 讲贪心与动态规划
因为它们都属于最优化问
因此这里将它们放
但是贪心和动态规划还是
前者是从问
而后者则从考虑问题的子
通过比较划分后的
来确定当前
贪
不容易
许多算法
而
因此
我们会把笔墨侧
第一部分贪心(Greedy)
在求解最优化问题时,有这样一种自然的想法,希望每一步都则采取最优的策略,最终得到全局的最优解,这就是贪心思想。它的最大特点就是运行速度快,效率高,因此备受程序设计员的喜爱。当然,由此也带来了贪心法的最大问题,如何证明其正确性?因为在很多时候,局部最优解的选择往往最终得不到全局最优解。于是,我们在运用贪心思想解决问题时,就需要格外的小心。
事实上,许多成熟的算法中都蕴含了贪心思想,比如求解最小生成树的Bellman-Ford算法,单源最短路径的Dijkstra算法,求解二分图匹配的匈牙利算法等等。
很多时候,贪心法虽然得不到最优解,但是仍具有重要的最用。比如,利用贪心法得到的近似解可以为搜索法提供较强的剪枝策略。
就用一个例子来看看贪心法的应用吧:
[例 1, POJ 2287] 田忌赛马
田忌赛马的故事想必已经被大家所熟知了,孙膑“以君之下驷彼上驷,取君上驷与彼中驷,取君中驷与彼下驷”的策略使得田忌最终“一不胜而再胜”。如今,田忌与齐王决定再战一场,这一回双方决定用 n (n ≤ 1000)匹马较量一番。每一回合,先到的马将为主人赢得200美元,如果打平双方均无需指出。假设双方马匹的速度已给出,而田忌仍然能够提前知道齐王马匹的出场顺序,那么他最多能赢多少钱呢? [分析]
乍看下去,似乎没有很好的贪心思路,倒是可以利用二分图匹配的方法解题,可是时间复杂度相对较高,改进得的匈牙利算法也匹配需要O (n 3)的时间,即
使Hopcraft 算法,也需要O ()的时间复杂度。
那么,真的不能运用贪心法吗?当年田忌获胜的方法或许能够给我们一些启迪。用下等马匹配齐王的上等马,虽然输掉了局部,却赢下了全局。也就是说,在最终的最优选择中,将有一些场次会输掉比赛。那么,既然是这样,我们何不学习田忌,用那些“下等马”输掉这些比赛,而让获胜者,均为齐王的“上等马”呢?这样的改进不会比原先的最优选择更差。设{A n }为田忌的马,且按速度排序A 1 > A 2 > … > A n ,{B n }为齐王的马,同样按速度排序B 1 > B 2 > …
> B n ,假设A p 会输给它的对手,而A q (p < q )的选择使它至少不输掉该场比赛,那么将二者的对手对调,所得结果显然不会比之前更差;同样,若B p 不输给它的对手,而B q (p > q )则输给了它的对手,那么将再二者的对手对调,结果仍不会次于调换前。于是,调换后见下图:
图1-1 最优策略 图1-2 改进后
既然改进前是最优策略,那么改进后它必然也是最优策略。而改进后的图与田忌赛马有着异曲同工之处,那么顺着它的思路,我们似乎又有了另一个改进策略。在图1-2中除去所有输掉比赛的{A}以及它们的对手,剩下的图中所有的“交叉”都可以去掉。即假设A p 的对手为B r ,A q 的对手为B s ,而pq ,那么我们可以对调双方的对手,显然结果不会变差。于是,改进后的图变成了如下:
2
n n A 1 A 2
.
. A n-1 A
B 1 B 2 . . B n-1 B
A 1 A 2 . . A n-1 A
B 1 红线代表输的场次 B 2 为了看得更清晰, . 红线间若有交叉可通过 . 调整将其变为一组平行 B n-1 线,不会影响结果 B
图 1-3 最终策略
显然,这个最终策略仍然是最优策略。于是,我们只需要枚举输掉的比赛场次,逐个判断是否满足上述策略的要求,就能够找到最优解。
第二部分 动态规划(Dynamic Programming )
动态规划是解决最优化问题的重要手段,它的优美精巧的结构特点深得程序设计员的喜爱,一段短小精悍的代码就能解决长长的回溯法所不能解决的问题,这是动态规划最吸引人的特点。
动态规划是通过合并子问题的解来解决最优化问题的。许多时候,一个问题的若干子问题往往不是独立存在的,而和其它问题的子问题相同,于是对这些公共子问题的采取先计算求解并存值得方式,以便为将来反复调用时直接提供值,就成了动态规划的主体思想。可以看到,实现动态规划需要满足如下条件:
1) 最优子结构性质,也就是说问题最优解与子问题的最优解有关。 2) 无后效性,就是说问题的解只与已求得的子问题的解有关,与尚未求得的问题的解无关联。可以看到,这就需要问题的求解具有明显的层次性。 因此,在求解此类问题时,我们需要将其划分成若干个层次,并找到层与层之间的关联,即“状态转移方程”。随后自底向上逐层求解。动态规划的一般形如:
算法2-1:
for (用i 枚举所有状态) {
for (用j 枚举所有上层状态)
{
利用状态j 来更新状态i 的最优值。
A 1 A 2 . . A n-1 A
B 1 B 2 . . B n-1 B
} }
下面来看一些动态规划的经典模型。
1. 背包问题
背包问题是动态规划问题中最为经典的模型之一,我们来看看它的简要描述: [例 2] 有一个能容积为V 的背包,现在有N 件物品,它们的容积和价值分别用{A n }和{B n }表示,现在问如何选择物品放入背包,才能使背包在没有超载的情况下物品价值总和最大。 [分析]
可以看到,背包中物品的顺序是没有要求的,因此我们可以逐个考虑每个物品。如果用一个一维数组{C n }记录考虑到当前物品i 为止时,容积为j(0 ≤ j ≤ V)的情况下,可以达到的最大价值为C j ,那么状态转移方程如下:
这里要注意两点,第一是公式中重量j – A(i)必须是一个在之前已经达到过了的可行解,否则C(j – A(i))是无效的,第二是j 的循环顺序必须是从大到小,可以有效地防止在同一轮i 的情况下,刚刚修改的C(j-A(i))值对当前的C(j)产生影响。
尽管背包问题还有不少变化的情况,但只要分析清楚层次,列出正确的转移方程,那么就能比较容易地解决它。
2. 最长公共子串(LCS )问题
最长公共子串问题同样是动态规划问题中的经典模型,再来看看它的简要描述:
[例 3] 假设有两个字符串A,B ,求它们最长的公共子串C 。其中,“子串”的定义为,设P = p 1p 2…p m ,那么串Q 称为串P 的长为t “子串”,如果满足Q = p q1p q2…p qt ,其中1 ≤ t ≤ n, q1 < q2 < … < qt 。如果C 既为A 的子串,又为B 的子串,那么就称C 为A 和B 的公共子串。 [分析]
{}
)
0(,
,V j B C C Max C i A j j j i ≤≤+=-
先来看看一个例子,假设A = acdefgad, B = bcaedafg
它们的最长公共子串C = aefg 或 cefg 。可以看到,如果将A 的最后一个字母去掉,并没有改变它们的最长公共子串,而如果将B 的最后一个字母去掉,那么最长公共子串长就少了1。原因在于,B 的最后一个字母g 与A 中的第6个字母g 可匹配。
于是我们考虑一般的情形:两个字符串求LCS ,如果它们的串尾均没有作出“贡献”,那么它们的LCS 等价于删去串尾后两个字符串的LCS ;如果串尾有所“贡献”,那么要看着这个串尾是否相等。若相等,显然可将二者连线;反之,就要看哪个“贡献”对LCS 更有帮助了。如果以L(i, j)表示A 串的前i 个字符和B 串的前j 个字符的最长公共子串长,那么刚才的文字描述用公式表示就是:
可以看到L(i,j)的值只与L(i-1,j),L (i ,j-1)和L(i-1,j-1)有关,这
就具有明显的层次关系。按照上述转移方程就可求解最长公共子串的长。至于求出具体的串,那么只要在求解过程中记录下每一次的选择,最后根据最长串的串尾进行一遍倒推即可得到最长子串。
3. 树型动态规划
一个无环连通图便称为一棵树,由于树具有明显的层次关系,因此很多关于它的最优化问题都可以用动态规划的方法解决,可以把这一类方法归纳为树型动态规划。一些问题需要自己建立一颗树,再利用动态规划的方法解决,一些问题则本身就是以树为背景的。来看看下面这个例子:
{}
???
??≠>>=>>+===----Bj
Ai j i L
L Max B A j i L j or i L j i j i j i j i j i ,0,0,,0,01
00
1,,11,1,a c d e f g a d b c a e d a f g
[例 4, POJ1655]
给定一棵有N(1 ≤ N ≤ 20000)个结点的树T ,定义结点的“平衡度”如下:删去该结点后,在剩下的结点构成的森林中,最大树的结点数。于是,我们的问题是,在树T 中,找到平衡度最小的结点。
[分析]
看完题目,最直接的想法自然是枚举每个点,然后求它的平衡度,也就是遍历这棵森林。但是,这种做法的时间复杂度至少是O(N^2)。对于如此大的N ,这显然太慢了,有没有更好的方法呢?让我们再仔细分析一下,遍历一次树T ,我们能得到多少信息。对于一个结点A ,必然是由某个结点B 遍历过来,然后遍历它的所有后继C 、D 。。,如果我们能得到A 的所有后继结点分别又遍历到了多少结点,那么我们就可以知道B 结点之前已经遍历了多少结点,于是,所有与A 有连接的结点块的信息便都得到了。那么也就求得了A 的平衡度。如果用Num(A)表示结点A 和它的所有后继的个数,那么上述分析可用以下公式表示:
利用上述公式,用Dfs 对树进行一遍遍历就能找到平衡度最小结点的平衡度,稍加分析便可知,答案最多只有两个点。
此外,此题的另一个要注意的问题便是如何保存这棵树。如果直接用邻接数组表示,那么内存消耗太大。一般有三种方法,一是用邻接链表保存,把所有与某个结点相邻的结点用一个链表串起来;二是将与结点1,2,3,…,N 相邻的结点顺序的记录在一个数组中,然后为每个结点记录两个值,即与它相邻的结点在线形数组中的区间的端点;三是用vector 容器保存。前两个方法都是利用了树是稀疏图,边数很少的性质来考虑的。
4. 状态压缩动态规划
有一些问题,我们无法用单独的状态运用动态规划,但是可是将一组状态合并为一个状态,并且合并以后可以看到明显的层次关系和最优子结构的性质,这样的手段就是状态压缩动态规划,一般简称状态DP 。许多时候由于单独的状态可以用0和1来表示,因此组合后的状态可以用一个普通的数的二进制形式来表示/由于计算机对二进制的表示和处理都非常方便,因此这样的手段为编写代码提供了很大的方便。
[例 5,POJ 2411]
给定一个w ×h(1≤w,h ≤11)的矩形,如果用1×2的小矩形去拼装,那么共有多少种不同的拼法?
{}
{})
A (Num 1N ,A E Num(E)Max Max --=的后继结点为的平衡度A
[分析]
刚拿到这题时,可能大多数人的第一感觉是搜索题。可是仔细想想,最大的矩形面积超过了100,用面积为2的方块去拼,显然方法数将是巨大的,搜索看来很难出解。那么有没有其它方法呢?用普通的动态规划考虑似乎也没有什么眉目,一个矩形与它的子矩形之间似乎很难找到什么有价值的关联。
换个角度来想,当我们与小矩形去填充时,经常用的手段就是逐层填满,由于小矩形是1×2的,那么某一层的所有填充情况只可能遇上一层发生联系,因此,如果我们把一层看作一个状态,那么填充完它后,对于每一个小格,有两种可能,一是填充它的矩形一直顺延到了下一层,我们用状态1来表示,而是填充它的矩形没有顺延到下一层,我们用状态0来表示。把一层的状态连起来,我们就得到了一个状态组,形如011…10,这就是新的状态。如果每层有w 格,那么这样的状态组有2^w 种。 如果用F(i,j)来表示达到第i 层,第j 种状态的种类数,那么状态转移方程如下:
其中,如何确定哪一些上层状态是可行的呢?我们可以用一次搜索的方法来找到所有可行的上层状态。具体就是按照本层状态,用搜索逐列填充每一格,同时推断对应的上层状态。因此,算法的事件复杂度是O(h * 2^w * 2^w),空间复杂度是O(h * 2^w)
最后还要说明三点:第一,若输入的w 和h 均为奇数,那么答案显然是0。因为所有小矩形面积为偶数,不可能拼出奇数面积的大矩形。第二,状态转移只在相邻两层间进行,因此可以用滚动数组节省内存开支,空间复杂度降到O(2 * 2^w) = O(2^w)。第三,根据事件复杂度来看,若输入中h < w ,那么交换h 和w 一般可以节省不少时间。
(
蒋威)
[参考文献]
1.《算法导论》第2版(美)科曼 机械工业出版社 2006年9月
2.《算法艺术与信息学竞赛》第1版 刘汝佳,黄亮 清华大学出版社 2004年1月
3. 例题来源 https://www.doczj.com/doc/7216059710.html,/JudgeOnline/
∑-=
k)1,-i (j),i (,1,的状态所有可以转移到k
i j i F
F
排序问题P11 #include if (a[j] < a[min]) { min = j; } } if (min != i) { t = a[i]; a[i] = a[min]; a[min] = t; } } } int BinarySearch(int x) { int left=0; int right=n-1; while(left<=right){ int middle=(left+right)/2; if (x==a[middle]) return middle; if (x>a[middle]) left=middle+1; else right=middle-1; } return -1; } void main() { cout<<"输入数字的个数:"< 常见病西医处方1 上呼吸道感染服药处方: 利巴韦林颗粒50mg*9包用法:1包.3次/日 阿莫西林颗粒0.125*9包用法:1包.3次/日 自研药末处方: 罗红霉素片50mg*3# 扑尔敏片4mg*2# 维生素C片0.1*6# 病毒唑片0.1*3# 葡萄糖酸钙片0.5*2#共研末混匀,均分6包用法:1包.2次/日 输液处方: 生理盐水100ml 头孢曲松针1.0 利巴韦林针0.1用法:混合静滴.皮试( ) @ 5%葡萄糖液100ml 维生素C针1.0 维生素B6针0.1 用法:混合静滴 随证加减: 咳嗽 非那根糖浆100ml*1瓶用法:3ml.3次/日 发热 泰诺林15ml*1瓶用法:1.5ml .发热时服 小儿腹泻(轻中度等渗脱水) 生理盐水 100ml氨苄西林针1.0利巴韦林针0.15 用法:混合静滴.皮试( ) @ 5%葡萄糖液100ml 维生素B6针0.1 西米替丁针0.2 10%氯化钾针2ml(用法:混合静滴) @ 5%葡萄糖液100ml 10%氯化钠针3ml 10%氯化钾针2ml(用法:混合静滴) @ 5%葡萄糖液100ml 10%葡萄糖酸钙针10ml 10%氯化钠针2ml (用法:混合静滴) 妈咪爱1.0*6支用法:1支.2次/日 蒙脱石散3.0*3包用法:1/2包.3次/日 以上两药间隔2小时后服用 口服补液盐14.75*2包用法:1包兑水700ml.随时口服常见病西医处方 分享 快速分享 分享请输入您要分享的视频或网页地址 热门分享hot我的分享好友分享搜索搜索 <<返回前一页 <<上一篇下一篇>> 梦入轮回分享逸·清风的日志全科西药处方 2月8日 05:46 可以直接搬了… 作者 逸·清风 全科西药处方分享 首次分享者:帽子^@^s男孩已被分享202次评论(0) 复制链接分享转载举报 慢性咽炎: 1. COsmz 2片3/日安定1片3/日维生素B12 2片 3/日氟美松1片 3/日利咽解毒冲剂1袋 3/日。 2. 中耳炎 利福平滴眼液+阿米卡星0.25+2毫克地塞米松滴耳。滴耳前用双氧水彻底清洗耳道。并在以后每次滴耳之前都要清洗一下。一般3天治好,最多不超过一周。 3 .说一个治疗小儿鹅口疮的外用方法 先用碳酸氢钠注射液,用医用棉签外涂患处(涂抹面积要大点),让后再用紫药水涂患处(只涂抹白斑处即可) 小儿口服用药比较麻烦,容易哭闹,拒服用药 用这个方法,简单,痛苦小,而且效果很好,不妨一试 4.我见过一个成人腮腺炎,用抗生素加抗病毒药一周无效,最后用新鲜马齿笕外敷三天即愈 5 .治疗一般性尿道炎:氟哌酸4粒,苏打4粒,三次可愈。 医院常见病处方集 第一章急症处理 一.高热 处方1复方氨基比林 2ml 肌注 st! 柴胡注射液 2~4ml 肌注st! 对乙酰氨基酚片0.3-0.6/次口服tid 处方20.9%NS 100ml+赖氨匹林0.9静脉滴注或肌注 处方3冬眠疗法:氯丙嗪50mg + 异丙嗪50mg +哌替啶100mg 肌注或静滴6-8小时一次。 二. 抽搐 处方1 地西泮注射液10-20mg/次静注st! 接0.9%NS 500ml+地西泮注射液60-100mg 缓慢静滴 处方2苯巴比妥注射液0.1-0.15/次肌注st! 处方30.9%NS 20ml+10%水合氯醛15-20ml 保留灌肠st! 处方4丙泊酚注射液50-100mg(1-2mg/kg) 静注 接5%GS 500ml+丙泊酚注射液500mg,按1-10mg(/kg.h)维持。 三、药物过敏 处方1:肾上腺素 0.5-1mg 皮下或肌注st(或 0.9%NS 10ml +肾上腺素 1mg 静注) 0.9%NS 10ml +地塞米松5~10mg静注st! 异丙嗪注射液25mg 肌注st! 处方2 0.9%NS 250ml+ 氢化可的松 200~400mg静滴st!适于过敏休克林格氏液500ml 静脉滴注 0.9%NS 500ml+多巴胺60-80mg 静滴另开放静脉通道用于休克患者 四. 心跳骤停 一、无脉性电活动 处方1 肾上腺素注射液1mg 静脉注射3-5分钟一次。 处方2 血管加压素注射液40u/次静脉注射5分钟后重复一次。 二、室颤或无脉性室性心动过速 处方3 5%GS20ml+胺碘酮300mg 缓慢静脉注射(10分钟) 接5%GS250ml+胺碘酮300mg 静脉滴注1mg/min. 处方45%GS20ml+利多卡因50~100mg 缓慢静注。可减半重复使用。 程序算法描述流程图 程序算法描述流程图 算法的方法 递推法 递推是序列计算机中的一种常用算法。它是按照一定的规律来计算序列中的每个项,通常是通过计算机前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。 递归法 程序调用自身的编程技巧称为递归(recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 注意: (1) 递归就是在过程或函数里调用自身; (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 穷举法 穷举法,或称为暴力破解法,其基本思路是:对于要解决的问题,列举出它的所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解。它也常用于对于密码的破译,即将密码进行逐个推算直到找出真正的密码为止。例如一个 已知是四位并且全部由数字组成的密码,其可能共有10000种组合,因此最多尝试10000次就能找到正确的密码。理论上利用这种方法可以破解任何一种密码,问题只在于如何缩短试误时间。因此有些人运用计算机来增加效率,有些人辅以字典来缩小密码组合的范围。 贪心算法 贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。 用贪心法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题, 通过每一步贪心选择,可得到问题的一个最优解,虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪婪法不要回溯。 贪婪算法是一种改进了的分级处理方法,其核心是根据题意选取一种量度标准,然后将这多个输入排成这种量度标准所要求的顺序,按这种顺序一次输入一个量,如果这个输入和当前已构成在这种量度意义下的部分最佳解加在一起不能产生一个可行解,则不把此输入加到这部分解中。这种能够得到某种量度意义下最优解的分级处理方法称为贪婪算法。 对于一个给定的问题,往往可能有好几种量度标准。初看起来,这些量度标准似乎都是可取的,但实际上,用其中的大多数量度标准作贪婪处理所得到该量度意义下的最优解并不是问题的最优解,而是次优解。因此,选择能产生问题最优解的最优量度标准是使用贪婪算法的核心。 一般情况下,要选出最优量度标准并不是一件容易的事,但对某问题能选择出最优量度标准后,用贪婪算法求解则特别有效。 十大编程算法助程序员走上高手之路 本文为大家梳理阐述了十种高效率的变成算法,熟练掌握的程序员可以借这些方法逐渐发展为高手,那么我们一起来探究一下是哪十种算法有这么神奇的效果。 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 算法步骤: 1 从数列中挑出一个元素,称为“基准”(pivot), 2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 算法二:堆排序算法 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的尺寸为1 门诊常见病处方集 第一章急症处理 一. 高热 10%~25%安乃近2~3滴每侧滴鼻 复方氨基比林2ml im st! 柴胡 2~4ml im st! 口服可选用阿司匹林,复方阿司匹林,对乙酰氨基酚(扑热息痛)及吲哚美辛(消炎痛) 冬眠疗法:氯丙嗪 25mg im st! 异丙嗪 25mg im st! 二.上消化道出血 A.积极补充血容量 (1)右旋糖酐-40 500ml 静滴 (2)输入足量全血,另开通路 B.止血药 (1)肝硬变食道胃底静脉曲张破裂出血 5% 葡萄糖 500ml 静滴0.2~0.4U/分 垂体后叶素 6~8U 10% 葡萄糖 10ml 静脉推注继而以25~50ug/小时的速度持续静滴 奥曲肽(善得定) 0.1ml (2)消化性溃疡出血 处方一:生理盐水20ml 静推每12小时一次 雷尼替丁0.15 处方二:生理盐 水 20ml 静推 QD 奥美拉唑(洛赛克)40mg 处方三:去甲肾上腺 素8mg 分次口服或经胃管注入胃内 冰盐水150ml 处方四:生理盐 水20ml 口服4~6小时/次 凝血酶2000u 注:同时可以应用酚磺乙胺(止血敏)、氨基己酸、氨甲苯酸(止血芳酸)等常规止血药。 三.过敏性休克 处方一:肾上腺 素 1mg 皮下注射 st!极严重时生理盐水10ml 静 推 st! 肾上腺素1mg 处方二:生理盐 水 10ml 静推 st! 地塞米松 5~10mg 或生理盐水 250ml 静 滴 st! 氢化可的松 200~400mg (1)扩容 低分子右旋糖酐500ml 静滴 st! (2)保持呼吸道通畅,给氧,必要时行气管内插管或气管切开(3)抗组胺药物应用,如异丙嗪,苯海拉明等 四.颅内高压症 java程序员必学的十种程序算法 算法1:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 算法步骤: 1 从数列中挑出一个元素,称为“基准”(pivot), 2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 算法2:堆排序算法 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的尺寸为1 算法3:归并排序 归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 算法步骤: 精心整理 图论算法matlab实现 求最小费用最大流算法的 MATLAB 程序代码如下: n=5;C=[0 15 16 0 0 0 0 0 13 14 for while for for(i=1:n)for(j=1:n)if(C(i,j)>0&f(i,j)==0)a(i,j)=b(i,j); elseif(C(i,j)>0&f(i,j)==C(i,j))a(j,i)=-b(i,j); elseif(C(i,j)>0)a(i,j)=b(i,j);a(j,i)=-b(i,j);end;end;end for(i=2:n)p(i)=Inf;s(i)=i;end %用Ford 算法求最短路, 赋初值 for(k=1:n)pd=1; %求有向赋权图中vs 到vt 的最短路 for(i=2:n)for(j=1:n)if(p(i)>p(j)+a(j,i))p(i)=p(j)+a(j,i);s(i)=j;pd=0;end ;end;end if(pd)break;end;end %求最短路的Ford 算法结束 if(p(n)==Inf)break;end %不存在vs 到vt 的最短路, 算法终止. 注意在求最小费用最大流时构造有 while if elseif if if pd=0; 值 t=n; if elseif if(s(t)==1)break;end %当t 的标号为vs 时, 终止调整过程 t=s(t);end if(pd)break;end%如果最大流量达到预定的流量值 wf=0; for(j=1:n)wf=wf+f(1,j);end;end %计算最大流量 zwf=0;for(i=1:n)for(j=1:n)zwf=zwf+b(i,j)*f(i,j);end;end%计算最小费用 课程实验报告题目:计算机算法基础课程实验 课程名称:计算机算法基础 专业班级:计算机科学与技术班 学号: 姓名: 指导教师: 报告日期:2012年11月5日 计算机科学与技术学院 题目1、比较快速分类算法和归并分类算法时间效率 一、方案设计 本实验要求比较快速分类算法和归并分类算法的效率,于是我们很容易联想到通过对比两种算法在处理相同数据所使用的时间来比较两种算法的时间效率。 因此先定义一个函数random()来生成设定个数个随机数,并以文件形式输出。 快速分类算法和归并分类算法均使用文件形式读入数据并以文件形式输出 分类结果,中间过程没有人工参与,这就保证了程序运行时间基本和分类时间一致,因此算法所用时间根据调试窗口所给出程序运行时间为准。试验中快速分类算法和归并分类算法分别在不同的工程文件中实现,对于不同个数的数据分次测试。 为了使两种算法更具有可比性,两种算法都使用递归方法实现。 已知快速分类算法和归并分类算法的平均情况时间都是O(nlogn),但是最坏情况下快速分类算法算法时间复杂度为O(n2),而归并分类算法的时间下界为 Ω(nlogn),因此在比较了两种算法在一般情况下的时间效率之后还要比较两种算法在最坏情况下的时间效率。快速分类算法的最坏情况为被分类数据有序。二、方案实现 随机数据生成: #include 十大滤波算法程序大全 ( 精心整理版 ) 1、限幅滤波法 * 函数名称: AmplitudeLimiterFilter()- 限幅滤波法 *优点:能有效克服因偶然因素引起的脉冲干扰 *缺点:无法抑制那种周期性的干扰,且平滑度差 *说明: 1 、调用函数 GetAD(), 该函数用来取得当前值 2 、变量说明 Value: 最近一次有效采样的值,该变量为全局变量 NewValue: 当前采样的值 ReturnValue: 返回值 3 、常量说明 A: 两次采样的最大误差值,该值需要使用者根据实际情况设置*入口: Value, 上一次有效的采样值,在主程序里赋值 * 出口: ReturnValue, 返回值,本次滤波结果 ****************************************************/ #define A 10 unsigned char Value unsigned char AmplitudeLimiterFilter() { unsigned char NewValue; unsigned char ReturnValue; NewValue=GatAD(); if(((NewValue-Value)>A))||((Value-NewValue)>A))) ReturnValue=Value; else ReturnValue=NewValue; return(ReturnValue); } 2、中位值滤波法 /**************************************************** * 函数名称: MiddlevalueFilter()- 中位值滤波法 *优点:能有效克服因偶然因素引起的波动干扰;对温度、液位等变化缓慢的被测参数有良好 计算机算法分析—习题课 第四章:2 、3、5、6、10、11、23 P99-2 在下列情况下求解4.1节的递归关系式T(n)= ()2(/2) () gnnTnfn???足够小+否则当①g(n)=O(1)和f(n)=O(n);②g(n)=O(1)和f(n)=O(1)。P99-2递推表达式 设n=2k则: T(n)=T(2k)=2T(2k-1)+f(2k) =2(2 T(2k-2)+f(2k-1)) +f(2k) =22T(2k-2)+21f(2k-1)+ f(2k) =………… =2kT(1)+2k-1f(2)+2k-2f(22)+…+20f(2k) =2kg(n)+ 2k-1f(2)+2k-2f(22)+…+20f(2k) g(n)=O(1)和f(n)=O(n) 当g(n)=O(1)和f(n)=O(n)时 不妨设g(n)=a,f(n)=bn,则: T(n)=T(2k) = 2ka+ 2k-1*2b+2k-2*22b+…+20*2kb =2ka+kb2k =an+bnlog2n=O(nlog2n) g(n)=O(1)和f(n)=O(1)>n; for(int i=0;i
(整理)常见病西医处方1
医院常见病处方集
程序算法描述流程图.doc
十大编程算法助程序员走上高手之路
常见病处方集
java程序员必知的十种程序算法
matlab图论程序算法大全
计算机算法基础实验报告
十大滤波算法程序大全(精心整理版)
《计算机算法基础》课后答案