代码改变世界

CodeKata-How Big, How Fast?

2013-02-19 23:40 MichaelYin 阅读(...) 评论(...) 编辑 收藏

这次主要是训练的对于基本空间和时间复杂度的一些估计的思考,作者承诺一周后给出答案,不过到现在为止答案也木有见到,莫非是读者自己去讨论?

首先是对于十进制很大数字所占bit位的大致估计,只要知道2的十次方是1024,然后1024约等于1000,按照这个对比关系得出结果即可。

第二个题目是对于存储空间的估计,人名,地址,电话号码啥的大概多少位也不是个定数,自己估计下就行,单个字符的话如果是ASC码的话按照一个字节来处理(编码方式决定这里的字节数),最后得出大概的结果就行。

二分法查找的那个题目文章后面有评论给出了解法 ,不过我觉得这个解法是有问题的。它把两个之间通过一个比例关系来推导出最后结果所需要的时间,但是仔细分析,二分法的时间复杂度是lg2 n,所以这个方法是有问题的,正确的解法是

Time = Alg2(n) + B

时间和数目是这样一种关系,通过前面给出的两组数据恰好能算出A B 的值,这样就能对其他的情况进行类似推导。

UNIX密码的那个问题应该考虑到密码不一定是有16位,可能只有15 14位等等,这样所有的可能数加起来其实是一个等比数列,将其结果通过等比公式算出来后乘以每次HASH的时间数目然后查看最终结果是否符合要求。

整体看来题目难度不大,主要目的还是要求程序员对基础知识的掌握,对于基础的排序算法,数据存储以及基本的数学知识是一个优秀程序员必备的素质。