楼主: newkid

[精华] 趣味SQL:微软面试题:过河

[复制链接]
论坛徽章:
4
灰彻蛋
日期:2012-05-16 11:07:37迷宫蛋
日期:2012-05-28 11:08:36咸鸭蛋
日期:2012-06-04 18:25:05蜘蛛蛋
日期:2012-06-07 14:48:16
171#
发表于 2012-5-22 12:34 | 只看该作者
我用心算算出是17
用SQL没试过~
不过我在书城的一本剑破冰山的书中好像见到过~

使用道具 举报

回复
论坛徽章:
4
灰彻蛋
日期:2012-05-16 11:07:37迷宫蛋
日期:2012-05-28 11:08:36咸鸭蛋
日期:2012-06-04 18:25:05蜘蛛蛋
日期:2012-06-07 14:48:16
172#
发表于 2012-6-20 11:06 | 只看该作者
回头看看这题,感觉不用递归也行


SQL> with t as
  2  (select rownum rn,t.name,t.time from bridge_crossing t),
  3  tt as (select t1.name n1,t2.name n2,t3.name n3,t4.name n4,t5.name n5,t6.name n6,
  4  t1.time time1,t2.time time2,t3.time time3,t4.time time4,t5.time time5,t6.time time6,
  5  greatest(t1.time,t2.time)+least(t1.time,t2.time)+
  6  greatest(t3.time,t4.time)+
  7  least(greatest(t1.time,t2.time),t3.time,t4.time)+
  8  greatest(t5.time,t6.time) sum_time
  9  from t t1,t t2,t t3,t t4,t t5,t t6
10  where t1.name<>t2.name and t3.name<>t4.name and t1.name<>t6.name
11  and t1.rn<t2.rn and t3.rn<t4.rn and t5.rn<t6.rn
12  and instr(t1.name||t2.name||t3.name||t4.name||t1.name||t6.name,'A',1,1)>0
13  and instr(t1.name||t2.name||t3.name||t4.name||t1.name||t6.name,'B',1,1)>0
14  and instr(t1.name||t2.name||t3.name||t4.name||t1.name||t6.name,'C',1,1)>0
15  and instr(t1.name||t2.name||t3.name||t4.name||t1.name||t6.name,'D',1,1)>0 ),
16  ttt as (select min(sum_time) min_time from tt)
17  select n1,n2,n3,n4,n5,n6,sum_time from tt,ttt where tt.sum_time=ttt.min_time
18  /

N1         N2         N3         N4         N5         N6           SUM_TIME
---------- ---------- ---------- ---------- ---------- ---------- ----------
A          B          C          D          A          B                  17

SQL>

解释下:第一次是N1N2过去,第二次N3N4过去,第三次N5N6过去

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
173#
 楼主| 发表于 2012-6-21 04:26 | 只看该作者
0x0x0x 发表于 2012-6-20 11:06
回头看看这题,感觉不用递归也行

最后那一堆instr条件是什么意思?为什么没有t5而t1出现两次?
你这个写法局限性很大。join的次数是固定的,受限于人数;现在的sum_time计算公式已经这么复杂,而且仅限于每次两人,很难再扩展。

使用道具 举报

回复
论坛徽章:
4
灰彻蛋
日期:2012-05-16 11:07:37迷宫蛋
日期:2012-05-28 11:08:36咸鸭蛋
日期:2012-06-04 18:25:05蜘蛛蛋
日期:2012-06-07 14:48:16
174#
发表于 2012-6-21 08:34 | 只看该作者
newkid 发表于 2012-6-21 04:26
最后那一堆instr条件是什么意思?为什么没有t5而t1出现两次?
你这个写法局限性很大。join的次数是固定的 ...

一堆instr是为了过滤掉不合理的排列组合,t5 t1的问题是打错字。已更正。
这种自连接的写法的确是局限性很大。
木办法,我还是不太适应用SQL写复杂的递归查询!

尽管这个语句有很大的局限性,我还是决定更正过来:

SQL> set timing on;
SQL> with t as
  2  (select rownum rn,t.name,t.time from bridge_crossing t),
  3  tt as (select t1.name n1,t2.name n2,t3.name n3,t4.name n4,t5.name n5,t6.name n6,
  4  t1.time time1,t2.time time2,t3.time time3,t4.time time4,t5.time time5,t6.time time6,
  5  greatest(t1.time,t2.time)+least(t1.time,t2.time)+
  6  greatest(t3.time,t4.time)+
  7  least(greatest(t1.time,t2.time),t3.time,t4.time)+
  8  greatest(t5.time,t6.time) sum_time
  9  from t t1,t t2,t t3,t t4,t t5,t t6
10  where t1.name<>t2.name and t3.name<>t4.name and t5.name<>t6.name
11  and t1.rn<t2.rn and t3.rn<t4.rn and t5.rn<t6.rn
12  and instr(t1.name||t2.name||t3.name||t4.name||t5.name||t6.name,'A',1,1)>0
13  and instr(t1.name||t2.name||t3.name||t4.name||t5.name||t6.name,'B',1,1)>0
14  and instr(t1.name||t2.name||t3.name||t4.name||t5.name||t6.name,'C',1,1)>0
15  and instr(t1.name||t2.name||t3.name||t4.name||t5.name||t6.name,'D',1,1)>0
16  and t1.name||t2.name<>t3.name||t4.name
17  and t3.name||t4.name<>t5.name||t6.name),
18  ttt as (select min(sum_time) min_time from tt)
19  select n1,n2,n3,n4,n5,n6,sum_time from tt,ttt where tt.sum_time=ttt.min_time
20  /

N1         N2         N3         N4         N5         N6           SUM_TIME
---------- ---------- ---------- ---------- ---------- ---------- ----------
A          B          C          D          A          B                  17

已用时间:  00: 00: 00.09
SQL>

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
12
ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42秀才
日期:2015-08-06 10:47:08马上有房
日期:2014-11-10 19:56:59优秀写手
日期:2014-07-25 06:00:032014年世界杯参赛球队: 意大利
日期:2014-06-20 16:19:18马上有房
日期:2014-05-15 21:22:18马上有钱
日期:2014-05-05 23:16:35马上有车
日期:2014-03-09 18:57:04问答徽章
日期:2013-10-30 22:14:092013年新春福章
日期:2013-02-25 14:51:24
175#
发表于 2012-6-21 10:46 | 只看该作者
其实不用想,只要往回走的那个人速度最快就行了,其他顺序都一样,就是2+5+10=17

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
176#
 楼主| 发表于 2012-6-21 22:07 | 只看该作者
0x0x0x 发表于 2012-6-21 08:34
一堆instr是为了过滤掉不合理的排列组合,t5 t1的问题是打错字。已更正。
这种自连接的写法的确是局限性 ...

你这个思路没有体现“每次过河的人不是已经过河的人"这个条件。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
177#
 楼主| 发表于 2012-6-21 22:08 | 只看该作者
魔界卧龙 发表于 2012-6-21 10:46
其实不用想,只要往回走的那个人速度最快就行了,其他顺序都一样,就是2+5+10=17

“往回走的那个人速度最快”,其他人的搭配则大有讲究。

使用道具 举报

回复
论坛徽章:
2
喜羊羊
日期:2015-03-04 14:52:462015年新春福章
日期:2015-03-06 11:58:18
178#
发表于 2015-2-1 22:54 | 只看该作者
本帖最后由 wuxiaobo_2009 于 2015-2-1 22:57 编辑
  1. 关于N人,同时两人过桥问题算法:
  2. a b: 耗时最短,次短
  3. y z :耗时次长,最长
  4. 最佳方案构造法:以下是构造N个人(N≥1)过桥最佳方案的方法:

  5.   1) 如果N=1、2,所有人直接过桥。
  6.   2) 如果N=3,由最快的人往返一次把其他两人送过河。
  7.   3) 如果N≥4,设A、B为走得最快和次快的旅行者,过桥所需时间分别为a、b;而Z、Y为走得最慢和次慢的旅行者,过桥所需时间分别为z、y。那么
  8.     当2b>a+y时,使用模式一将Z和Y移动过桥;
  9.     当2b<a+y时,使用模式二将Z和Y移动过桥;
  10.     当2b=a+y时,使用模式一将Z和Y移动过桥。
  11. 这样就使问题转变为N-2个旅行者的情形,从而递归解决之。

  12. 备注
  13. 模式一:
  14. A,Z -->a
  15. A <--a
  16. 模式二:
  17. A,B -> b
  18. A <-a
  19. Y,Z ->z
  20. B<- b
  21. A,B->a
复制代码

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表