Farewell 武汉!

-
最新日志
最新评论
- 中博网友 发表于《Farewell 武汉!》
- 中博网友 发表于《我的求职日记(三)——关于中兴》
- 泥人张 发表于《【旧文】写给我的22岁生日》
- 喜羊羊。。 发表于《何去何从》
- 退后 发表于《Farewell 武汉!》
存档页
分类
功能
又到生日,重读两年前的文字,谨以自勉。
突然同情起我的同学来,异乡求学,泡浴缸是一件奢侈到荒唐的事。
我泡得正爽。。。
掐指一算已经有7年没有躺在浴缸里洗澡了,如果不是有淋浴出了点毛病,恐怕我还没有机会享受这样的奢侈。
折腾了很久才让不断加进的热水正好补足漏掉的温水。
细水长流。
静静地躺着,任流水轻轻地摇摆。
惬意。
要是有老鹰乐队的I Can’t Tell You Why萦绕于耳畔那该有多好。很惋惜浴室里怎么没放一对音箱。
神游。
蒙蒙雾气中,我仿佛看到了儿时那炫目的烟花,看到了可爱的同桌小女孩,看到了一同欢庆进球的朋友。
我宁愿时间在此刻停滞,让天使带着我的灵魂飞去记忆的每一个角落。
梦之所以美好,因为梦不是真的。
快乐之所以珍贵,因为快乐是短暂的。
终究要说一些没有营养的话。其实在水里泡上2个钟头可不是件舒服的事,出来的时候会像一只浑身打皱的猪崽。这么久无所事事的后果,除了被泡肿的皮肤,还有对3天后面试的焦虑。最近心已经散了,总是没有办法集中精神,对复试真的很茫然。
总是强迫自己去干些苦差事,用一些冠冕堂皇的理由。要证明自己比别人更有资格走向职场,要证明自己仍能在考场的游戏里游刃有余,要证明自己比他人坚强,要证明自己能胜任任何事。事实上每次我给出的答案都是yes,而这样的证明题却周而复始的出现,逼迫我一次次从头再来——就像希腊神话里永远推巨石上山的西绪福斯。
我记得我曾经也做过到美丽的乡下去过一辈子的孩子梦,证明我不是一个追求光鲜外表、奢华生活的人。那我追求的是什么?我也搞不清楚。只知道为了这样的追求我失去了很多泡浴缸的享受——不是没有在浴缸里发呆的时间,而是没有了神游的心。
感到过去的日子很对不起自己。
我想西绪福斯推巨石数十年数百年后也没有心情再问为什么了。我没有选择,我不希望自己证明了这么多年的证明题最终的答案是no。
昨天是22岁生日,对自己说一声对不起,挽起袖子接着推我的巨石。
07.3.24
原文发表于本人q-zone
终于,论文被IEEE Trans. on Image Process.接受。没有想象中的激动,只有接踵而至的头痛。
文章末尾的bio怎么写呢?我是土人,啥头衔都没,学位是本科——硕士在读是不可以写的!结局就是bio只有照片一半高。丑。。。
申请中美联合专利还等着要申请,IEEE Trans. on CSVT的文章还等着要写。啥时候是个尽头啊~
又被建议读博@_@,说是帮我去跟学校交涉,我去年连洋博士都没答应难道要求人去当土博士?你咋不直接把学位给我?
终究是个有意义的日子,09.01.28,记一笔。
腾讯的事情黄了之后,有些紧张起来,又猛投了几份简历,把什么移动、电信、银行啥的都投了,现在要摆正位置,摆正姿态~~同时,全球经济兵败如山倒,各大公司的招聘计划纷纷缩水甚至取消,求职大军更是人人自危。我也愈发为腾讯的事情而懊恼。

10月22,接到一北京打来的电话。中兴?我没投中兴啊?您咋知道俺电话的?...应该说,是中兴的电话把我从错过腾讯的懊恼中拉出来。况且,既然都找上门了,那我们就去一趟吧。
10月23,笔试,实在没印象了,反正不难。
10.25
赶场的一天——平安IT,阿尔卡特朗讯,EMC,中兴
昨天晚上被叫去听平安IT的宣讲,来宣讲的工作人员,帅的帅,美的美,不帅不美的起码看起来也是人模狗样的,和我们就是不一样~填了份申请表,长见识了。。项目经历就细细的一条,怎么也塞不下。倒是高半夜凉初透考成绩占了老大一块,高半夜凉初透考总分多少?哪门最高?哪门最低?最高多少?最低多少?大学最喜欢的2门课?各多少分?最不喜欢的2门课?多少分?3个最重要的优点?3个最值得改进的地方?。。。崩溃了。NND,原来中国平安都是这么玩的!其实我也没啥诚意,就是想长长见识,结果今天凌晨收到短信让我今天早上11点去汉口招行大厦笔试。苍天啊!我简述一下明天的行程:上午10点,阿尔卡特朗讯笔试;11点,平安IT机试;下午2点,EMC笔试;5点半,中兴一面。蹦噔儿你个蹦噔儿哦,平安IT不去了!找中兴要求推迟到7点,HR说行,但是可能会等很久——后来我发现这个“很久”指的是2个多小时!shit!
上午阿朗,我投的APD软件工程师,笔试不难,C/C++,数据结构,数据库,考得都很基础,只是全英文答卷会刷掉一批牛人。好笑的是,今天之后阿朗就杳无音信了,据说是北京裁人裁得上吐下泻,绕眼子!作为国内市场上四大通信公司中唯一有美企背景的阿朗北京,起薪确实是最高的,但是一个年年亏损的公司,怎么和华为这头疯狼比?
中午很累,小睡了20分钟去EMC笔试。厚厚的一沓纸,难怪考试时间3个小时!试卷分为客观题+主观题两部分,全英文,变半夜凉初透态的是,客观题对一题得四分,错一题扣一分,不答得0分;客观题电脑阅卷,分数不够的就不看主观题了。3个小时,紧赶慢赶竟也做不完,客观题中很多关于存储、硬件和OO编程的问题,一路凶险,还好还有20来道智力题,我就这些智力题最有把握了。好容易到了主观题,又是三道大编程,做了一题半,时间不够了,颓然交卷。
看来确实不符合EMC的要求,郁闷,打了两个电话聊了会天,士气低落地去坐上了去帅府的车,这时,已经6点了。
10.25晚
中兴一面——帅府酒店
一路堵得惊天地泣鬼神,到帅府的时候已经7点半了。穿过一大群pp的酒店小姐,到会议室登记,桌上摆着厚厚的一摞学生证排着队,竟有人拿学位证排队-_-||。
等。。。一小时。。两小时。。其间送过两次小蛋糕,否则我怀疑有人会饿昏。要不是觉得自己极度缺乏面试经验,我一定会不耐烦走了。
等了两个多小时,终于轮到我了——已经9点40,算是藐视他们的代价吧。面试是1v2,两个面试官,听文雅。又是自我介绍,又是吹项目。由于腾讯的经验,我竭力保持低调,一切安好。
没想到晚节不保。。。
他们问,“你期望的工作地点在哪?”我本无诚意,因此说无所谓啊,我不在乎工作地点,关键是希望去你们做视频最出色的部门。
“那视频主要在三亚咧。”
……
……
雷倒了!!!本人面试生涯中的唯一一次手足无措发生了,5秒钟后,“恩…这个这个,这个没想到啊…我对工作地点确实没太多要求,不过这个这个,太偏了的地方我还是得多考虑一下……”
对方笑…
又问“你还向其他公司投了简历吗?”
“当然是有的啊,”我想说几个得体的,“今天才笔试了EMC,唉,专业的关系,没什么希望;”——所谓已无威胁;“华为也投了,不过他们来得晚,那当然就选择中兴了。”——所谓睁眼说瞎话。“另外。。微软的笔试我也参加了,但是微软当然只是碰碰运气,谁能赌在微软上呢?”——所谓不在同一水平线上。
很快就意识到失言了,既然投了微软,那么地位介于微软和中兴之间的公司怎么会不投呢?见鬼。。
果然,扯了两句,两人就站起身,向我伸出手,“谢谢你来应聘我们中兴。”我靠这种话都出来了!伤心啊!!
微笑握手之后,离开酒店。奇怪的是,出来之后心情倒不怎么糟。只要每次面试都有所收获,我就满足了。
10.27
中兴二面——帅府酒店
昨晚在酒桌上还大倒苦水,一下来竟接到中兴的二面通知。Amazing!
下午再去帅府,居然没等就直接去了面试官的房间。又是1v2,感觉这回的俩人没上次和善。又是自我介绍,然后等他们出招。到目前遇到的最大的挑战是什么?怎么成功的?最大的失败呢?有没有做过项目负责人?怎么领佳节又重阳导团队的?你的性格中哪些对团队协作不利的因素?
一路走得比较顺,他们又问,“你挑选公司的准则是什么?”
“最重要的一条,行业领先。”我一边说一边考虑下面几条是什么,“只有在行业领先的公司才能提供广阔的发展平台……第二条,我在公司能够发挥出自己的价值;第三,我的工作得到公司的认可。”
“如果,你来了我们中兴之后,发现我们并不是行业领先,你会怎么办?”
靠,刁难我。“既然我来了,当然就要考虑其它各方面因素,比如公司是否认可我等等。”
“上司也不认可你。”
@#@$$%#$%&!!!是你们先惹我的,“我想那我会选择离开。当然,我首先会尊重合同,完成合约年限。。”
“合同一签就是3年咧。”
“这没关系,既然中兴是这样的公司,我想我也没有必要为这样的雇主投入太多的精力,每天只需要应付应付,然后通过我在国外的关系和业内的朋友,做一些真正有意义的事。”
此话一出,俩面试官盯着我看了会儿没说话,一个面无表情,另一个微微点了点头。
又有点狂了,罪过罪过~~
稍后继续,“中兴的优势在哪里?劣势在哪里?”
“优势在于,业内领先(昧着良心啊..)……文化上更人性化,这个,关于华为,我们都了解的对吧。。”
“劣势呢?”
“那也很明显嘛。。”汗汗汗!!!话一出口就发现见鬼了,说high了,“不不不,不是说很明显啊!”俩人都笑起来,我接着说,“我们也知道起薪并非那么重要,但是毕业生对薪水毕竟是有一个非常明确的排位的……”
“你对工作地点有什么要求呢?”
“我对工作地点也不是很挑,只要不是太偏都是可以的。”
“北京和上海的户口问题都很难解决的,你了解吧。”
“我知道,听说北京非常难,上海通过打分还是有机会的,是吗?那我想只要上海有机会,我就能靠自己的能力去争取。”
这时,刚刚那个点头的人摇了摇头。咋?不看好我么。。
“我们给offer你会不会马上签?”
“签哪!”我自己都觉得声音有点奇怪,“我长这么大都没见过offer长什么样啊!”
“如果几天后我们给offer,而你正在等一个业内更有地位的公司,你会怎么办?”
苍天啊,我是一实诚人,不喜欢说这么多谎话,“自己的第一份工作,我想谁都不会仓促地下决定。我相信这需要对各家公司的行业地位、录用的机会以及时间安排等做一个全面的评估,才能做出一个合理的选择。比如微软,我参加了他的笔试,后面还有很多轮面试,那么如果中兴过两天给offer的话,我肯定不会一直为微软等下去啦。”唉,越描越黑。。
后来又问了问对这次招聘的意见,两人就站起身和我握手,又说“谢谢你来应聘我们中兴。”上次这话吓了我一跳。
下一环节是英语面,纯粹是绕眼子。6人一组,到一房间去,每个人问一道题,说一分钟,完事。我把问题列一下。
"Please describe your education ground."
"Please describe your biggest advantage."
"What book are you reading recently?"
"Please describe your hometown."
"Do you have boyfriends?Introduce him to us." (汗,那女孩能有几个男友?)
"Who's your favourate pop star? Introduce him to us."
离开帅府的时候,接到华为的短信,大约是说我们马上就来了,敬请关注。呵呵,他们肯定是知道中兴快要签约了,赶紧给我们捎个信,“别慌别慌,我们来了”。
今天貌似又太高调了。伤疤还没好呢,就忘了疼。。。
11.1
处半夜凉初透女霸王面——marvell——珞珈山国际酒店
处半夜凉初透女offer——中兴——帅府酒店
昨天中兴通知我今天去签约,我说好谢谢,做戏做全套,去看看签约还有啥学问。
后来碰到李荣,他问我投了marvell没?我说没。看了看,他招Video System R&D的工程师而且待遇相当好哦。我问还能投吗,李荣说“昨天宣讲现场投简历,今天都面试了一天了。”NND,错过了么?决定去霸王。
早上9点到珞珈山国际酒店,这是中兴约我签约的时间-_-||。跟接待人员说明来意,对方马上说不行。软磨硬施,“把房间号给我吧,我自己去找HR。”——不行。“把电话告诉我吧!”——不行。最后终于被我诚意打动了,说你自己上8楼去逛吧。
说声谢谢上楼。又碰到俩接待,又说不行。说什么“我们面试官的时间从现在到晚上6点已经安排满了,只安排了20学生。”再次软磨硬施,NND俺啥时候受过这种气!
最后我说,“这样,你们把我的简历拿去给HR看,如果你们认为只是一份一般的简历,不值得一试,我马上就走。”他们终于答应拿去问。
过了一会儿,他们回来说,“HR认为方向上不太一致,需要你和我们的技术官谈谈。”
然后我遇到了迄今为止最牛叉的面试官(到底是高级技术官,就是不一样,后来知道他是清华电信系毕业的),40岁的样子,微胖,很有派。上来就笑着说怎么这么晚才过来,我小心解释。然后聊项目,很显然,他不是视频编码的,问的问题却都很有水平,很快就问出了我的设计的关键点。
介绍算法的的时候,我习惯性地说,能不能给我一张纸,我画一画。他笑着说“没有纸,你就这样说给我听。”
汗,你牛!
后来在聊一些技术问题的时候,我添油加醋地说了些目前的背景情况,为了表现我对这个行业深入而广泛的了解。被打断,“注意,我的问题是……”
彻底蔫了,老老实实地像个学生一样回答他的问题。
……
他一边聊一边在本子上记,20分钟后他说,好吧,我会把你的信息交给做视频的同事,他们会和你联系。
向他道谢后离开酒店。感觉今天状态不佳,说话也不像以前那么流利了,也没有了那种一切尽在掌握的自信。或许是敌强我弱的道理吧,败给他了。想想腾讯,这未必不是件好事。
11点来到帅府,走进一个签约的房间,遇到一中年女人(典型的职场女性打扮),我说抱歉,有点事耽误了。然后她就要我签,这么快?!我半天没动,想跟她聊聊。确认了一下薪水,约6k;工作地点,只剩南京、西安、深圳了?我说地点无所谓你们还真就不留个好的了呀。我问,还有什么可以了解的吗?她说没了。我就是不肯动笔,又找话聊,说了一会儿,她说我看你还要考虑一下,你回去和家人商量一下吧。
。。。被看出没诚意了~~悻悻离开。
于是我的第一份offer就这样被放弃了。
通过这几天接触,我发现中兴招聘团队很有礼仪,也真切的感到他们对人才的尊重。可惜中兴不是能让人薄雾浓云愁永昼大展拳脚的地方。不过他们的诚意也打动了不少我们系的研究生,希望他们和中兴好运。
(待续。。。)
关于腾讯的故事,后来竟荣登本人08年度最心痛的事件之首。
10.13
处半夜凉初透女面——腾讯——珞珈山国际酒店
凌晨一点接到腾讯电话,约我当天中午11:50去珞珈山国际酒店一面。靠,俺的处半夜凉初透女面居然是周亮帮搞上的,刚刚还在说唉肯定挂了你别指望了;现在马上拽起来,说什么算法题不会,基础还是蛮扎实的。-_-||
睡到自然醒,遇到点事耽误了会儿,发现时间不够,打的去酒店。到了一看,小破会议室被挤爆了,全是等待安排面试的人,预约在早上10点的等到现在还没安排,这都什么呀,立刻心生鄙夷,到底是小公司。。。不过虽然是练手,毕竟是处半夜凉初透女面,耐着性子等,但最终还是有点快控制不住音量,终于给我重新安排在下午两点239客房。
吃了饭再去,拿了申请表去找面试官。申请表后面是附带试卷的,我一看倒吸了一口凉气,18分,三道大题几乎都空着,难怪周亮说考挂了。至于qq为什么会让一个18分的人来面试,不得而知。面试官正在和一个投都快秃了的candidate谈,一看就是一博士,搞不好孩子都有了。早上和人聊天的时候才发现我这职位是只招博士的,当时没注意要求就投了,运气不错,没被学历卡死。
等了半个多小时那位博士大哥才出来,我终于进去。面试官30岁的样子,很文雅,说话也很nice,给人印象不错。先给我两道C语言题让写结果,看了看,这我研究过,很快写完,讲过程(幸好讲了过程,一出酒店就发现犯了小错误~~结果是错滴)。面试官当然不管你对不对都不动声色,开始聊别的。一讲到项目,俺那个心气噌就上来了——正好今天早上来酒店的时候收到消息,我TIP论文已经修回,又有得吹了。果然吹得那面试官晕晕乎乎的,又问为什么有美国大学邀请不去,扯了两句我的理想,最后说“如果是Stanford,我就去了嘛。”他笑起来。
然后又问了几道题,一道是要设计一个数据结构,保存一副牌,能够高效地找到缺3张的一副牌缺的是那三张。想了想,给了一个时间O(n)算法,他似乎对空间复杂度不太满意,再想,给出的方法越来越离谱。
换下一题,如何判断一个极大的数是否Fibonacci数。苦想,只能说我记得有个Fibonacci数的近似公式。结果他也说他也不知道什么数学上的有效办法,只需要一种思路即可,比如首先把Fibonacci数列存到一个列表,直接在里面找就行了,我汗哪,这也叫思路?!老大您不说一极大的数么?!
真正郁闷的是问C/C++基础,什么静态函数啊,STL库啊,内联函数的坏处啊,少数能答,常常出现这样的状况:
"这个知道吗?"
"嗯。。记不得了。"
"不要紧。那这个呢?"
"。。。不了解。。"
"不要紧。这个呢?"
"。。。"
总的来说,高开低走,中途郁闷得不行,还好最后回答了2个算法又拉出有一小阳线。终于,面试官站起来说,"还是很不错的。那我们今天就到这里了,如果有消息我们会在两天内通知您。"
听得我心里直发凉,没事您说啥"还是很不错的"?这不是安慰我吗?强笑着站起来和他握手,离开。
结束了40多分钟处半夜凉初透女面,赶回华工参加TI的笔试,迟到了,打开卷子,果然消息无误,全是模电选择题,干脆连题目都不看,直接瞎写选项,瞬间搞定,闪人。唉,当初投错了,AFAA里面还有analog这个词,咋就没注意呢,瞎投!
10.16
二面之前的唧唧歪歪——
关于腾讯,身边的朋友貌似我意见比较一致,公司太小,一听就不专业。而且我一说我投的腾讯研究院,多半反应都是,腾讯还搞研究?因此我坚定地认为签腾讯不如签华为,可是一面被拒也太丑了吧!可我的表现确实不令人信服,不知道我的学术成果到底能加多少分,心里打鼓。
接到二面通知的时候竟有些许激动!看来虽然软件理论不行,靠忽悠也能征服面试官!上网查了查,这个岗位二面的只剩7个人了,自信心爆膨。坐车的时候想了想明天可能会聊的问题,想着想着为它想出一套从网络业务拓展到无线通信业务的方案。整理一下思路,简直是为腾讯量身定做的!今天有点亢奋,呵呵~~不过有了这套策划方案,确实底气十足了。
又得到一些消息,关于腾讯的薪水:
创意策划:9-10万/年
软件开发:11-13万/年
研究院: 16万起
必须承认,腾讯研究院的薪水,有点吸引力。。
10.16
腾讯二面——珞珈山国际酒店
7个二面的人里面,我是第一个。早起9点到酒店,去838房间——副总级的人果然住的高。。敲门进去,一胖子坐在里面,怎么看也不像副总啊,呃。。
再次自我介绍,又吹了吹项目,学术成果,很放松。又被问为什么不出国,重复昨天的故事,那人还是苦瓜脸。没办法,我只能拼命保持微笑。他突然漠然地说,其实出国是一个很好的选择。然后聊了些关于为人处世、领佳节又重阳导项目团队方面的事情。我给自己塑造了一个优秀、自信的形象,又从技术角度吹了一下他们公司,今天状态奇佳,说话都不带打结的~~而且全程都没问技术,很开心。
他突然开始翻我的申请表,翻到笔试卷那一张,赫然一个18分!心里一紧,大脑飞速运转,生怕待会被问考题露出破绽。为了维护本人的优秀形象,几秒钟内做了一重要决定,赌一把,自己先说!
“有件事我要先confess,这个笔试不是我做的。。。”
他抬头看我。
解释了一下我当时在上海,唯有叫朋友帮我来考云云。就这件事又小聊了一会儿。
“我想如果我是来考的话,算法题应该不至于做成这样吧。我朋友那天好像也迟到了,不然他应该能做得更好。(这是真的)”不放心,接着解释,“我想,对腾讯这样的公司,我不能放弃这样的机会。既然都有人霸王面,我想腾讯能理解我的决定。”
看到他面无表情地点点头,悬着的心终于落下来。
闲聊之后他又问,“如果我要你调查你们学校周围小餐馆的营业利润,你会怎么做?”
我说我考虑一会,为了显示俺思维敏捷,只过了10秒就开始回答,
“我想处理这样的问题需要注意这样一点,大学校园周边的小商户对可能的竞争者都是很警惕的,因此我们需要派不同的人手去多家餐馆,在短期内调查清楚。”
“在收入方面,因为华工周围餐馆的人均消费也就在10-20元,过高和过低的消费都是小概率事件。我们只需要在餐馆呆上一天,统计一下人流量就好了。”
“支出方面,小商户不是都喜欢抱怨么,去餐馆吃一顿,和老板聊聊,他们多半会抱怨费用高之类的,你很有可能打听到大致的水电费指出,做菜成本;和店员聊一聊,了解一下他们的收入。综合起来,支出也就差不多了。”
他又简单问了两句,这题就算完了。
我一直在等他问我对腾讯有什么建议或者对QQLive的看法,我好高谈阔论一下我为你们量身定做的战略方案。居然连沾边的都没问,郁闷。。难道要自己挑起话题?我突然又做了一个重要决定——今天应该问题不大,方案这次就不说了,留着3面再说,不是说腾讯最后一面可以谈价么?
意外的是,不久他就说,“那好,今天就到这里吧,如果有消息的话,我们会在两天内通知你。”
才25分钟啊!这是直接过关还是直接挂掉?!!!
带着疑惑离开了酒店。今天自我感觉良好,我认为是直接过关。
10.19
我为什么会被一家自己看不上的公司拒掉?——
一般来说,进入三面的人基本上能拿到offer。可是3天过去了,同去的一个博士三面都搞完了,我却还没消息。如果是一面被拒,可以理解,可是二面???有点不相信。难道是因为手机连续关了2天机?不可能,如果公司确实想要你,一定会想办法联系到你的。
渐渐开始接受二面被淘汰的现实,冷静地回忆当时的过程,发现当时确实被亢奋的情绪冲昏了头,犯了一些很严重的错误。
1. 自己承认笔试是由别人代玉枕纱厨考,这是一招险棋。我认为腾讯既然愿意破格让我这个硕士进二面,应该就不会太在意小节;我认为既然我敢于承认,就不存在诚信的问题;我认为只有保持全面优秀的形象,才能赚足印象分,拿到好offer;我认为他可能会问关于笔试的问题,一旦我露出破绽就全完了。然而这些认为都是想当然。如果我能注意到这个面试官是一个颇为严肃甚至有些古板的人,或许不会这样想当然,或许结果就将不一样。
为什么我会去冒这个险呢?我的理想是去一家国际级的外企,去体会去学习跨国公司的管理和文化,而腾讯的规模和实力,不能给我这些。因此对腾讯,我不只希望赢,还希望赢得漂亮。即使是栽了,也情愿承担后果。结果是,我栽了。
2. 也不知为什么,我今年的面试都是走的高调路线。这招时而管用,时而失灵。自信没有错,而不分对像地表现自信却很不聪明。面前这个从头到尾都面无表情的内向高管(I doubt that..可能是个技术骨干),很可能把我的自信看成狂妄。
3. 在回答为什么不愿出国读书的时候,有点扯开了的我不知怎么就讲了“我本来连硕士都不打算读的。。。”我大约是为了为了表现我敢于面对社会,愿意接受挑战,却忽略了面前这个人的背景,他已经说了他支持出国读博,而且极可能是高学历,我却说自己连硕士都不打算读,实在是犯傻。我应聘的是研究院,学历在这里的重要性是远高于一般公司的,不合时宜地突出自己的个性让我付出了代价。
4. 我的信心很大程度上来自于我为腾讯设计的视频业务策划方案,而当我由于过于乐观选择下次面试再说的时候,就失去了一个重要的筹码,那我拿什么和那些博士们竞争?我的自信和高调都变得没有道理。现在想起来,真要为自己考虑问题不周详扼腕叹息。
被自己没看上的公司拒了,心情很糟糕。特别是几天后我发现腾讯的虽然规模不大,实力却不弱,据说它的价值比新浪、搜狐、网易的市值加起来还大,这简直让我肠子都悔青了。事实上我列举的1234都是技术上的,关键问题在于我不想去腾讯。我毫无顾忌地拉高姿态,频出险招,这样,不要说腾讯了,即使是迅雷、PPLive之流也不想要我吧。如果说我确实不在乎,fine,可是现在我在乎了,我想去了,却没有了机会。
有朋友劝我再去走腾讯的社招路线,我说算了。这就当是给自己上了一课吧,昂起头,接着去找理想中的外企。
。。。(待续)
随着昨晚在IEEE Manucript Central上按下sumbit按钮,偶的地狱生活终于告一段落。
事实上,每天熬到4点对我来讲不是问题,真正让人精神恍惚的是求职的压力。我们这一届学生真有福气,中考改制、高半夜凉初透考非典、研究生缩招,本科求职碰到两届研究生和我们抢,好容易读到硕士,一场金融危机又卷走了多少饭碗。到今天已经折腾了快3个月,才拿到3个offer,中兴、华为、诺基亚-西门子,真是罪过~~
我根据手机上的电话和短信来回忆这个阶段的求职故事,虽然不算成功,倒算是一段很有意思的经历。希望过两天当我翻身杀回求职大军的时候,能够一帆风顺,拿到shining的offer。
九月初的故事,主要就是写简历,搞网申,前面的日志有讲。据不完全统计,这段时间投了20多家,也奢望过高盛、瑞银之类,在他们招聘网上转了一圈,自惭,决定不投了——幸好没投。
9.16
宣讲处子秀——SONY——华工大学生活动中心513
人山人海,挤得人汗如雨下,站着听了2个钟头,极其不值,无非是自吹自擂,中国人日本人轮着上,那日本人英语一出,全场哗然,喊娘也听不懂,最后上来一华工校友给我们吹索尼日本是多么多么好,就是打死不提薪水。
——我此后还参加宣讲近十场,基本上都是这个调调,巨无聊。最贱的是,后面还有公司来作秀的时候首先把话堵死,说什么有同学总是只关心工资,这是不对的。。@@XX@@XX。我们“只关心”了吗?你他妈就不能回答了薪水再来教育我们!
同一天拿到优秀研究生,赶紧改简历,缺的就是这个。
9.24
笔试处子秀——百度——华工管理学院报告厅 & 西12楼。
提前一个小时去听宣讲,门外排队已经沿着管院大楼绕了几个弯,一开门报告厅瞬间挤满,抢不赢那些疯狂的人们,又站着听了一个钟头,李彦宏扯蛋的水平不高,不过说话很实在。忽然接到战友电话说你再不来西12笔试就没位置了,赶紧退场,杀去西12楼候着。笔试考场人挤人挨着坐,也不怕你抄。我考的Windows软件工程师,无限BT,就三道大编程题,——一道ms是检索还是啥,忘了。。一道有时间/空间复杂度都有要求的排序,一道海量数据处理。连蒙带混,反正写满了。不是偶的专长,做得不好,但对自己简历颇有自信,觉得还有戏。
9.25 ~ 10.7
等待。。。
这段日子不少小公司已经在面试了。看着身边的人一个个陆续去笔试面试,我却多日无事。当初确有要拿一帮小公司练手的计划的,只是看了这些闻所未闻的名字,实在没兴趣投简历。于是只是日复一日地关注着求职网,修改着简历。盯着Nvidia、TI一票名企的笔试通知函发呆。
恭喜炼钢,拿下百度,直接步入高薪阶层~~ ——俺呢。。对形势估计有误,这回是海笔,谁都能来考,但是只看笔试成绩,而除了内推的人,笔试挂了就挂了。。。!!!
10.8 ~ 10.11
旅途——上海
今年求职的早期阶段,我的注意力几乎都在Nvidia身上,无视了许多不错的公司。NV在显卡市场上的地位,足以让我们做image的硕士为之心动。除了它是一家硬件公司,软件研发人才比例偏小,NV可以说是一个很完美的选择。因此,我去了登上了去上海的火车。
上海的故事在上一篇日志里专门讲了~~
在上海接到三家公司通知笔试——微软、腾讯、迅雷。微软的电话让我差点要定飞机票赶回来(所幸正好还有笔试前4小时抵汉的火车)。迅雷简直是儿戏,笔试通知既没有电话,也没有邮件,居然是半夜三点半发到华工bbs上,你大爷的!所以我直到12号晚上才知道错过了迅雷的笔试。算了反正我也不可能去迅雷。而对腾讯,我的态度是——发展不错的小公司,拿来练手就好,10.11下午笔试,放弃又可惜,叫人代玉枕纱厨考好了。
10.11上午,Nvidia笔试,再次考得一头雾水。图像架构师为什么一点图像都不考?!全是C++,STL基本知识,再次连蒙带混,心里空荡荡地出来。赶紧联系周导,帮俺去考下午的腾讯笔试,一番周折让他拿到我留在武汉接通知短信的手机,作为身份凭证。安排妥当,在上海逛了一下午,赶火车返汉。
10.12
微软笔试——华工南六楼机房
下火车,回家,洗澡,喝咖啡,杀往华工。微软笔试,号称机试,开始了却发生网络瘫痪,磨了半个小时,终于发卷子,开考。绕眼子!微软的考试考的更多的是算法和智力,做得终于没那么郁闷。
后来发现这场笔试真的是绕眼子,我投的微软亚洲研究院,1个多月后才知道,亚研今年只招3个人,那都是中国最优秀的博士,竞争者中还有一个是张宏江的学生。。。难怪海容听说我投的不是工程院表情是那么不解,您咋不早说研究院只招三个人咧?
10.13
腾讯一面——珞珈山国际酒店
关于腾讯的故事,后来竟荣登本人08年度最心痛的事件之首!
。。。(待续)
从上海回来之后一直没能闲下来,笔试面试接踵而至,整得人精神崩溃。趁在同学家里闲着,记录一下这趟的行程。手机拍的,将就一哈。
拎着一大袋大汉口热干面,踏上了上海的征途——NVIDIA,我来了。10.9早上7点抵沪,半睡半醒之间,摸索到去复旦的路。复旦校园很人文,很淡雅,汗的是正门前方也学华工竖了一巨大的老莫道不消魂毛塑像。

找到了NV笔试的考场,第三教学楼209,深情地望了一眼,留个饭碗给我吧!
看了考场去交大,忒远了,做了一趟7块钱的地铁,还转了两次公交。上海的两所名校也是这样,复旦在市区,交大主要在乡下,跑一趟接近2个钟头。
交大的正门让人看了一头雾水,就是一人字拖结构,都不好意思拍下来。这是凯旋门和。。。不知道叫什么,他们说是叫衙门。


终于见到久违的小胖,还是那么可爱,请我吃了顿饭(其实这趟顿顿都是他请的
),去他们宿舍。把热干面给他,看来他更期待鸭脖子,我说下次一定带——如果NV让我有下次的话。
交大很漂亮,放眼望去,大片大片的绿地,大片大片的湖水,视野无限开阔。不像华工,放眼望去,大颗大颗的脑袋,除了人就是房子,能见距离平均不超过百米。小胖说,交大的校车是免费的,定点还有免费去地铁站的班车。跟我们那上车两块搞不好还得坐后架上的校车比那简直就是共人比黄花瘦产主义啊。




来到他们寝室,进门一大客厅。四间卧房,两人一间。小胖问我要不要先洗个澡,我说好,然后去了淋浴,插卡,热水,我那个感动啊!彻底被征服了!真为当初没选择交大痛心疾首!!如果给华工打60分的话,交大可以打90,扣10分是因为这里的女生问题比华工还严重!

在交大转了一天,这里的求职气氛似乎远不如华工这边浓,似乎这边学生都不怎么着急。10号在饮水思源上看到有人问,微软怎么还没出笔试名单啊,12号就要笔了啊。心中一颤,赶紧上JoinMS看看,发现自己简历状态已经成了“安排笔试”,一顿开心。不过也没说具体时间,在武汉求职群问了问,没消息。想想没事笔试至少会提前3天通知吧,那是我已经回武汉了。傍晚接到电话,确认是我之后,“恭喜您。。。”我一听都这三个字,心里那个拔凉拔凉的啊。会在今天通知我的只可能是微软。。。果然,微软让我12号中午12:50去华工南六楼笔试。问是否可以调整时间,否定;瞬间崩溃,记下笔试注意事项后茫然挂上电话。突然惊醒,开始找人求救,远在东南大学的大师兄也打电话过来询问,帮忙查了飞机票,多谢。最后在周亮和小胖的努力下总算订到了12号上午7点抵汉的直达车票,退了13号的,终于安心。
11号,偶等的就是这一天。早上小胖用自行车载我到地铁站——小胖真是太好了——和他告别后杀去复旦。考前半小时门口已经挤满了人,NVIDIA果然吸引力巨大。10:00,抽了一罐咖啡,开战。看了卷子,感觉不好,Graphic Architect笔试居然一道图像都不考!全是很偏的C++和一头雾水的技术题,连蒙带混忽悠完,还好有一道智力题是我做过的,就这题稳拿下,可惜只占10%。

笔试出来。还有10个小时上火车,在上海逛一逛,十多年没来了。。。
虹口体育场,李玮峰就是从这里来的!

上海博物馆,在门口屁颠屁颠拍了半天,才发现是后门。

求遍天下卧佛,拿遍天下offer!

花旗正在招聘呢。

妈的上海博物馆5层楼,走死我了。出来时已经5点,还有自然博物馆,城市规划展览馆,美术馆都去不成了,只能到外滩去转转,然后去等火车。
毕竟不能免俗,还是要拍个东方明珠。

上海这一行,由于有小胖帮忙,只花了800块——投资也相当大了!拜托产出个offer吧!我不想这一行成为我人生的一场笑话。耶和华,释迦牟尼,张天师,显个灵成不?
说说上海,上海果然有点国际大都市的样子了,外滩的大酒店的确算得上奢华,可惜我对都市格调不感冒。当浮华还是浮华,他就是属于别人的浮华;当这样的浮华变成了拖鞋睡袍,他才是属于你的,但是那时它对你还有吸引力么?
不过这个城市的生活节奏很适合我,就像地铁站里急匆匆的脚步,如果我错过了什么,老了再补吧。
好文共赏。
【作者: 恋花蝶】
声明:本文最初发表于《电脑编程技巧与维护》2006年第5期,版本所有,如蒙转载,敬请连此声明一起转载,否则追究侵权责任。网上发表于恋花蝶的博客http://lanphaday.bokee.com
从一道笔试题谈算法优化
引子
每年十一月各大IT公司都不约而同、争后恐后地到各大高校进行全国巡回招聘。与此同时,网上也开始出现大量笔试面试题;网上流传的题目往往都很精巧,既能让考查基础知识,又在平淡中隐含了广阔的天地供优秀学生驰骋。
这两天在网上淘到一道笔试题目(注1),虽然真假未知,但的确是道好题,题目如下:
从10亿个浮点数中找出最大的1万个。
这是一道似易实难的题目,一般同学最容易中的陷阱就是没有重视这个“亿”字。因为有10亿个单精度浮点数元素的数组在32位平台上已经达到3.7GB之巨,在常见计算机平台(如Win32)上声明一个这样的数组将导致堆栈溢出。正确的解决方法是分治法,比如每次处理100万个数,然后再综合起来。不过这不是本文要讨论的主旨,所以本文把上题的10亿改为1亿,把浮点数改为整数,这样可以直接地完成这个问题,有利于清晰地讨论相关算法的优化(注2)。
不假思索
拿到这道题,马上就会想到的方法是建立一个数组把1亿个数装起来,然后用for循环遍历这个数组,找出最大的1万个数来。原因很简单,因为如果要找出最大的那个数,就是这样解决的;而找最大的1万个数,只是重复1万遍而已。
template< class T >
void solution_1( T BigArr[], T ResArr[] )
{
for( int i = 0; i < RES_ARR_SIZE; ++i )
{
int idx = i;
for( int j = i+1; j < BIG_ARR_SIZE; ++j )
{
if( BigArr[j] > BigArr[idx] )
idx = j;
}
ResArr[i] = BigArr[idx];
std::swap( BigArr[idx], BigArr[i] );
}
}
设BIG_ARR_SIZE = 1亿,RES_ARR_SIZE = 1万,运行以上算法已经超过40分钟(注3),远远超过我们的可接受范围。
稍作思考
从上面的代码可以看出跟SelectSort算法的核心代码是一样的。因为SelectSort是一个O(n^2)的算法(solution_1的时间复杂度为O(n*m),因为solution_1没有将整个大数组全部排序),而我们又知道排序算法可以优化到O(nlogn),那们是否可以从这方面入手使用更快的排序算法如MergeSor、QuickSort呢?但这些算法都不具备从大至小选择最大的N个数的功能,因此只有将1亿个数按从大到小用 QuickSort排序,然后提取最前面的1万个。
template< class T, class I >
void solution_2( T BigArr[], T ResArr[] )
{
std::sort( BigArr, BigArr + BIG_ARR_SIZE, std::greater_equal() );
memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );
}
因为STL里的sort算法使用的是QuickSort,在这里直接拿来用了,是因为不想写一个写一个众人皆知的QuickSort代码来占篇幅(而且STL的sort高度优化、速度快)。
对solution_2进行测试,运行时间是32秒,约为solution_1的1.5%的时间,已经取得了几何数量级的进展。
深入思考
压抑住兴奋回头再仔细看看solution_2,你将发现一个大问题,那就是在solution_2里所有的元素都排序了!而事实上只需找出最大的1万个即可,我们不是做了很多无用功吗?应该怎么样来消除这些无用功?
如果你一时没有头绪,那就让我慢慢引导你。首先,发掘一个事实:如果这个大数组本身已经按从大到小有序,那么数组的前1万个元素就是结果;然后,可以假设这个大数组已经从大到小有序,并将前1万个元素放到结果数组;再次,事实上这结果数组里放的未必是最大的一万个,因此需要将前1万个数字后续的元素跟结果数组的最小的元素比较,如果所有后续的元素都比结果数组的最小元素还小,那结果数组就是想要的结果,如果某一后续的元素比结果数组的最小元素大,那就用它替换结果数组里最小的数字;最后,遍历完大数组,得到的结果数组就是想要的结果了。
template< class T >
void solution_3( T BigArr[], T ResArr[] )
{
//取最前面的一万个
memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );
//标记是否发生过交换
bool bExchanged = true;
//遍历后续的元素
for( int i = RES_ARR_SIZE; i < BIG_ARR_SIZE; ++i )
{
int idx;
//如果上一轮发生过交换
if( bExchanged )
{
//找出ResArr中最小的元素
int j;
for( idx = 0, j = 1; j < RES_ARR_SIZE; ++j )
{
if( ResArr[idx] > ResArr[j] )
idx = j;
}
}
//这个后续元素比ResArr中最小的元素大,则替换。
if( BigArr[i] > ResArr[idx] )
{
bExchanged = true;
ResArr[idx] = BigArr[i];
}
else
bExchanged = false;
}
}
上面的代码使用了一个布尔变量bExchanged标记是否发生过交换,这是一个前文没有谈到的优化手段——用以标记元素交换的状态,可以大大减少查找 ResArr中最小元素的次数。也对solution_3进行测试一下,结果用时2.0秒左右(不使用bExchanged则高达32分钟),远小于 solution_2的用时。
深思熟虑
在进入下一步优化之前,分析一下solution_3的成功之处。第一、solution_3的算法只遍历大数组一次,即它是一个O(n)的算法,而 solution_1是O(n*m)的算法,solution_2是O(nlogn)的算法,可见它在本质上有着天然的优越性;第二、在 solution_3中引入了bExchanged这一标志变量,从测试数据可见引入bExchanged减少了约99.99%的时间,这是一个非常大的成功。
上面这段话绝非仅仅说明了solution_3的优点,更重要的是把solution_3的主要矛盾摆上了桌面——为什么一个O(n)的算法效率会跟O (n*m)的算法差不多(不使用bExchanged)?为什么使用了bExchanged能够减少99.99%的时间?带着这两个问题再次审视 solution_3的代码,发现bExchanged的引入实际上减少了如下代码段的执行次数:
for( idx = 0, j = 1; j < RES_ARR_SIZE; ++j )
{
if( ResArr[idx] > ResArr[j] )
idx = j;
}
上面的代码段即是查找ResArr中最小元素的算法,分析它可知这是一个O(n)的算法,到此时就水落石出了!原来虽然solution_3是一个O(n) 的算法,但因为内部使用的查找最小元素的算法也是O(n)的算法,所以就退化为O(n*m)的算法了。难怪不使用bExchanged使用的时间跟 solution_1差不多;这也从反面证明了solution_3被上面的这一代码段导致性能退化。使用了bExchanged之后因为减少了很多查找最小元素的代码段执行,所以能够节省99.99%的时间!
至此可知元凶就是查找最小元素的代码段,但查找最小元素是必不可少的操作,在这个两难的情况下该怎么去优化呢?答案就是保持结果数组(即ResArr)有序,那样的话最小的元素总是最后一个,从而省去查找最小元素的时间,解决上面的问题。但这也引入了一个新的问题:保持数组有序的插入算法的时间复杂度是O (n)的,虽然在这个问题里插入的数次比例较小,但因为基数太大(1亿),这一开销仍然会令本方案得不偿失。
难道就没有办法了吗?记得小学解应用题时老师教导过我们如果解题没有思路,那就多读几遍题目。再次审题,注意到题目并没有要求找到的最大的1万个数要有序(注4),这意味着可以通过如下算法来解决:
1) 将BigArr的前1万个元素复制到ResArr并用QuickSort使ResArr有序,并定义变量MinElemIdx保存最小元素的索引,并定义变量ZoneBeginIdx保存可能发生交换的区域的最小索引;
2) 遍历BigArr其它的元素,如果某一元素比ResArr最小元素小,则将ResArr中MinElemIdx指向的元素替换,如果ZoneBeginIdx == MinElemIdx则扩展ZoneBeginIdx;
3) 重新在ZoneBeginIdx至RES_ARR_SIZE元素段中寻找最小元素,并用MinElemIdx保存其它索引;
4) 重复2)直至遍历完所有BigArr的元素。
依上算法,写代码如下:
template< class T, class I >
void solution_4( T BigArr[], T ResArr[] )
{
//取最前面的一万个
memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );
//排序
std::sort( ResArr, ResArr + RES_ARR_SIZE, std::greater_equal() );
//最小元素索引
unsigned int MinElemIdx = RES_ARR_SIZE - 1;
//可能产生交换的区域的最小索引
unsigned int ZoneBeginIdx = MinElemIdx;
//遍历后续的元素
for( unsigned int i = RES_ARR_SIZE; i < BIG_ARR_SIZE; ++i )
{
//这个后续元素比ResArr中最小的元素大,则替换。
if( BigArr[i] > ResArr[MinElemIdx] )
{
ResArr[MinElemIdx] = BigArr[i];
if( MinElemIdx == ZoneBeginIdx )
--ZoneBeginIdx;
//查找最小元素
unsigned int idx = ZoneBeginIdx;
unsigned int j = idx + 1;
for( ; j < RES_ARR_SIZE; ++j )
{
if( ResArr[idx] > ResArr[j] )
idx = j;
}
MinElemIdx = idx;
}
}
}
经过测试,同样情况下solution_4用时约1.8秒,较solution_3效率略高,总算不负一番努力。
苦想冥思
这次优化从solution_4产生的输出来入手。把solution_4的输出写到文件,查看后发现数组基本无序了。这说明在程序运行一定时间后,频繁的替换几乎将原本有序的结果数组全部换血。结果数组被替换的元素越多,查找最小元素要遍历的范围就越大,当被替换的元素个数接近结果数组的大小时, solution_4就退化成solution_3。因为solution_4很快退化也就直接导致它的效率没有本质上的提高。
找出了原因,就应该找出一个解决的办法。通过上面的分析,知道solution_3和solution_4最消耗时间的是查找最小元素这一操作,将它减少(或去除)才有可能从本质上提高效率。这样思路又回到保持结果数组有序这一条老路上来。在上一节我们谈到保持数组有序的插入算法将带来大量的元素移动,频繁的插入操作将使这一方法在效率上得不偿失。有没有办法让元素移动去掉呢?答案也是有的——那就是使用链表。这时新的问题又来了,链表因为是非随机存取数据结构,插入前寻找位置的算法又是O(n)的。解决新的问题的答案是使用AVL树,但AVL树虽然插入和查找都是O(logn),可是需要在插入后进行调整保持平衡,这又是一个耗费大量时间的操作。分析到现在,发现我们像进了迷宫,左冲右突都找不到突破口。
现在请静下来想一想,如果思考结果没有跳出上面这个怪圈,那我不幸地告诉你:你被我误导了。这个故意的误导是要告诫大家:进行算法优化必须时刻保持自己头脑清醒,否则时刻都有可能陷入这样的迷宫当中。现在跳出这个怪圈重新思考,根据前文的分析,可知目标是减少(或去除)查找最小元素的操作次数(或查找时间),途径是让ResArr保持有序,难点在于给ResArr排序太费时。反过来想一想,是否需要时刻保持ResArr有序?答案为否,因为当查找最小元素需要遍历的范围较小时,速度还是很快的,这样就犯不着在每替换一个元素的时候都排序一次,而仅需要在无序元素较多的时候适时地排序即可(即保持查找最小元素要遍历的范围较小)。这个思想有用吗?写代码来测试一下:
template< class T, class I >
void solution_5( T BigArr[], T ResArr[] )
{
//同solution_4,略
//这个后续元素比ResArr中最小的元素大,则替换。
if( BigArr[i] > ResArr[MinElemIdx] )
{
ResArr[MinElemIdx] = BigArr[i];
if( MinElemIdx == ZoneBeginIdx )
--ZoneBeginIdx;
//太多杂乱元素的时候排序
if( ZoneBeginIdx < 9400 )
{
std::sort( ResArr, ResArr + RES_ARR_SIZE, std::greater() );
ZoneBeginIdx = MinElemIdx = RES_ARR_SIZE - 1;
continue;
}
//同solution_4,略
}
代码中的9400是经过试验得出的最好数值,即在有600个元素无序的时候进行一次排序。测试的结果令人惊喜,用时仅400毫秒左右,约为solution_4的五分之一,这也证明了上述思想是正确的。
殚思极虑
脚步永远向前,在取得solution_5这样的成果之后,仍然有必要分析和优化它。对这一看似已经完美的算法进行下一次优化要从哪里着手?这时候要借助于性能剖分工具了,常用的有Intel的VTune以及Microsoft Visual C++自带的profile等。使用MS profile对solution_5分析产生的报告如下(略去一些无关数据):
Func Func+Child Hit
Time % Time % Count Function
---------------------------------------------------------
37.718 1.0 3835.317 99.5 1 _main (algo.obj)
111.900 2.9 3220.082 83.6 1 solution_5(int * ...
0.000 0.0 3074.063 79.8 112 _STL::sort(int *,...
……
可以发现sort函数的调用用去了将近80%的时间,这表明sort函数是问题所在,优化应该从这里着手。但正如前文所说,STL的sort已经高度优化速度很快了,再对他作优化是极难的;而且sort函数里又调用了其它STL内部函数,如蛛丝般牵来绕去,读得懂已经不是一般人可完成的了,优化从何谈起?
我们不能左右天气,但我们可以左右心情;我们不能修改sort函数,但我们可以控制sort的调用。再看看solution_5里对sort的调用有没有什么蛛丝马迹可寻:
std::sort( ResArr, ResArr + RES_ARR_SIZE, std::greater() );
这个调用是把结果数组ResArr重新排序一遍。需要把整个ResArr完全重新排序吗?答案是需要的,但可以不使用这个方法。因为ResArr里的元素绝大部分是有序的(结合上文可知前面94%的元素都有序),待排序的只是6%。只要把这600个数据重新排序然后将前后两个有序数组归并为一个有序数组即可(归并算法的时间复杂度为O(n+m)),将因为排序的数据量较少而大大节约时间。写代码如下:
template< class T, class I >
void solution_6( T BigArr[], T ResArr[] )
{
//同solution_5,略
//太多杂乱元素的时候排序
if( ZoneBeginIdx < 9400 )
{
std::sort( ResArr + 9400, ResArr + RES_ARR_SIZE, std::greater() );
std::merge(ResArr, ResArr + 9400, ResArr + 9400, ResArr + RES_ARR_SIZE, BigArr, std::greater() );
memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );
//同solution_5,略
}
经测试,solutio_6的运行时间为250毫秒左右,比solution_5快了将近一半,通过profile分析报告计算sort函数和merge函数的占用时间总计约为执行时间的19.6%,远小于solution_5的占用时间。
结束语
一番努力之后,终于将一个原来需要近一个小时才能解决的问题用250毫秒完成,文章到这里要完结,不过上述算法仍有可优化的余地,这就要读者朋友自己去挖掘了。我希望看到这篇文章的人不仅仅是赞叹算法的奇妙,更希望能够学会算法优化的方法和技巧。对于算法优化的方法,我总结如下(仅供参考及抛砖引玉之用):
不断地否定自己的方法[全文]
减少重复计算[solution_3];
不要做没要求你做的事[solution_3];
深化对需求的理解[solution_4];
温故而知新,多重读自己的算法代码[solution_4];
从程序的输出(或者中间结果)里找突破[solution_5];
时刻保持头脑清醒,常常跳出习惯的框框[solution_5];
善于使用工具[solution_6];
养成解决一个问题思考多个方案的习惯[全文]。
最后要讲的一点就是STL里提供了一个可以直接完成这一问题的算法——nth_element。经测试,nth_element在大数组比较小的时候速度比以上算法都要快,但在大数组尺寸为1亿的时候所用的时间为1.3秒左右,是solution_6运行时间的5倍。原因在于nth_elenemt的实现方法跟本文介绍的算法大不相同,有兴趣的朋友可以去阅读其源码。建议大家在一般情况下使用STL的nth_element,它在数量为十万级的时候仍有极好的性能。
参考资料:
[1] 侯捷 《STL源码剖析》 华中科技大学出版社 2002年6月
[2] Anany Levitin 潘彦[译] 《算法设计与分析基础》 清华大学出版社 2004年6月
[3] http://job.csdn.net/n/20051216/31105.html
注:
[1] 此题目版权归出题人或者其单位所有
[2] 本文所有的优化都针对于平均情况,即大数组由随机数构成且无序
[3] 所有测试均设BIG_ARR_SIZE = 1亿,RES_ARR_SIZE = 1万,测试的机器配置为:CPU P4EE 3.0G + 512 M memory,HyperThreading Enabled,操作系统:Windows 2000 pro,编译器: MS VC++ 6.0 + sp6,STL库: STLport 4.6.2;可从我的博客http://lanphaday.bokee.com下载本文所有算法源码和测试程序。
[4] 如果要求有序,可以通过先找出结果,再对结果排序完成要求。
简言之,就是找工作。想混口饭吃,真的不容易。
当初推辞出国邀请时那是何等的意气风发——现在呢——倒也不至于懈怠,,只是非常疲惫。或许今后的10年甚至20年,都赌在了这两三个月里,每每想起,都紧张得猛灌凉水。
从9月1号找工作战役打响开始,简历反复修改,已经往百度重投了30余次、Google和TI20余次。还好有论坛上的朋友们指点,经过4次大改,终于像点样子了,这才发现当初投去微软的那份简历是多么的不堪。我承认过去那份有故意堆砌之嫌,什么二级C、小程序、烂比赛都往上写,实践经历就占了一整页,而且杂乱无章。幸好有网友指正,删掉了无价值的实习经历,缩小字体,硬是给压到了一页。关于怎么看待网友评论,倒是值得一说。无良的“顶顶顶。。。”自不必说了,“拜牛人”之类的吹捧也不可往心里去;值得关注的有两种,一种是打击,到目前我的260多篇回复中遇到两个,一个说“一般般啦”——就是说不配投最好的公司;另一个说得更直白“估计没戏。你的简历太乱了。”就是看了这两则,才狠下心来给简历做了大手术。剩下十来个朋友给出非常中肯的意见和修改建议,非常感谢他们。
目前投了6家公司,真正合适的却不多。
Google:看了Google的面试题,一个子——搞,两个字——恶半夜凉初透搞,三个字——太搞了。唉就当玩玩吧。
百度:有一个职位合适,找了朋友内推,可惜用的是见不得人的初始版简历,估计是浪费了。在网站上重投了几十次,看来是要和求职大军们PK了。
EMC:待遇似乎不行,投着玩。
TI:招销售的,投着玩。
腾讯:小公司,纯属积累面试经验。
Sony:我错了。。。Sony网投开始好几天了,第一天看到了就骂,妈的我能去你日企?!今天忍不住登上去看了看,真有一岗位特适合,据说待遇也很好(考证中),煎熬了那么一小小会儿,投了,委身倭寇也比喝西北风强啊!不过还是尽量选择其他的大公司吧。。。
找工作是一项事业,太多东西要学,时间完全不够用。Baidu要考海量搜索、中文字符处理,没接触过;Google那纯属搞怪,贴一道题上来吧,
You are in a maze of twisty little passages, all alike. There is a dusty laptop here with a weak wireless connection. There are dull, lifeless gnomes strolling about. What dost thou do?
A) Wander aimlessly, bumping into obstacles until you are eaten by a grue.
B) Use the laptop as a digging device to tunnel to the next level.
C) Play MPoRPG until the battery dies along with your hopes.
D) Use the computer to map the nodes of the maze and discover an exit path.
E) Email your resume to Google, tell the lead gnome you quit and find yourself in whole different world.
因此Google就不用准备了。还是太多东西要学,过两周就要来了,急。可是,在群上哈啦的,在实验室看电影的兄弟们哪,你们就一点都不急么?
压力压力,你硬要在那儿顶着才会有压力。算是执着于名企的下场吧,千军万马过独木桥,只有自求多福了。
昨天开题答辩,又小满足了一下虚荣心,会上的老师在别人身上找茬的神情让人回想到本科答辩,面对偶的时候却更像是听讲座,哇哈哈!!!额,失态,失态。其实,我是一个蛮低调的学者。
我说这些的意思是,其实我一点也不清楚离开校园是不是一个正确的决定。在学校,我或许能得到旁人所羡慕的。离开学校,我或许就什么都不是了。为什么要走呢?一句话,不想混学术界。为什么不想?没为什么,只是5年来的执着。放弃出国留学,放弃这两年打拼所得,只为做一个坚持梦想的人,那个蹩脚定义的“成功男人”的梦。
各位将离开校园的朋友,Good Luck!