月度归档:2017年07月

因此,即便你只创建了一个空字典

你的字典里有多少元素?
2014-07-12 23:42 by 老赵, 23905 visits
“字典”或者说“哈希表”大家都会用,这真是一个好东西,只要创建了之后就可以不断的丢东西进去,添加删除都是O(1)操作,那叫一个快字了得。不过这里我要再次引用Alan Perlis的名言:“Lisp programmers know the value of everything but the cost of nothing.”,目的是想提醒做事“不要忘记背后的代价”。

上图引自Wikipedia中“Hash table”条目,描述了最常用的“哈希表”实现方式之一,也是.NET中Dictionary所采用的做法。那么就以.NET中的Dictionary实现来举例,它的代价是什么呢?这里的代价主要是其内存开销。

创建Dictionary对象时我们可以传入一个“容量”值,但这并不是它会使用的实际容量。Dictionary内部会找到“不小于该值的最小质数”来作为它使用的实际容量,最小是3。这么做的目的是减少碰撞几率,因为从哈希值定位buckets时会用到取模操作。得到实际容量之后,就会它用来创建int[] buckets和Entry[] entries两个数组,用来实现间接索引(即buckets中保存的其实是entries数组的下标,具体可以参考Reference Source中的实现代码)。

请注意,这个实际容量也是下次rehash之前可以保存的最大元素个数。因此,假如你预计会要保存N个元素,那么就把N传入构造函数吧,这可以避免一次又一次无谓的rehash操作。

因此,即便你只创建了一个空字典,它至少也创建了两个长度为3的数组,再加上其他杂七杂八的字段,一个字典至少也占用了48个字节——还记得“赵人希”公众账号上的第一篇文章《.NET程序性能的基本要领》吗?

事实上,假如是一次初始化之后需要进行多次查找(很常见的模式),也完全可以尝试排序后使用二分查找。甚至在元素数量很少的时候,使用List>保存对象,而在需要读写的时候进行线性查找,效率也不会差。尽管这里的时间复杂度会是O(log(N))甚至O(N),但对于实际开发来说,算法除了“时间复杂度”还有“常数”的因素在里面。使用节省内存的实现方式,更可能会影响到GC的效率,这也是托管程序性能重要方面。

尽管如此,但这样的“问题”还是会到处出现。例如《基本要领》里面提到,他们在对Visual Studio和新编译器进行Profiling时,发现有大量的字典只保存了一个元素——甚至是空的。

上周我们在做Profiling时,也发现程序里一个被密集调用的算法使用了字典保持临时状态,但是在绝大部分情况里,这个字典里面只有5到6个元素,此时使用字典就有些得不偿失了。事实上,那个算法在绝大部分情况下,字典里的元素数量都是可以预知的,只有极少数情况下会超出。因此,算法可以修改为:预先获得元素数量,假如小于一个阈值,则使用普通的数组来保存元素,需要时进行线性查找。虽然这个算法还有更激进的优化手段(性能热点怎么优化都不过分),但现在这种则是最容易,也最安全的做法。

性教育是每个人都应该接受的教育

所有。商业转载请联系作者获得授权,非商业转载请注明出处。

同伴教育,志愿十年。
1.性教育是每个人都应该接受的教育。
2.安全和健康应该被放到同等重要也是最重要的位置。“内衣下面的部位不能碰”应该让每一个孩子都知道。
3.性教育应该从小学入学就开始。
4.在教育孩子之前,先教育父母。教给孩子是为了孩子的安全,而不是为了让孩子去实践。孩子遇到任何形式的性侵,都应该有勇气第一时间告诉父母,否则就是父母失职。
5.性取向平等应该成为高年级性教育的内容。
6.安全套的正确使用教学应在青春期就完成。
7.每个女孩都应掌握除紧急避孕药外的三种避孕方法。
8.在每一节课上坚持使用阴茎,阴道等名词,不可以用任何其他词语指代。
9.将所有有性侵犯记录的教育工作者清除出教师队伍。
10.性教育也是知识,大大方方地说,认认真真地听,谁都不必藏着掖着,谁都没有资格耻笑。
【不要用光用一些理论来教育孩子,更应该结合一些负面的事例才能让他们真正认识到应该合理合法的对待性,而不是图一时之快毁了自己。】这种看似伟光正的句式其实就是将性罪恶化。性是人生活中一部分美好的经历,什么叫毁了自己?失贞吗?堕胎吗?这些都不是性的问题。反倒是什么叫合理对待?什么叫合法对待?如果孩子能够在小时候就接受正确的知识,正确使用安全套,有很多意外怀孕根本就不可能发生。恐吓是懒政,教育是长期。

但在知乎这种应该好好讨论问题的社区里,回答这样的问题都会有人搭讪骚扰求约炮,可见这些意见和建议也是没用的,唯有自己脚踏实地去做,愿每一个看到答案的人,将来能够如此教育您的孩子。

酒喝完了,烟也抽了2包

请点赞 怎么都是感谢啊

泻药
第一次回答知乎,手机码字慢慢看。

2011年3月,我进入电视台,入职半个月后,小s也来到我们部门。小s是一个看上去很老实的女生,不是倾国倾城那种,但看上去别有一番滋味。小s虽然年纪比我大5岁,可和我没什么代沟,加上我们都是这个部门的新人,所以我们关系从开始就比较好。
5月,上面大boss来参观,我们通宵达旦的在台里加班,夜深了,熬不住,我站在楼道里抽烟,小s也熬不住,过来找我要了根烟,她平时看起来也蛮老实的,开始找我要烟我有点吃惊,后来想想台里多数女生都吸烟,我也就见怪不怪了,以后的日子里,我和她就像志明与春娇一样,在楼道抽烟把距离越来越近。
5月底,我们放了一个短假,假期结束我刚回就收到她的短信,说她在家做了几个菜,让我去她家喝酒。当时我屌丝一人在出租房里上网,觉得在家也无聊就打车去了她家。。
她家是一个100多平的三居室,略微偏日系风格。餐厅的桌上有几道家常菜,她一个人已经开动吃了一点,估计是吃到一半觉得一人吃饭无聊所以才喊我来喝酒的。
我在门口傻站着,她递了双拖鞋给我示意我进来。我在餐桌边坐下看着桌上的半瓶白酒很是吃惊,我酒量一直不好,准备拒绝白酒的,可碍于面子,实在没办法对一个姑凉说不。反正一共就半瓶白酒,我也不顾那么多,点了根烟和她推杯换盏。
6点多到她家的,白酒喝完才8点多,我明显感觉小s不够尽兴,她走进卧室,拿出了一支红酒,说是她朋友从国外给她带的,一直没机会喝,今晚要喝就喝个痛快,酒喝的慢,我也没有喝爽,我们又就着香烟喝完了一整瓶红酒。
红酒下肚我明显感觉到我有些上头了,叼着烟,听着她在我耳边说着办公室的家长里短各种八卦,说到激动的地方她还牵住我的手。。。
23点左右,酒喝完了,烟也抽了2包。酒和烟的副作用让我口渴难耐,我拍拍拍她的手示意她松开,我起身去厨房接杯水。