oyd的专栏

草木竹石皆可为剑

用户操作
[即时聊天] [发私信] [加为好友]
oydID:oyd
93209次访问,排名1068,好友9人,关注者14人。
aaaa
oyd的文章
原创 67 篇
翻译 2 篇
转载 18 篇
评论 253 篇
oyd的公告
最近评论
oyd:to sgzwiz:
AMAF(All Move As First)其实就是在随机模拟得到结果后,认为功劳不能只归模拟前的那一手,而是模拟中下的每一手棋都有份。

to xyjdn:
有个例子告诉你感觉需要计算做后盾的:经验丰富,棋感出色的老棋手总是负于精力旺盛的年轻棋手。

sgzwiz:Mogo现在并不是用UCT算法,而是很类似AMAF的算法。
sgzwiz:Mogo现在并不是用UCT算法,而是很类似AMAF的算法。
xyjdn:oyd 发表于2008-11-18 10:05:29 IP: 61.135.152.*
to ok:
目前数学上能推出是最优解的方法就是穷举法,你什么最大最小/alphabeta剪枝都建立在估值上,但是估值根本就不准,你剪的枝又有什么意义呢?

另外在一个假定条件下,该方法是可以被证明为能找出最优解的。这个条件就是:最优解的每一步都是胜率最大解
bfbd:恩,好像跟A*寻路算法有点儿类似,就是培养和发展目前看来最优的解。
文章分类
收藏
    相册
    个人摄影作品集
    个人摄影作品集2
    广告
    dylgsy
    pigo的流水账(RSS)
    九贱的BLOG
    恋花蝶的博客
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 快速URL排重的方法(一)收藏

    新一篇: 快速URL排重的方法(二) | 旧一篇: Stock and Monster Hunter股市和怪物猎人

    我这里介绍一个极适合大量URL快速排重的方法 ,这个算法被称为Bloom filter,基本上,它也只适合这样的场合。

    这里的大量是指有5000万至1亿的URL,更大的数据量可能也不合适了。

    一开始我使用了一个最复杂的做法,是有一个单独的daemon程序负责排重,数据和排重结果通过socket传输。
    后来发现不行,仅仅几百万数据要做好几个小时,5000万不把人都急疯了?至于daemon中具体用什么算法就次要了,因为一涉及到网络通讯,速度再快也被拉下来(这里针对的是发送一条记录/返回一条结果的模式,一次传送一批数据则与网络状况有关了)

    所以,把目标锁定在单机排重,一开始,试验了perl中的hash,非常简单的代码

    use DB_File;
    my %db;
    #tie %db, 'DB_File', "createdb.dat", or die "Can't initialize db:: $! ";
    while(<>) {
            
    chomp $_;
            
    $db{$_= 1;# add code here
    }
    #untie %db;

    从标准输入或文件中每行一个URL读入,插入到perl内置的hash表中,这就成了,需要输出结果则预先判断一下插入的key是否存在。

    这个方法速度很快,可惜的是,它占用内存太大,假设1个URL平均50字节,5000万个URL需要2.5G内存。

    于是又想到一个方法,把部分数据放入硬盘空间,perl中也提供一个现成的模块DB_File,把上面代码中的注释去掉,就可使用DB_File了,用法与hash一样,只是内部用数据库实现的。

    测试了一下,速度明显下降了一个档次,仅40万的数据就要1分钟,关键还在于随着数据量的增加,速度下降加快,两者不呈线性关系。

    数据量大的时候,有可能用MySQL的性能会比DB_File好,但是总体上应该是一丘之貉,我已经不抱期望了。

    也许DB_File可以优化一下,使用更多的内存和少量的硬盘空间,不过这个方案还是太复杂,留给专家解决吧,一般来说,我认为简单的方法才有可能做到高效。

    下面我们的重点对象隆重登场:Bloom filter。简单的说是这样一种方法:在内存中开辟一块区域,对其中所有位置0,然后对数据做10种不同的hash,每个hash值对内存bit数求模,求模得到的数在内存对应的位上置1。置位之前会先判断是否已经置位,每次插入一个URL,只有当全部10个位都已经置1了才认为是重复的。

    如果对上面这段话不太理解,可以换个简单的比喻:有10个桶,一个桶只能容纳1个球,每次往这些桶中扔两个球,如果两个桶都已经有球,才认为是重复,问问为了不重复总共能扔多少次球?

    10次,是这个答案吧?每次扔1个球的话,也是10次。表面上看一次扔几个球没有区别,事实上一次两个球的情况下,重复概率比一次一个球要低。Bloom filter算法正式借助这一点,仅仅用少量的空间就可以进行大量URL的排重,并且使误判率极低。

    有人宣称为每个URL分配两个字节就可以达到0冲突,我比较保守,为每个URL分配了4个字节,对于5000万的数量级,它只占用了100多M的空间,并且排重速度超快,一遍下来不到两分钟,极大得满足了我的欲望。

    今天时间不够,下一篇再贴代码

    发表于 @ 2007年07月19日 18:12:00|评论(loading...)|收藏

    新一篇: 快速URL排重的方法(二) | 旧一篇: Stock and Monster Hunter股市和怪物猎人

    评论

    #zouxinfox 发表于2008-01-04 17:12:41  IP: 219.239.227.*
    "有10个桶,一个桶只能容纳1个球,每次往这些桶中扔两个球,如果两个桶都已经有球,才认为是重复,问问为了不重复总共能扔多少次球?"
    --------------------------------------------
    不是10次吧,应该是C(10,2),即45次
    #zouxinfox 发表于2008-01-04 17:21:25  IP: 192.168.3.*
    我理解错了,只是条件概率,P(A|B)=P(AB)/P(B)=(1/100)/(1/10)=1/10
    收回前面说的话
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © oyd