Author Archives: coder4

C++使用strtok实现分割字符串。

C++中有一些号称很优雅的功能和方法……但是有的压根不能指定分隔符,有的依赖于stream所以分隔符只能是char,真是Ugly到家了……

比如stackoverflow中提到的诸多方法:http://stackoverflow.com/questions/236129/how-to-split-a-string-in-c

其实strtok是标准的c函数啊,而且现在重入问题也已经被解决了,通过保存指针的方式,为什么不喜欢用呢?
我一直认为,C++是最难用的语言,没有之一。

9[......]

继续阅读

关于gevent的微线程“eventlet”同步问题

理论上讲,Python是不存在线程安全问题的,由于GIT么,但是这是有前提的:sleep,I/O导致的wait都可能会引发线程安全隐患。

同理,gevent是基于事件驱动模型的,就不太可能是线程安全的。

gevent.coros.Semaphore提供了信号量的功能,可以是n个哦!

semaphore.acquire() -> 获取“锁”
semaphore.release() -> 释放“锁”

gevent的文档写的真简介啊,于是测试了个基本的同步方法:同[......]

继续阅读

算法技术手册 - 排序 - 堆排序

堆排序依赖于上午写道的构建堆和调整堆。

基本思想:
(1)首先执行BuildHeap(以最大堆为例),则arr[0]已经是最大元素了,如果我们要按照从小到大排序,那么它应该被放在arr[n-1]上,于是,我们swap arr[0]和arr[n-1]。
(2)类似的,我们让i从n-1到0,依次执行调整堆,AdjustHeap(i,n),每次调整完成后,堆顶部一定是最大元素,正好把他换到i-2上。
上述的思路和选择排序是不是非常相似!

改进:
调整堆实际用到了递归方法,而其实它是[......]

继续阅读

算法技术手册 - 排序 - 堆排序 - 调整堆和构造堆

堆的下标相关:

对于大小为n的堆(0~n-1)中的一个元素idx
(1)左孩子:idx*2 + 1
(2)右孩子:idx*2 + 2
(3)父亲结点:(idx-1)/2
(4)最大(右下)的非叶子结点:n/2-1
特别注意(4)区别于(3),为什么呢?最后一个结点为n-1,那么它的父亲结点肯定是最后一个非叶子结点。即(n-1-1)/2 = n/2 - 1,都是下标搞的麻烦是吧!

目的:通过n/2-1次调整堆,可以构造一个堆。

调整堆(i,max):将i及之后(右、下)[......]

继续阅读

为什么说很多NoSQL的Benchmark是扯淡?

2011.9.25更新

本文被转载到NoSQLFun进行讨论

我才发现原文的一些问题没有表述清楚:

1、本文主要是针对随机读,而非随机写,关于如何构造一个写快的NoSQL系统,见BigTable论文,或者Cassandra、HBase。

2、我实际遇到的都是随机读很慢的情况,热数据可以解决部分问题,但是当规模远大于你的机器规模的时候,还是无法逾越的问题,此时NoSQL相对于RDBMS的优势就小的可怜了。

欢迎继续进行探讨。

原文:

抱歉我用了这么一个标题[......]

继续阅读