Zhang Jiuan’ Notes

从一道题目谈计算机和数学

    统计从1至400亿之间的自然数中含有多少个1?比如1-11中,有1,10,11这三个自然数有4个1。
    拿到这道题目,您会如何去计算呢?如果是计算机方面的面试,你又该如何去思考呢?也有同事拿这道题目谈到了“数学”与“数感”的理解,不过笔者却想谈一些更实际一些东西。
    如果是计算机方面的出现这道题目,我们可能首先想到的是挨个去找。比如1含有一个1,然后2不含有1,…10含有1个1, 11含有2个1,….直到4亿。实际去想想,可能还有第二种方法,即对于每一个数字,转换成一个字符串,然后查里面的1,这或许处理的时候简单一些,但思路基本一致。
  方法二:对于每一个数字,首先转换成字符串,然后查询里面的1的个数,然后求合。这实际上没有实质的进步,无论计算复杂度还是难度,都没有质的简化。实际上如果仔细观察的话,我们会发现给出的一个有效数字是4亿,也意味着除了最高位是4位,其它全是0,那么由此可以知道它的位数是9位以内的,如果是9位,最高位只可能是1、2、3。有了这些信息我们就可以进一步分析了。
    如果数字为9位,那么最高位只可能是1, 2, 3。如果最高位是1,那么剩余的8位可能含有1-8个1。因此进行分类分析。
    剩余8位含有1个1的情况:2 * C(8, 1) * P(7, 7)。
    剩余8位含有2个1的情况:3 * C(8, 2) * P(6, 6)。
    ….
    然后将上面的值进行求合。
    最高位是2, 3则可以进行类似计算,实际注意一下规范,可以利用上面的结果的。
    我们再考虑一下其它情况,即含有1 - 8位的情况。我们假设含有N位,以此来进行说明。
    最高位可能是1, 也可能是2-9,位不可能是0。因此可以利用上面类似的算法。
    S(N) = 2 * C(N-1, 1) + 3 * C(N-1, 2) …. + (N-1) * C(N-1, N-1) + 8*(1 * C(N-1, 1) + [...]

javascript 最简单的UI实现(学习)

    前些天看到世界javascript程序员有所增加,因此想着也凑凑热闹。看了一些基本的语法,写了些简单的小程序,还挺好使。但是后来也遇到一些问题,比如想写个简单的五子棋的游戏,想画一些数学公式的曲线,并没有找到现呈的东西可使。找了一些javascript的UI设计的东东,自已封装了了个最简单的画线的UI,下面介绍一下。
//zjaUI.js
/**************************************************************
 * this is write by zhangjiuan
 *************************************************************/
 var zjaUI = {
  //ui line color
  color: ‘#000′,
 
  /**
   * set color
   **/
  setColor: function(color)
  {
   this.color = color;
  },
  /**
   * draw line dot
   * but we may not need draw line dot and dot,
   * becourse if x = 0, and y …, so we can [...]

cvs版本控制管理(分枝管理)

    昨天自已也因为cvs的版本控制困惑了几个小时,查阅了相关资料,最终获得了自已想要的结果。实际整个流程梳理一下,很简单,不过对于当时不知道的情况下,就是一个很麻烦的事情了。现在以BLOG的形式记录如下,希望自已以后不再犯这样的困惑,也希望能给阅读了此篇文章的朋友有一点帮助。
    背景:因为项目的并行开发,在主干上打了一个分枝作为其它项目的开发基线。现在主干已经上线,分枝也开发完毕。因此想将主干上的代码合并到分枝中来,以达到在上线的时候不复盖主干的代码的目的。
    过程:查阅了相关的资料,有如下几个相关函数。cvs update -j(合并)cvs update -r (更新到某个版本) cvs tag -b (加某一分枝) cvs log 查看相关cvs log信息 cvs status当前版本状态。
    为了便于说明与不涉及相关工作信息,下面以main代表主干,以branch代表分枝。首先在主干上打了main tag,命令如下:cvs tag main,添加一个test.txt,修改文件:
cat test.txt
   aaaaaaaaaaaaaaaaa
  bbbbbbbbbbbbbbb
  ccccccccccccccccc
然后在这里打上分枝的tag,命令如下:cvs tag -b branch,现在修改test.txt文件:
cat test.txt
   aaaaaaaaaaaaaaaaa
  bbbbbbddddddddddd
  ccccccccccccccccc
这样以保证主干和分枝是有充突的。
好下一步应该是合并了。操作命令如下:cvs tag -j main。结果不是想要的结果,并没有任何冲突,为什么呢?由此自已经过仔细思考和查阅相关资料,实现虽然打了分枝的tag,但实际并没有切到分枝,因此修改的仍旧在主干上。
为此做如下测试:
    cvs tag mian; cvs status,可以看出是在主干上。cvs tag -b branch; cvs status,此时虽说打了分枝,但并没有切到分枝上,实际仍然在主干上开发。因此上面并不会充突。实际切到分枝也是很简单的。
    cvs update -r branch,好了,此时再cvs update -j main,终于看到了可爱的<<<<<<<<<<<, >>>>>>>>>>>>冲突信息了。
 
多谢
张久安
If you enjoyed [...]

狗叫了 主人醒了 小偷吓跑了(二)

    之前的一篇文章,同样的题目只是作了个引子,并没有作实质性的讨论。现在逐步讨论这道题目。狗叫了,主人醒了,小偷吓跑了。很形象的一个事情,如何使程序来表达它呢?如何考虑可扩展性呢?
    深入的想一下,狗叫了是一个事件,主人醒了是一个结果;继而主人醒了是一个事件,小偷吓跑了又是一个结果;更进一步是否存在小偷吓跑了作为事件的后继结果呢?结论是很显然的。那么这样分析就很简单了,以事件作为驱动便顺理成章。
    理次深入一下,狗叫了,是否有原因呢?狗叫是否是狗的自然属性呢,狗叫和主人醒是否可归结为同一事件属性呢?这个显然不合理。如果狗叫是原始属性的化,那么主人配便是触发事件,然后小偷吓跑了又该归结哪一类事件呢?
    想到这里,于是我们的设计就有一个轮廓了,有一样东西叫事件,这些事件会触发一些东作的发生。这是核心,其它都基于这个来完成。
class BaseEvent {
    virtual int actionPerform() = 0;
}
class DogEvent {
    int actionPerform() {
         ….
    }
}
….
这样似乎还缺了些东西,与事件绑定的动作,这个动作不一定是一个,那么它应该维护一个链表动作,只需要在对应Event上进行挂接就可以了。
因此修改后的BaseEvent变为:
class BaseEvent {
    private:
    action* action_list;
   virtual int actionPerform() = 0;
}
是的,这样的确可以解释很多东西了,但是仍旧有些牵强。因为事件作动作,似乎并不合理。事件是单纯的事件,它不应该有监听的功能,也不应该有作什么动作的功能。顺着这条思路我们似乎缺少一个监听功能的监听器。由此有了如下思维的扩展。
class EventListener {
    BaseEvent *event_list;
    Action * action_list;
    int actionPerform(Event e) {
         switch (e) {
             case ……
            ……..
        }
……..
}
这样似乎逻辑更清晰的多了。可扩展性也是显而易见的。当然,许多地方为我为提供了现呈的东西,但深入思考一下这些机制,是很有益处的。
各位读者,如果您读到这里是否能够顺着这种思路更进一步的去思考它的逻辑结构呢?
 
thx
张久安
If you enjoyed this post, make sure you subscribe [...]

抛开语言谈设计,走进语言谈编程

    在一个系统设计的时候,有些工程师往往拘泥于语言的实现上。在它们看来往往存在一些这样的疑惑:这种东西使某某语言不可实现,因此它认为无法实现。实际这是一个误区,设计的时候可行性不是由语言决定的,页是由逻辑可行性决定的。具体实现,可能与语言相关。当然,也可能这种语言可以实现的功能,往往因为习惯性的拘泥于视脚的思维,认为不可实现。往往跳出来,从更高的一个角度去思考,它并不是不可实现的,只是实现的方式不同罢了。
    当然,具体的实现还是落实到一行行的代码上,这时候对于语言的掌握便起到了决定性的作用。可能设计的可能行的东西真的使某一语言不好实现,但换个角度是否通过模块的划分使逻辑更加清晰,便实现更为灵活了呢?在这样的思维引导下,您的实现可能会有无心插柳柳成荫的收获。
 
thx
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!

strlen的i++与++i的细节

  无意间在网上看到如下strlen的实现:
int strlen(const char *str)
{
    register const char *p = str;
    while (*p++) ;
    return p - str;
}
程序倒显的挺简洁,但仔细想了一下是存在bug的。
1 没有对输入进行合法性验证
2 计算的长度也比字符串的实际长度多1。
于是当时想到改成++p会修正上述的第2点,第1点在此不作讨论。
int strlen(const char *str)
{
    register const char *p = str;
    while (*++p) ;
    return p - str;
}
在一般情况这个子程是可以工作的,效率也可以,但它仍存在bug,那就是字符串长度为0。
接口设计处理,实现仍旧是硬道理,特别是循环和++ –的地方犹其需要注意。
自测过程中,边界、极限测试也是十分必要的。
If you enjoyed this post, make sure you subscribe to my RSS feed!

c++ primer读书笔记

    现在再次读c++primer,感觉还是有很多东西值得学习,现在把一些经典句子摘抄下来。
    实际上在许多实际开发环境中成功的主要评价标准是最后的结果,至于对处理过程的讨论则很可能被视为学究气不切实际,总是得不到重视。虽然这种蛮力型的方案也能解决问题但是它总让人感到不快,而且有些危机感。这种方案吸引人的地方就是简单,我们明白需要做什么虽然它常常很乏味。
    复杂的技术方案一般在开始阶段需要很多时间,这时常常会感觉什么都没有做。而且因为处理过程是自动的,所以就更有可能出错事情不可避免会出错。但好处在于这些错误过程中不但事情很快能完成,而且拓展了想像的空间有时候这个过程也挺有趣的。
    每个指针都有一个相关的类型,不同数据类型的指针之间的区别不是在指针的表示上,也不在指针所持有的值地址上。——对所有类型的指针这两方面都是相同的。不同之处在于指针所指的对象的类型上,指针的类型可以指示编译器怎样解释特定地址上内存的内容,以及该内存区域应该跨越多少内存单元。
If you enjoyed this post, make sure you subscribe to my RSS feed!

职场不得不明白的十大定律

帕金森定律
美国著名历史学家诺斯古德•帕金森通过长期调查研究,写了一本名叫《帕金森定律》的书,他在书中阐述了机构人员膨胀的原因及后果:一个不称职的官员,可能有三条出路。第一是申请退职,把位子让给能干的人;第二是让一位能干的人来协助自己工作;第三是任用两个水平比自己更低的人当助手。这第一条路是万万走不得的,因为那样会丧失许多权力;第二条路也不能走,因为那个能干的人会成为自己的对手;看来只有第三条路最适宜。于是,两个平庸的助手分担了他的工作,他自己则高高在上发号施令。两个助手既无能,也就上行下效,再为自己找两个无能的助手。如此类推,就形成了一个机构臃肿、人浮于事、相互扯皮、效率低下的领导体系。
苛希纳定律   
西方管理学中有一条著名的苛希纳定律:如果实际管理人员比最佳人数多两倍,工作时间就要多两倍,工作成本就要多四倍;如果实际管理人员比最佳人数多三倍,工作时间就要多三倍,工作成本就要多六倍。苛希纳定律告诉我们,在管理上并不是人多力量大,管理人员越多,工作效率未必就会越高。苛希纳定律要求我们,要认真研究并找到一个最佳人数,以最大限度地减少工作时间,降低工作成本。
马蝇效应 
林肯少年时和他的兄弟在肯塔基老家的一个农场里犁玉米地,林肯吆马,他兄弟扶犁,而那匹马很懒,慢慢腾腾,走走停停。可是有一段时间马走得飞快。林肯感到奇怪,到了地头,他发现有一只很大的马蝇叮在马身上,他就把马蝇打落了。看到马蝇被打落了,他兄弟就抱怨说:”哎呀,你为什么要打掉它,正是那家伙使马跑起来的嘛!”没有马蝇叮咬,马慢慢腾腾,走走停停;有马蝇叮咬,马不敢怠慢,跑得飞快。这就是马蝇效应。马蝇效应给我们的启示是:一个人只有被叮着咬着,他才不敢松懈,才会努力拼搏,不断进步。
“南风”法则   
“南风”法则也称”温暖”法则,源于法国作家拉封丹写过的一则寓言:北风和南风比威力,看谁能把行人身上的大衣脱掉。北风首先来一个冷风凛冽寒冷刺骨,结果行人为了抵御北风的侵袭,便把大衣裹得紧紧的。南风则徐徐吹动,顿时风和日丽,行人因为觉得春暖上身,始而解开纽扣,继而脱掉大衣,南风获得了胜利。这则寓言形象地说明了一个道理:温暖胜于严寒。领导者在管理中运用”南风”法则,就是要尊重和关心下属,以下属为本,多点”人情味”,尽力解决下属日常生活中的实际困难,使下属真正感受到领导者给予的温暖,从而激发出工作的积极性。
酒与污水定律   
酒与污水定律是指,如果把一匙酒倒进一桶污水中,你得到的是一桶污水;如果把一匙污水倒进一桶酒中,你得到的还是一桶污水。在任何组织里,都存在几个难弄的人物,他们存在的目的似乎就是为了把事情搞糟。最糟糕的是,他们像果箱里的烂苹果一样,如果你不及时处理,它会迅速传染,把果箱里其他的苹果也弄烂。”烂苹果”的可怕之处在于它那惊人的破坏力。一个正直能干的人进入一个混乱的部门可能被吞没,而一个无德无才者能很快将一个高效的部门变成一盘散沙。一个能工巧匠花费时日精心制作的陶瓷品,一头驴子一秒钟就能将它毁坏掉。
零和游戏原理 
零和游戏是指,一项游戏中,游戏者有输有赢,一方所赢正是另一方所输,游戏的总成绩永远为零。零和游戏原理之所以广受关注,主要是因为人们发现在社会的方方面面都能发现与”零和游戏”类似的局面,胜利者的光荣后往往隐藏着失败者的辛酸和苦涩;但20世纪人类在经历了两次世界大战、经济的高速增长、科技进步、全球一体化以及日益严重的环境污染之后,”零和游戏”观念正逐渐被”双赢”观念所取代。人们开始认识到”利己”不一定要建立在”损人”的基础上。通过有效合作,皆大欢喜的结局是可能出现的。
手表定理   
手表定理,是指一个人有一只手表时,可以知道现在是几点钟,而当他同时拥有两只表时,却无法确定时间。两只手表并不能告诉一个人更准确的时间,反而会让看表的人失去对准确时间的信心。手表定理在企业经营管理方面给我们一种非常直观的启发,就是对同一个人或同一个组织的管理,不能同时采用两种不同的方法,不能同时设置两个不同的目标,甚至每一个人不能由两个人来同时指挥,否则将使这个企业或这个人无所适从。
不值得定律 
不值得定律最直观的表述是,不值得做的事情,就不值得做好。这个定律似乎再简单不过了,但它的重要性却时时被人们疏忘。不值得定律反映出人们的一种心理,一个人如果从事的是一件自认为不值得做的事,往往会保持敷衍了事的态度,不仅成功率小,而且即使成功,也不会有多大的成就感。因此,企业的领导者要合理地分配工作,如让成就欲较强的职工单独或牵头完成具有一定风险和难度的工作,并在完成时给予肯定和赞扬;让依附欲较强的职工更多地参与到某个团体中 共同工作;让权力欲较强的职工担任一个与之能力相适应的主管工作。
“蘑菇定律”
许多单位都会把初学者置于“阴暗的角落”(不受重视的部门,或打杂跑腿的工作),任其自生自灭。这就是蘑菇定律。相信很多人都有过这样一段当“蘑菇”的经历,但这不一定是什么坏事。当上几天“蘑菇”,能够消除我们很多不切实际的幻想,让我们更加接近现实,看问题也更加现实。
“彼得原理”
彼得原理是美国学者劳伦斯-彼得在对组织中人员晋升的相关现象研究后得出的一个结论:在各种组织中,由于在某个等级上称职的人员都会得到晋升提拔,因而雇员总是趋向于晋升到其不称职的地位。彼得原理有时也被称为“向上爬”原理。对个人而言,与其在一个无法完全胜任的岗位勉力支撑、无所适从,还不如找一个自己能游刃有余的岗位好好的发挥专长。
If you enjoyed this post, make sure you subscribe to my RSS feed!

狗叫了 主人醒了 小偷吓跑了

    今天在网上看到了如下一个面试题:
    狗叫了,主人醒了,小偷吓跑了,主人和小偷是被动的并且还有可扩展性,用什么样的设计模式并写出代码。
    由此想到了一个寓言故事:)
    有个人家里养了一条狗,它总喜欢对着一部分的行人狂吠不止,而对另一部分的行人一声不发。于是,这条狗的主人,就怀疑被狂吠的行人是贼,并且抓住人家,要去见官。这些行人十分愤怒,群起责备狗的主人,甚至要揍狗的主人一顿。
    这个故事告诉人们,不要无根无据地听信狗的狂吠,而乱怀疑别人。
 
    由此可以看出,做事情要讲求根据,无根据的结论,最终会遭受别人的质疑。同样,解答问题也亦如此。
If you enjoyed this post, make sure you subscribe to my RSS feed!

艾瑞报告称一季度百度搜索请求量份额升至74%

来源:http://tech.163.com/09/0601/10/5ANFGV8L000915BF.html
网易科技讯 6月1日消息,根据iResearch艾瑞咨询最新推出的网民连续用户行为研究系统iUserTracker的最新数据显示,2009Q1中国网页搜索请求量环比08Q4有所下降,达442.7亿次。
根据艾瑞的这份报告,今年一季度百度与谷歌共占网页搜索请求量份额的95%,相比上个季度,该比例维持不变。其中百度网页搜索请求量占有由去年第四季度的72.0%上升到今年一季度的74.1%,比上季度显著上升2.1个百分点。

据艾瑞此前公布的2008年数据,百度2008年全年占据了63.5%的市场营收份额。
预计09Q2受五一节庆以及汶川地震周年纪念、猪流感等热点事件的带动,中国搜索请求量将出现大幅增长,有望突破500亿次。
艾瑞咨询分析称,由于百度用户更呈现大众化,在09Q1期间围绕春节和春晚热点话题的搜索行为增多,推高了百度的搜索请求量占有。此外,百度于中央电视台春节联欢晚会期间播出的广告也对请求量份额的提升起到正面作用。
If you enjoyed this post, make sure you subscribe to my RSS feed!

返回顶部