作者chucheng (CHUCHU)
看板Oversea_Job
标题[闲聊] Intern面试的考题(CS)
时间Wed Jan 12 09:08:19 2011
※ [本文转录自 studyabroad 看板 #1DBFT-Dh ]
作者: chucheng (CHUCHU) 看板: studyabroad
标题: [闲聊] Intern面试的考题(CS)
时间: Wed Jan 12 08:36:11 2011
我後来重新确认了问题,把一些人来信问我的内容更新如下
其实原考题和我陈述的有一点不同(So Sorry) 以下黄色是更新
(Sorry, 我没把问题搞清楚就Po了,原来是买航线不是买机票…)
这是我朋友遇到…面试的考题…
美国某家 超大 软体公司…
他不问还好,一问了…愈想愈头痛,不想出答案不行…(怒)
所以发来版上给大家一起想想(面试已结束)
以下给CS(Computer Science)的人服用,其它科系请左转离开(或是看有趣也行)
一开始是先简单问一下知不知道什麽是Travelling Salesman Problem...
这里:
http://en.wikipedia.org/wiki/Travelling_salesman_problem
这个问题已经都知道是NP-HARD,所以基本上就是确定一下你修过演算法(我猜)
接下来面试官说…
我们把问题简化一点
假设某国家有n个城市
彼此之间飞机互连(但是机票价格不一定)
为了复杂问题,A飞B,和B飞A的价格是不一样的
到这里,他和我都猜测…可以想像成一个Graph,
假设G好了,其中节点为V,连结为E
则G(V,E)是一个有向图(每个E有权重,代表飞机票的价格)
第一个问题(我们有想出来了)
就是给定一个起点,问你飞到终点(可能需要转机),最便宜的总价是多少
考官要求答案一定要正确(最佳解),然後程式的时间/空间复杂度愈佳 愈好
最笨的解法就是把所有可能的路线都列出来
当然修过AI的我,就想起A* Search...
我的同学很紧张时,是回答用BFS(Breadth-First Search)
考官当然问他有没更好的解法…所以我猜他在这已经阵亡了…
接下来就是…implement …(时间流逝)
考官结束前,顺口讲了,叫他回去想一想(丢了另一个"
问题")
(我们一致认为这个就是考官要问的第二个问题,只不过因为该受测者提早阵亡XD)
这个问题就难倒好几个同学了(包含我)
----正文开始----
考官说,如果
你要开始经营一间航空公司
因此,客人来自四面八方
故:
(1) 起点不知道(每个点都可能,出发地不明),终点当然要包含所有的点(客人目的地未知)
(2)
你的任务是找出该买的所有航线
注:假设所有的
航线都买是最差的解(因为很贵)
你的任务是:
讲白一点,就是要用最便宜的航线串好
所有的机场
(
要能去能回,不然客人不就跑去别家航空了)
这个问题该怎麽解呢?(当然,时间和空间复杂度要愈佳愈好)
一开始我们认为这个问题很简单,先把所有的航线(Edge)列出来
例如
起 价格 终
V1 100 V2
V2 200 V3
…
不列出所有可能的组合,而直接Reversely Sort 所有的 Edge based on Weighting
注:航线 V1-->V2 的价格不保证等於V2->V1的价格
然後Greedy的方式,把由高到低的把贵的航线给干掉…
每干掉一个Edge,要确定不影响条件1,直到没有可以干的Edge就停…
这样得到的保证是解,但是不是最佳解就不得而知了…
检查条件就是确定indegree >1(保证到得了)
,以及out-degree >1(保证出得去)
假设有m个机场,n个路线,存在array里的话
时间的难点应该是在sort,应是 O(n log n) ,只有的检查很快
空间的话,需要 m * 2 (indegree + outdegree) for 机场(检查条件1)
以及 2 * n for 路线(起点+终点) <--用来sort
应该是O(n) (n > m,不然串不起来)
正当我很高兴的觉得这样搞定了
心里总觉得…好像怪怪的,会不会太简单了
以上是心得分享…
下面是问题…
有人能帮忙举个反例,否定我们想出来的演算法
OR
能提出更好的演算法就更佳了…
总之觉得这个interview的问题蛮有趣的… :)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 131.179.64.154
1F:推 poplin:最後一个问题用DP可解吗? 第一个想到的是这个 01/12 08:46
2F:推 tiwei:看到这题难度 我想大约是google or facebook 01/12 09:18
3F:→ tiwei:MS, Amazon 一搬不会问到这麽难 01/12 09:18
4F:推 eshai:所以面试前演算法的东西其实要很熟练耶! (我在讲废话吗? XD) 01/12 09:37
5F:→ kruz:会问到这样应该是PhD等级的.. 01/12 09:43
6F:→ chucheng:是PhD Level:) 01/12 09:45
7F:推 pest:某e公司表示:这是公司机密 实作出来的那个人已经领股票养老了 01/12 09:47
8F:推 pest:第一个部份感觉用Dijkstra解比较快 01/12 09:57
9F:→ chucheng:一开始想到A*是想省空间,把这想成是下棋 01/12 10:03
10F:→ chucheng:但Dijkstra似乎像BFS(要走过所有的可能),没有pruning? 01/12 10:06
※ 编辑: chucheng 来自: 131.179.64.154 (01/12 10:13)
11F:推 nukchichi:第一个我想到的也是Dijkstra. 其他不知道@@" 好难喔~ 01/12 10:40
12F:推 vgod:看起来只是基本的single-pair和all-pairs shortest path? 01/12 10:50
13F:推 ksl871:有没有提到转机的机场能不能重复? 01/12 11:47
14F:推 gasper:转机机场能不能重复没差 最佳解一定不会有重复机场(loop) 01/12 12:23
15F:推 NoisyNose:不一定喔,应该要看网路吧,可能重复某个hub解会更好 01/13 01:11
16F:→ chucheng:可重覆,因为假设抵达B为一的路径 是A,则唯一的方法就 01/13 01:32
17F:→ chucheng:是从A->B, B->A, 再去其它点 01/13 01:33
※ 编辑: chucheng 来自: 131.179.64.241 (01/13 02:24)
18F:推 pest:第二个问题好像还变更简单了,找出让所有机场双向互连的edge? 01/13 03:05
19F:→ chucheng:不一定是双向互连,绕圈也行,这个後来我有找到 01/13 10:19
20F:→ chucheng:应该是NP-HARD的....囧 01/13 10:19
22F:推 smi1e:1.dijkstra 2.minimal spanning tree 01/13 16:07
23F:推 smi1e:2 应该是 nlogn, 是要求要 n 吗? 01/13 16:09
24F:推 shaopin:你朋友後来有上吗? 应该就是smi1e说得两个类型没错.. 01/16 14:31