免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fender0107401
打印 上一主题 下一主题

面试了一个在ACM拿过奖的人。 [复制链接]

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
81 [报告]
发表于 2013-12-13 15:04 |只看该作者
本帖最后由 shan_ghost 于 2013-12-13 15:11 编辑

算法复杂度描述的是,一个算法随着处理对象的数目n的增长,所需时间、空间与n之间的函数关系(的粗略估计)。


假设对一个问题,当处理对象为1时,需要执行X个操作,这些操作的总执行时间是T,执行算法需要的额外空间是S。
那么当处理对象数目为2时,就需要执行f(2) × X 个操作(也就是执行时间为f(2)*T),需要的额外空间就是g(2) × S。
……
依此类推,当处理对象数目为n时,需要执行f(n)×X个操作,需要的额外空间为g(n)×S。

而大O标记法,其实就是函数f(n)/g(n)里面关于n的最高次项。
这是因为,要精确表示f(n),需要的表达式可能很复杂。比如可能是f(n)=6n^3+7n^2-5n+2 。
显然,随着n的增长(n是自然数),低次项的贡献迅速减小;甚至高次项的系数6,贡献也迅速减小。
另外,这个T也是很随意的、随着机器不同、具体算法不同而剧烈变化(这个后面再说)。
所以,大O标记法只关注n的最高次方项的次方数,并不关注它的系数。



举例来说,2分法查找,当待查找数组中只有一个元素时,只需执行如下逻辑一次:
1、访问第m和n元素之间的中位元素(m/n初始为0和1)
2、比较它的值
3、输出查找成功、或者根据比较结果修改m/n的值
4、检查m/n的值,继续查找或输出失败

而当有N个元素时,就需要执行如上逻辑ln(n)次。

设每次执行如上逻辑需要的时间为T,则时间复杂度为ln(n)×T。

于是,我们就说二分查找法的时间复杂度随n增长的趋势是对数级的,用大O标记法标记为O(ln n)

而无论n有多大,执行如上逻辑,需要的空间数目都没有变化。即总是需要1×S大小的空间,所以空间复杂度为O(1)。


——————————————————
类似的,对于hash_map,当从1个元素中查找某个值时,需要做什么呢?
1、计算hash值
2、根据算出的hash值,直接访问某个内存位置

如果map中的元素数量更多些呢?
答案仍然是:算hash值,然后直接访问。

所以,我们说hash_map的时间复杂度为O(1)的。



但,注意O(1)可未必就等于快!

比如,如果数据只有4个char,我把它直接存数组里;需要时就逐个比较——相比之下,这可是O(n)的蜗牛算法。

但,这个算法只需要做4次比较而已(即Ts=一次比较指令+循环变量自增+跳回循环首部 所需时间之和),大概也就是8到12条机器指令;
而hash呢,光计算hash就得几十条指令了(即Th=几十条指令的执行时间)。
相比之下,hash就慢太多了。

所以,一些规模很小的问题,宁可使用逐个比较或者二分查找,也不要使用hash。得不偿失。


但,当n的规模提高之后,比如n成了一百万,那么逐个比较就需要几百万条指令,而hash呢,仍然只需几十条指令——O(1)算法的威力,现在才能体现出来。

——————————————————————————————
总之,算法的时间复杂度,意思是待处理数据的数量n与所需指令数目之间的函数关系;并不是什么别的神秘的东西。
空间复杂度也类似。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
82 [报告]
发表于 2013-12-13 15:38 |只看该作者
wait_rabbit 发表于 2013-12-13 09:25
老实说,当时挺意外,以为他可能没在状态,所以没回过神来。

于是我提醒了他一下,一个4字节的 int  ...


这个问题比较偏,没见过就完全答不上来。 如果不涉及到控制CPU和数据在内存中的组织方式,大端小端知不知道都完全不影响。

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
83 [报告]
发表于 2013-12-13 15:43 |只看该作者
koolcoy 发表于 2013-12-13 15:38
这个问题比较偏,没见过就完全答不上来。 如果不涉及到控制CPU和数据在内存中的组织方式,大端小端知不 ...


偏不偏要看对什么领域的民工。你如果是写html/js,谁吃撑了问你大小端。

如果是 c 程序员,对不起,那就属于必须知道的最基础的常识。

否则像 htonl、ntohl 这种最最基本的函数,对你有什么意义?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
84 [报告]
发表于 2013-12-13 15:50 |只看该作者
fender0107401 发表于 2013-12-12 09:17
上次还面试过一个名校的软件工程专业的高材生。

我问他有什么项目经验,结果Y直接告诉我没怎么写过代码。 ...


软件工程不要招硕士,要招本科

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
85 [报告]
发表于 2013-12-13 16:08 |只看该作者
回复 77# komakoh


    你可以回答: 我一般在函数中保护、恢复现场~~

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
86 [报告]
发表于 2013-12-13 17:32 |只看该作者
本帖最后由 zylthinking 于 2013-12-13 17:36 编辑
wait_rabbit 发表于 2013-12-13 15:43
偏不偏要看对什么领域的民工。你如果是写html/js,谁吃撑了问你大小端。

如果是 c 程序员,对不起, ...


我当了3年C程序员才知道大小端, 还好, 那三年没饿死
当年俺认识的基本函数有 _beginthreadex, CreateWindowEx, PostMessage 诸如此类,  还真不知道 htonl、ntohl 原来是C程序员的标杆

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
87 [报告]
发表于 2013-12-13 17:49 |只看该作者
回复 86# zylthinking


    别生气, 人家做网络出身的~~和你起点不同~~

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
88 [报告]
发表于 2013-12-13 17:53 |只看该作者
zylthinking 发表于 2013-12-13 17:32
我当了3年C程序员才知道大小端, 还好, 那三年没饿死
当年俺认识的基本函数有 _beginthreadex, Creat ...


偶倒是在学C之前就知道了……用pc-tools改游戏存档,不交换次序钱就改成负数了

不过,也是3年后开始玩网络,传自定义数据结构,一翻socket接口文档,才知道还有#program pack这回事……

似乎除了网络有关代码,或者像偶那么不务正业去黑游戏存档,就没必要知道这些吧。

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
89 [报告]
发表于 2013-12-13 19:19 |只看该作者
zylthinking 发表于 2013-12-13 17:32
我当了3年C程序员才知道大小端, 还好, 那三年没饿死
当年俺认识的基本函数有 _beginthreadex, Creat ...


呃,前提是 unix 环境下。

何况人家都上了整整 7 年的计算机课了,你一个学生物的拿 3 个 windows 函数来凑什么热闹。  我也是第一次听说这三个 windows 函数,不也幸好没饿死。

这也不是什么标杆,都说了是想让他水果。标杆的话,显然得让你 show 一下 kernel 之类的。

我如果是老板,直接 30k/m X 16 来挖你过来,管你懂不懂 hton 啥的,如何

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
90 [报告]
发表于 2013-12-13 19:30 |只看该作者
一群大神在这卖萌呢啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP