0%

先了解一下背包问题吧:

背包问题主要有三类:01背包,完全背包,多重背包

01背包

有N件物品和一个容量为V的背包。第i件物品的价格(即体积,下同)是w[i],价值是c[i]。用f[i][j]表示前i个背包装入容量为v的背包中所可以获得的最大价值。对于一个物品,只有两种情况

  情况一: 第i件不放进去,这时所得价值为:f[i-1][v]

  情况二: 第i件放进去,这时所得价值为:f[i-1][v-c[i]]+w[i]

状态转移方程:f[i][v] = max(f[i-1][v], f[i-1][v-w[i]]+c[i])

完全背包

有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是w[i],价值是c[i]。完全背包和01背包区别就是完全背包物品有无限件,由之前的选或者不选转变成了选或者不选,选几件

状态转移方程:f[i][v]=max(f[i-1][v-k*c[i]]+k*w[i]|0<=k*c[i]<=v)

多重背包

有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是w[i],价值是c[i]。多了一个限制条件,每个物品规定了可用的次数。

状态转移方程:f[i][v]=max(f[i-1][v-k*w[i]]+ k*c[i]|0<=k<=n[i])


开始新的算法大作业的征程~~

问题情景

一个不同长度的彩带集合,用来绑不同大小的礼物盒,不同尺寸的礼物盒需要不同长度的彩带,问:这个固定的彩带集合最多能绑多少个礼物盒?

贪心算法的尝试

初步文档已经写好,现在开始写代码。

首先把需要的排好序的彩带和需求数组、二分查找的指针准备好。

现在进入while循环,开始二分查找上限。

现在该写meet()函数,判断当前连续需求是否能满足。

明天测试一下二分法遍历彩带长度的代码,我觉得会有问题。并完成继续递归的部分。

二分法遍历彩带长度失败了…….先用for循环吧,明天看看能不能改进。至少现在的代码跑那个样例没有问题。

动态规划的尝试

有两种思路:自顶向下和自顶向上。需要考虑不同的情况,得出递推式,然后写代码。

怎么把动态规划算法和分治算法结合起来呢???暂时觉得,这个题用不了分治,每增加一条彩带,现有的所有彩带的剪切方式都是可能改变的。而不像序列比对,前后两部分不会相互影响。


nondyminic

/(ㄒoㄒ)/~~哭了,动态算法解不了,要用分支界定法,那是个什么东西啊(ㄒoㄒ)

Translation

唐朝始于618年,终于907年,是中国历史上最灿烂的时期。经过近三百年的发展,唐代中国成为世界上最繁荣的强国,其首都长安是当时世界上最大的都市。这一时期,经济发达、商业繁荣、社会秩序稳定,甚至边境也对外开放。随着城市化和财富的增加,艺术和文学也繁荣起来。李白和杜甫以作品简洁自然而著称的诗人。他们的诗歌打动了学者和普通人的心。即使在今天,他们的许多诗歌仍广为儿童及成人阅读背通。

The Tang Dynasty, which dated from 618 and ended in 907, was the most prosperous period in Chinese history. After nearly three hundred years of development, it had become the most flourishing power around the world, with its capital Chang’ an as the largest metropolis in the world. China during that period was embodied in the booming economy, thriving commerce, stable social order and even the open borders. As urbanization gained its momentum and wealth accumulated, art and literature also flourished. Li Bai and Du Fu were poets distinguished for their concise and natural writing style. Their poetry struck a chord with scholars as well as ordinary people. Even today, many of their poems are still widely read and recited by children and adults.

notes
  1. power 强国

    The nation declined as a world power.

    作为一个世界强国,这个国家已经衰落。

  2. flourish [V] 繁荣;昌盛;兴旺

    to develop quickly and be successful or common;grow vigorously;move or swing back and forth;make steady progress

  3. embody [ɪmˈbɑːdi] v. 体现,代表(思想或品质);包括;收录

  4. urbanization n. 城市化;都市化

    Urbanization is the process of creating towns in country areas.

  5. gained its momentum 获得了动力

    Once he got enough of them to come, the event gained its own momentum.

    只要他能凑齐足够的人数,这个会议就能自动获得动力。

  6. struck a chord with 引起共鸣

宋朝始于960直延续到1279期,中国经济大幅增长,成为世界上最先进的经济体,科学、技术、哲学和数学蓬勃发展。宋代中国是世界历史上首先发行纸币的国家。宋朝还最早使用火药并发明了活字( movable-type)印刷。人口增长迅速,越来越多的人住进城市,那里有热闹的娱乐场所。社会生活多种多样。人们聚集在一起观看和交易珍贵艺术品。宋朝的政府体制在当时也是先进的。政府官员均通过竞争性考试选拔任用。

The Song Dynasty started from 960 and lasted until 1279. During that period, China has witnessed a dramatic economic growth, making it the most advanced economy in the world. In the meantime, science, technology, philosophy and mathematics also experienced vigorous development. China back then was the first country to issue the paper money and also the earliest to use gunpowder and invent movable-type printing around the world. With burgeoning population, an increasing number of people flocked to cities where there were bustling entertainment outlets. People at that time enjoyed rich social life, gathering together to appreciate and trade precious artworks. The government system in Song Dynasty was also advanced, with all government officials selected and appointed through competitive examination.

notes
  1. outlets [ˈaʊtˌlɛts] n.
    (感情、思想、精力发泄的)出路;表现机会;专营店;经销店;折扣品经销店

    Clothing stores also face heavy competition from factory outlets.

    成衣店也面临着来自工厂直销店的激烈竞争。

  2. bustling [ˈbʌslɪŋ] adj. 繁忙的;熙熙攘攘的; v. 四下忙碌;催促(某人向某方向)

    a bustling city

    熙熙攘攘的城市

    The market was bustling with life.

    市场上生机勃勃。

算法面试题

利用0,1真的是能巧妙地解决好多问题啊,今天看到了下面这个题:

有1000桶酒,其中1桶有毒。而一旦吃了,毒性会在1周后发作。现在我们用小老鼠做实验,要在1周后找出那桶毒酒,最少需要多少老鼠? 答案是10只!!!将10只老鼠按顺序排好,每桶酒按照编号转换为二进制,给相应位置上是1的老鼠喝,最后按死掉的老鼠是哪几只,再转成十进制,就是第几桶酒。

我最开始看到题目,陷入了固有思维,默认只有一只老鼠会死,觉得哪只老鼠死了,它喝的酒就有毒,看了答案,觉得太妙了,所有的老鼠都含有有效信息!

基数排序和快排

关于基数排序

先以个位数的大小来对数据进行排序,接着以十位数的大小来多数进行排序,接着以百位数的大小……排到最后,就是一组有序的元素了。不过,他在以某位数进行排序的时候,是采用“桶”来排序的,基本原理就是把具有相同个(十、百等)位数的数放进同一个桶里。

若以最高位来排序的话,是可以减少数据之间比较的次数。但以最高位来排序有个致命的缺点。在每个小部分的排序中,我们也是需要10个桶来将他们进行排序,最后导致的结果就是,每个不同值的元素都会占据一个“桶”,如果你有1000个元素,并且1000个元素都是不同值的话,那么从最高位排序到最低位,需要1000个桶。这样子的话,空间花费不仅大,而且看起来有点背离基数排序最初的思想了。所以,我们一般采用从最低位到最高位的顺序。

复杂度比较

基数排序的时间复杂度为O(n),快排的时间复杂度为O(nlogn),对于大的数组,在操作次数上,基数排序比快排要有优势,但随着排序数据的增加,快速排序的速度却比基数排序快。这其中的原因涉及到每项排序平均cache缺失率。

存储过程和事务

今天用一个小时帮别人写好了大作业里的存储过程(也称函数)和事务,记录一下遇到的问题:

  1. 若出现表名或属性名与关键字重复的情况(最好不要出现这种情况),应该在表名或属性名上加`…`,注意此处不是单引号,例如:`view`。
  2. 开启事务是start transaction,不是begin。
  3. 在存储过程声明参数或变量时,要先写变量名再写变量类型,例如:(IN id INT)或”DECLARE id INT;”。
  4. 如果在存储过程中有抛出错误的语句(DECLARE HANDLER CONTINUE FOR SQLEXCEPTION SET id=1;),那么赋值语句要写在它之后,放在它前面的话会报错。

关于触发器

做了当一个表删除时的触发器,怎么获取被删除的那条数据的信息呢,比如说ID?
1
2
declare @ID typeof ID;
select @ID=ID from deleted;

触发器中有两个特殊的表:inserted和deleted,可以从中获取被插入或删除行的信息。

还看见了一个奇怪的问题

在Sql Server触发器中判断操作是Insert还是Update还是Delete?

解答中用到了这两个表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
DECLARE
@IsInsert bit,
@IsUpdate bit,
@IsDelete bit
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)
SET @IsInsert = 1
ELSE
SET @IsInsert = 0
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
SET @IsUpdate = 1
ELSE
SET @IsUpdate = 0
IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)
SET @IsDelete = 1
ELSE
SET @IsDelete = 0
create trigger Update_Del on Table1
for update,delete -- 为什么事件触发
as -- 事件触发后所要做的事情
if not exists(select 1 from inserted)
begin /*inserted表无记录,是删除*/
end
else
begin /*是更新*/ end
go

Deleted表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted表中。Deleted 表和触发器表通常没有相同的行。
Inserted表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted表和触发器表中。Inserted 表中的行是触发器表中新行的副本。
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)

算法初步实现

//剩余蛋糕数量

static int leftCakes[];

//蛋糕总量(不是数量,而是大小之和)

static int totalCake = 0;

//浪费蛋糕量

static int lostCake = 0;

static boolean canFeed(int[] mouths, int monthIndex, int sum)

{

if(monthIndex<=0) {

//递归边界

return true;

}

//如果 蛋糕总量-浪费蛋糕量 小于当前的需求量,直接返回false,即无法满足

if(totalCake - lostCake < sum) {

return false;

}

//从小到大遍历蛋糕

for(int i=0;i<leftCakes.length; i++) {

if (leftCakes[i] >= mouths[monthIndex]) {

//找到并吃掉匹配的蛋糕

leftCakes[i] -= mouths[monthIndex];

//剩余蛋糕小于最小的需求,变为浪费蛋糕

if (leftCakes[i] < mouths[1]){

lostCake += leftCakes[i];

}

//继续递归,试图满足mid下标之前的需求

if (canFeed(mouths, monthIndex-1, sum)) {

return true;

}

//无法满足需求,蛋糕状态回滚

if (leftCakes[i] < mouths[1]) {

lostCake -= leftCakes[i];

}

leftCakes[i] += mouths[monthIndex];

}

}

return false;

}

public static int findMaxFeed(int[] cakes, int[] mouths){

//蛋糕升序排列,并把0下标空出

int[] cakesTemp = Arrays.copyOf(cakes, cakes.length+1);

Arrays.sort(cakesTemp);

for(int cake: cakesTemp){

totalCake += cake;

}

//顾客胃口升序排列,并把0下标空出

int[] mouthsTemp = Arrays.copyOf(mouths, mouths.length+1);

Arrays.sort(mouthsTemp);

leftCakes = new int[cakes.length+1];

//需求之和(下标0的元素是0个人的需求之和,下标1的元素是第1个人的需求之和,下标2的元素是第1,2个人的需求之和.....)

int[] sum = new int[mouths.length+1];

for(int i=1;i<=mouths.length;i++) {

sum[i] = sum[i - 1] + mouthsTemp[i];

}

//left和right用于计算二分查找的“中点”

int left=1,right=mouths.length;

//如果胃口总量大于蛋糕总量,right指针左移

while(sum[right]> totalCake){

right--;

}

//中位指针,用于做二分查找

int mid=((left+right)>>1);

while(left<=right)

{

//重置剩余蛋糕数组

leftCakes = Arrays.copyOf(cakesTemp, cakesTemp.length);

//重置浪费蛋糕量

lostCake =0;

//递归寻找满足需求的临界点

if(canFeed(mouthsTemp, mid, sum[mid])){

left=mid+1;

} else {

right = mid - 1;

}

mid=((left+right)>>1);

}

//最终找到的是刚好满足的临界点

return mid;

}

public static void main(String[] args) {

int[] cakes = new int[]{3,5,15,17,25};

int[] mouths = new int[]{2,5,7,9,12,14,20};

int maxFeed = findMaxFeed(cakes, mouths);

System.out.println("最大满足顾客数:" + maxFeed);

}

需要说明几点:

1.主流程方法findMaxFeed,执行各种初始化,控制二分查找流程。

2.方法canFeed,用于检验某一位置之前的顾客是否能被给定蛋糕满足。

3.数组leftCakes,用于临时存储剩余的蛋糕大小,每次重新设置中间下标时,这个数组需要被重置。

在极端情况下,性能不高,有很多优化空间。比如,在 canfeed方法中,同样可以采用二分的方式,而不是一点点去遍历。再者,我们也可以尝试用动态规划的思想来解决问题。

问题

为什么不把蛋糕从大到小排序,而顾客从小到大排序,再从左至右匹配呢,这样被浪费的大蛋糕是最小的,自然满足了最多的顾客了,这样会不会更快呢?

举个反例:有两个蛋糕,大小50和1,有两个顾客,胃口1和50,如果蛋糕从大到小,只能满足一个顾客,浪费了49

第一反应,类似背包问题

一开始小灰也觉得像背包问题,但背包的物品要么选择,要么不选,蛋糕却可以任意拆分,可能性非常多

到第四步的时候,饭量2到9的顾客已经满足了,为什么还要检查2到14的顾客呢?应该是检查12到14的吧?到了第五步,14及之前的顾客已经满足,剩下的蛋糕还有个25的,为什么不能满足饭量为20的顾客呢?

涉及12到14的顾客时,蛋糕需要重新分配,而不能仅仅用之前剩下的蛋糕分配。所以必须重新检查2到14

假设蛋糕为1,3,14,28 食客为1,3,13,14,15 按照这个算法,13的食客会吃掉14的蛋糕,剩余1,最终得到的结果就会是4,而实际上,如果把28的分给13和15,由14的食客吃掉14的蛋糕,结果应该是5

可以用小灰的代码自己测试下,我这边测了结果是5

为什么不从吃蛋糕最多的人开始查找呢?~因为如果是最大的吃蛋糕的人不符合,那么就可以直接递减,如果算法吃的多的人满足~那么吃得少的也会依次计算~还是满足的~这样会不会更好?~

“为什么不从吃蛋糕最多的人开始查找呢?”,你指的是哪一步?是二分查找之前还是二分查找内部?目前二分查找内部已经是从饭量最多的人开始查找了,而外部使用二分查找是更高效的方式。

第一种从左到右的遍历,和第二种二分查找遍历,只是时间复杂度上的不同,为什么会有的结果?

因为第二种思路在验证是否满足顾客时,带走回滚操作,极端情况下会枚举出所有可能性

研究了下代码,代码没问题,讲解的有问题,例子也举的不够好。二分法直接用是图省事了,其实可以排序后计算蛋糕总和S,以此算出最大可能满足的人数n后直接验证人数n能减少资源占用及计算量

漫画讲解的是最核心步骤,所以涉及回滚之类的细节就只体现在代码当中。你所说的计算最大可能满足人数n,并不一定是能通过验证,然后还得继续验证n-1,n-2….这样还不如采用二分法

或许该妥协了,看看要不要换题吧。

题目

有m块蛋糕,要分发给n个顾客来吃,每个蛋糕大小不等,每个顾客的饭量也不同。

举个例子

我们有5块蛋糕,蛋糕的大小分别是 5,17,25,3,15

img

我们有7位顾客,他们的饭量分别是 2,5,7,9,12,14,20

(每个蛋糕大小和顾客食量都是小于1000的整数,蛋糕和顾客的数量不超过1000)

在分发蛋糕时,有一个特殊的规则:蛋糕可分不可合

最后的问题是:给定蛋糕大小的集合cakes,给定顾客饭量的集合mouths,如何计算出这些蛋糕可以满足的最大顾客数量?

比如:输入cakes集合 {2,9};输入mouths集合 {5,4, 2,8}

正确返回:3

思路一

为了让更多的顾客吃饱,肯定要优先满足食量小的顾客,所以小灰决定使用贪心算法

首先,把蛋糕和顾客从小到大进行排序:

按照上面的例子,排序结果如下:

img

接下来,让每一个蛋糕和顾客按照从左到右的顺序匹配。如果蛋糕大于顾客饭量,则切分蛋糕;如果蛋糕小于顾客饭量,则丢弃该蛋糕。

第1块蛋糕大小是3,第1个顾客饭量是2,于是把蛋糕切分成2+1,满足顾客。剩下的1大小蛋糕无法满足下一位顾客,丢弃掉。

img

第2块蛋糕大小是5,第2个顾客饭量是5,刚好满足顾客。

img

第3块蛋糕大小是15,第3个顾客饭量是7,于是把蛋糕切分成7+8,满足顾客。剩下的8大小蛋糕无法满足下一位顾客,丢弃掉。

img

第4块蛋糕大小是17,第4个顾客饭量是9,于是把蛋糕切分成9+8,满足顾客。剩下的8大小蛋糕无法满足下一位顾客,丢弃掉。

img

第5块蛋糕大小是25,第5个顾客饭量是12,于是把蛋糕切分成12+13,满足顾客。剩下的13大小蛋糕无法满足下一位顾客,丢弃掉。

img

这样一来,所有蛋糕都用完了,由贪心算法得出结论,最大能满足的顾客数量是5。

这种算法不是最优:

img

例子当中,

3的蛋糕满足2的顾客,

5的蛋糕满足5的顾客,

15的蛋糕满足12的顾客,

17的蛋糕满足7和9的顾客,

25的蛋糕满足14的顾客。

显然,面试官随意给出的吃法,满足了6个顾客。

其实一开始给蛋糕和顾客从小到大排序是没有问题的,不过这其中还有另外一个关键点。当顾客从小到大排序之后,无论蛋糕大小如何,最多能满足的顾客组合中定有一个组合是连续的。

img

其实道理很简单,由于顾客的饭量是从小到大排序的,优先满足饭量小的顾客,才能尽量满足更多的人。

因此,在记录顾客饭量的数组中,必定存在一段从最左侧开始的连续元素,符合当前蛋糕所能满足的最多顾客组合。

这样一来,我们的题目就从寻找最大满足顾客数量,转化成了寻找顾客饭量有序数组中的最大满足临界点:

img

切蛋糕的问题比普通的二分查找要复杂得多,因为我们要寻找的顾客饭量数组临界元素,并不是简单地判断元素是否相等,而是要验证给定的蛋糕能否满足临界元素之前的所有顾客。

如何来实现呢?我们仍旧使用刚才的例子,演示一下详细过程:

img

第一步,寻找顾客数组的中间元素。

在这里,中间元素是9:

img

第二步,验证饭量从2到9的顾客能否满足。

子步骤1,遍历蛋糕数组,寻找大于9的蛋糕,最终寻找到元素15。

img

子步骤2,饭量9的顾客吃掉15的蛋糕,还剩6大小。

img

子步骤3,重新遍历蛋糕数组,寻找大于7的蛋糕,最终寻找到元素17。

img

子步骤4,饭量7的顾客吃掉17的蛋糕,还剩10大小。

img

子步骤5,重新遍历蛋糕数组,寻找大于5的蛋糕,最终寻找到元素5。

img

子步骤6,饭量5的顾客吃掉5的蛋糕,还剩0大小。

img

子步骤7,重新遍历蛋糕数组,寻找大于2的蛋糕,最终寻找到元素3。

img

子步骤8,饭量2的顾客吃掉3的蛋糕,还剩1大小。

img

到此为止,从2到9的所有顾客都被满足了,验证成功。

接下来,我们需要引入更多顾客,从而试探出蛋糕满足的顾客上限。

第三步,重新寻找顾客数组的中间元素。

由于第二步验证成功,所以我们要在元素9右侧的区域,重新寻找中间元素。显然,这个中间元素是14:

img

第四步,验证饭量从2到14的顾客能否满足。

这一步和第二步的思路是相同的,这里就不详细阐述了。最终的验证结果是,从2到14的顾客能够满足。

接下来,我们还要引入更多顾客,试探出蛋糕满足的顾客上限。

第五步,重新寻找顾客数组的中间元素。

由于第四步验证成功,所以我们要在元素14右侧的区域,重新寻找中间元素。显然,这个中间元素也就是唯一的元素20:

img

第六步,验证饭量从2到20的顾客能否满足。

这一步和第二步、第四步的思路是相同的,这里就不详细阐述了。最终的验证结果是,从2到20的顾客不能够满足。

经过以上步骤,我们找到了最大满足顾客的临界点14,从2到14共有6个顾客,所以给定蛋糕最大能满足的顾客数量是6

MySQL存储过程中使用select…into…语句赋值

1
2
3
4
5
6
7
create procedure getMsg()  
Begin
declare v_title varchar(30);
declare v_content varchar(100);
select title,content into v_title,v_content from news where artId=333;
select v_title,v_content; -- 将变量作为结果集返回
End

贪心算法的尝试失败了,需要先学习一下常见算法的适用情形了,主要包括递归预分支、动态规划、贪心、回溯、分支界限法,参考博客

递归与分治

将一个规模为n难以解决的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题同样。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。

典例:Fibonacci数列,阶乘,Hanoi塔;二分法搜索、快速排序、合并排序

动态规划法

依据当前(阶段)状态,采取对应的决策,引起状态的转移。因为动态规划解决的问题多数有重叠子问题这个特点,为降低反复计算,对每个子问题仅仅解一次,将其不同阶段的不同状态保存在一个二维数组中。

与分治法最大的区别是:适合于用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)。

典例:最长公共子序列; 最大连续子序列和(最大m子段和)。

贪心算法

贪心算法并不从整理最优上进行考虑,它所做出的选择仅仅是在某种意义上的局部最优选择。贪心算法不能保证找到的解是最优解(嗯,我就栽在这上面了…),但在某些情况下能够是最优解的近似解,甚至是最优解。

典例:哈夫曼编码;单源最短路径(Dijkstra算法);最小生成树(Prim和Kruskal算法)

回溯法(DFS搜索解空间)

回溯法是以深度优先方式搜索问题解的算法,它适用于组合数较大的问题,能系统地搜索到一个问题的全部解惑任一解。

回溯法解题通常包括3个步骤:①针对所给的问题,定义问题的解空间; ②确定易于搜索的解空间的结构; ③ 以DFS搜索解空间,并在搜索过程中用剪枝函数(约束条件)避免无效搜索

解空间树

①子集树:当所给问题是从n个元素的结合S中找出满足某种性质的子集时,对应的解空间树称为子集树。比如n个物品的0-1背包问题。这类子集树通常有2^n个叶节点,其节点总个数为为2^(n+1)-1。遍历子集树的不论什么算法均需O(2^n)的计算时间

②排列树:当所给问题是确定n个元素满足某种性质的排列时,对应的解空间树成为排列树。比如旅行售货员问题。排列树通常有n!个叶节点,因此遍历排列树须要O(n!)的计算时间。

搜索实现能够递归,也能够用树的非递归深度优先遍历算法来实现(用到栈Stack)。

典例:八皇后(找出全部的解)

分支界限法(BFS搜索解空间)

分支界限法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。(分支界限法与回溯法求解目标不同)

分支界限法以广度优先或以最小耗费(最大收益)优先的方式搜索解空间。所谓“分支”就是在扩展节点处,先生成其全部儿子节点(分支),然后在从当前的活结点表中选择下一个扩展节点,继续搜索。过程中能够用约束条件,进行剪枝。

常见的扩展节点的常见方式:先进先出FIFO队列优先队列分支界限法

典例:单源最短路径

2017年6月英语六级作文范文:选择综合类大学还是职业学院

题目

Directions: Suppose you are asked to give advice on whether to attend a vocational college or a university, write an essay to state your opinion. You are required to write at least 150 words but no more than 200 words.

范文一

With the flourish of education industry, modern students are faced with more alternatives to continue their further education. Attending a vocational college or a university serves as two main options for the high school graduates. In terms of which to choose and what to be taken into consideration, I shall advise as follows:

Primarily, self-orientation matters the most when it comes to an issue like this. Obviously, the main task of vocational college is cultivating human resource with practical capability. Instead, university serves as the cradle of academic researchers in different areas. Therefore, being aware of your self-expectation with a clear future blueprint lays a foundation for this importation decision.

Apart from what has been mentioned above, personal interest also plays a key role in it. For both passion and motivation are derived from interest, which not only decide how far you can reach academically and professionally but also how happy and fulfilled you will be.

To sum up, a clear recognition of self-orientation and personal interest will decide whether you will tick the box of vocational college or university. Only in this way can we get the most out of the future education.

范文二:

It’s an undisputable truth that virtually all high school graduates will encounter the choices between a vocational college and a university. And when it comes to this question, students’ ideas are not cut from the same cloth. In point of which to choose and what to be taken into consideration, my advise is as follows.

In the first place, we should be conscious of the fact that both of the two choices have its own superiorities. For instance, a vocational college specializes in cultivating human resources with practical capabilities; while a university serves as the cradle of academic researchers in different fields. Then it does follow that high school graduates should have a clear picture of themselves. That is to say, they should know their merits and demerits and their choices must give play to their strengths whilst circumvent weaknesses. In addition, interest is the best teacher and it’s also the premise of learning on one’s own initiative. Thus interest must be taken into account because it can not only decide how far one can reach academically and professionally but also how happy and fulfilled one will be.

In brief, all above just goes to show that there really is no one-size-fits-all answer for the question. The key lies in a clear cognition, accurate self-positioning and the interest of oneself. Only then can everyone find a right path that works best for us.

Note

1、

留意「如下」的事物无论是单数还是复数,动词 follow都须加 s,例如:

His address is as follows(他的住址如下)

Their addresses are as follows(他们的住址如下)

做名词的 the following(下述)则不同,动词须用单数还是复数形式,决定于「下述」事情是单数还是复数,例如:

The following are their addresses(以下是他们的住址)

The following is his address(以下是他的住址)

2、virtually [ˈvɜːrtʃuəli] adv. 几乎,差不多;事实上,实际上;模拟,虚拟;

to be virtually impossible 几乎是不可能的

He virtually admitted he was guilty. 他实际上已承认自己有罪。

This thing’s virtually useless. 这玩意儿简直一点用也没有。

在口语中常用actually,不用virtually
acutally是事实上发生的,而virtually不一定发生却等同于此
例:He is our virtual manager.
他是我们事实上的经理(他不是经理,但他掌实权,就象是经理)
He is our actual manager.
他是我们实际的经理(他就是经理)

3、cut from the same cloth[英][kʌt frɔm ðə seim klɔθ][美][kʌt frʌm ði sem klɔθ] 与…同类,一路货色;

All his stories are cut from the same cloth and is boring.
他的故事千篇一律,真是无聊。

4、superiority 优越(性);优势;优越感;神气活现的样子;盛气凌人的行为

5、give play to 发挥

We must give play to the important role of science and technology as the primary productive force.

必须发挥科学技术作为第一生产力的重要作用

whilst 同时

6、circumvent [ˌsɜːrkəmˈvent] v. 设法回避;规避;绕过;绕行;绕道旅行

7、premise [ˈpremɪs] n. 前提,假定

8、one-size-fits-all 通用的,一体适用的

mysql抛出异常:

1
2
3
4
5
IF(!(new.eqpid LIKE CONCAT(new.catid,'%'))) 
THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '输入错误' ;
-- set new.eqpid=NULL;
ELSE insert into audit_equipment VALUES(new.eqpid,user(),now(),1);
END IF;

php:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
try{
$model = new Equipment();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->eqpid]);
}
}catch(\Exception $e){

}
return $this->render('create', [
'model' => $model,
]);
}