SQYBI.com

Change is a part of life, and takes part in finding us who we are.

2011年11月05日
by sqybi
9 Comments

sqybi和layla的算法课 系列文章筹备中……

不管什么事情,都是说起来容易,做起来难。这一点我最近是深有体会了……看着自己离100kg越来越远的体重,总觉得该做点什么了,可又总因为这样那样的原因最后什么都没做。真是失败啊。 闲话少谈。这个系列文章已经挖坑挖了好久了,一直没有能够找到机会动笔。随手翻翻blog,似乎已经有很长时间没有写有营养的文章了。上一篇大概还是PageRank那篇……或许还要更早吧,其实那篇营养也不多。 于是今天晚上下定了决心,要把这个坑填上。本来想今晚就写出第一篇的,现在看来还是有些困难。暂且列了个要讲的算法列表,当然非常概括了……可能还会有变动啥的。 这个列表基本是按照算法导论的目录来列的。仔细看了一下,列表中还是有一些算法已经快不会了,正好借这个机会重新温习一下,以后面试啥的说不定会用到。 先把提纲放出来吧。还有半小时断网,第一篇今晚是发不出来了。可以考虑明天早起赶完,嗯。 其实真的早就该填这个坑了,layla你估计都等急了吧…… ----- 数据结构 栈和队列,数组和链表 树和二叉树 二叉查找树 平衡二叉树 散列表 排序算法 选择排序、冒泡排序和快速排序(希尔排序?) 堆和堆排序 计数排序、基数排序和桶排序 搜索算法、贪心算法和动态规划 深度优先搜索和广度优先搜索 搜索时的剪枝 贪心算法和赫夫曼编码 动态规划(分成几次?) 图论 拓扑排序 强联通分量 最小生成树 单源最短路 二分图匹配 网络流 其它算法 数学算法(黑书31章) 字符串匹配和自动机 计算几何学(凸包和最近/最远点对) 后缀树和后缀数组

2011年10月16日
by sqybi
9 Comments

Help! My Archlinux (my Gnome 3) crashed!

今天Gnome 3崩了。。。不得已上来求救一下。。。 写一下崩的过程,希望写得还算清楚,不会乱七八糟。。。 崩的过程是,我用gnome-tweak-tool修改主题(是有某个选项卡,上面基本上所有的选项都是修改主题相关的,比如修改icon等等,那一页上的第一个选项)。 刚开始的主题是默认主题Adwaita,后来改成了某个主题(忘了是哪个了),Alt+F2,r,回车,一切正常。 再后来又改了,似乎是Atlanta,然后Alt+F2,r,回车,然后弹出提示告诉我gnome崩溃了,然后有一个选项(没有仔细看,记不清选项是什么了)和一个重启的按钮。 我没动那个选项,直接点了按钮重启。结果重启之后,gdm登陆的部分没有问题,但是进了gnome shell,显示出桌面壁纸就卡住了。状态栏什么的都没有显示,快捷键也都没有作用(至少我试过的都没有作用,比如Alt+F2,Win,以及自己设置的Alt+F3等),不过Ctrl+Alt+Fn切换控制台有效果。 然后尝试解决。最开始想通过修改配置文件把主题改回来,不过找了好久也没找到配置文件。Arch的wiki上有一段关于怎么修改配置文件换主题的介绍,但是可惜的是,我压根就找不到那个文件。 又找了找改主题的方法,所有介绍中基本都是图形界面的程序。有个gnomesettings神马的(名字肯定不是这个,记不清楚了),但是里面找不到theme相关的内容。 之后在/usr/share/themes/文件夹下看到了许多以主题名字命名的文件夹,尝试把Atlanta主题下的文件用Adwaita下的替换,还是不起作用。 再之后卸载gnome(pacman -Rc gnome),重启,重新安装gnome和gdm,问题依旧。 现在的问题就是这样,虽然我觉得最开始的时候大概只要把主题换回来就没有问题了,不过现在这个方法不一定还可行(毕竟已经重新装过gnome了)。这里需要求助的是: 1.如果有人经历过这个问题,求解决方案。 2.如果有人知道怎么在命令行下面改主题 ,求方法。 3.如果有人知道这个问题是解决不了的,也请告诉我,我直接重装。。。 多谢各位! update: 问题已经解决,方法是备份后删除所有配置文件,然后再将有用的配置文件移回。感谢lx各位以及人人上各位的帮助!

2011年09月27日
by sqybi
5 Comments

你的网站价值几何?让PageRank告诉你答案

本文同时发表在果壳网死理性派栏目,传送门:http://www.guokr.com/article/65304/。因为字数原因,所以编辑对死理性派上发表的文章进行了一定的删减和修正。这里发出的是未删减的版本,表示“太理性了,看不懂”的童鞋们可以来围观此文。 如果你安装过Google工具栏,如果你建立过独立博客或个人网站,那么你肯定和PageRank打过照面。而即使是从未考虑建站的读者,也有很大一部分听说过PageRank,毕竟作为Google搜索结果排序的重要依据[1],这个算法已经被广泛应用于网络的每一个角落。而PageRank值的大小,也早已与网站的SEO[2]成功与否紧密相连。 那么PageRank的名称从何而来?PageRank究竟如何准确表示网页重要度,它的算法又是如何高效准确运行的呢?在PageRank的背后,有什么数学理论的支持?且听笔者为您一一道来。 三个孩子和豌豆游戏 从前有一个死理性派老爸,他有三个孩子。老爸是个懒人,他在家里把三个孩子叫做老大、老二和老三。 一天,三个孩子正在玩游戏,老爸把他们叫到身边。“我这里有三十颗豌豆,”老爸说,“我们来用它们玩一个游戏,游戏结束之后按照游戏结果把豌豆分给你们,好不好啊?” “好!”三个孩子异口同声地答应了。 “你们先在这张纸上写下你们喜欢的人,如果你认为另外两个兄弟你都很喜欢,那就把两个人的名字都写下来。比如我知道老二很喜欢老大,那么老二就在纸上写老大的名字。” 三个孩子很快写好了,然后老爸把纸收了上来。老大的纸上写了老二和老三的名字,而老二写了老大,老三写了老二。三个人互相喜欢的结果如图: 老爸清了一下嗓子,继续向孩子们解释规则:“接下来,我会给你们每个人分十颗豌豆。桌上有三个盘子,分别代表你们三个人,豌豆都放在盘子里。在我喊‘预备’的时候,你们要把盘子里的豌豆全都拿到手里。在我喊‘开始’的时候,你们要把手里的豌豆全部平均分给自己喜欢的人。” 老二举手:“那就是说,我每次都要把自己盘子里的豌豆全部拿起来,然后放到老大的盘子里吗?” “没错,”老爸说,“老三和老大也类似。大家都明白规则了吗?” 三个孩子点头。“好,那游戏开始!” 一开始三个孩子盘子里豌豆的情况如图: “预备!”妈妈喊到,“开始!” 三个孩子开始分配自己手中的豌豆。老二把十颗豌豆都给了老大;老三把十颗豌豆都给了老二;老大则是给老二和老三一人分配了五颗豌豆,如图: 三个孩子很快就麻利地分配好了自己手中的豌豆。这时三个人的盘子变成了这种情况: 老大有点不高兴了:“为什么我的豌豆比老二的还少啊?这个游戏不公平!” 老爸说:“这个游戏还没有结束。接下来我还会继续吹哨,你们也还要继续这个游戏,直到你们盘子里的豌豆数不再变化为止。公平不公平,到时候就能看出来了。” 老大虽然有点疑惑,不过还是点头同意了。 就这样,游戏一直进行下去。在下一轮的交换豌豆后,老大的盘子里有了15颗豌豆,老二有10颗,而老三只有五颗。当然故事在这里还没有结束,不过我们的描述要结束了。因为这个游戏将会持续很长很长时间——这点大概是死理性派老爸没有想到的。当然如果继续分下去,豌豆的数量将不再是整数,这一点我们也不深究了,游戏怎么能进行下去,就留给老爸想办法吧。 那么这个游戏最终的结果是什么样的呢?我们可以用电脑模拟这个过程,得出的结果是:老大和老二的盘子里各有12颗豌豆,而老三的盘子里有6颗豌豆。这时候无论游戏怎么进行下去,盘子里的豌豆数量都不会再变化。 网页排名和PageRank 在互联网刚刚发展的时代,人们曾经为网页的排名问题伤透脑筋。网页排名,顾名思义,就是为互联网上成千上万(当然,现在互联网上的网页数量已经不只是成千上万的程度了)的网页按照重要度进行排序。能够得知哪个网页更重要,对搜索引擎的发展十分有帮助——很显然,搜索引擎应该把重要的网页放到搜索结果中比较靠前的地方。 这个问题看起来很容易,但是解决的方法却没有想象的那么简单。 最初,一些比较流行的网页排名算法都很类似,它们都使用了一个非常简单的思想:越是重要的网页,访问量就会越大。于是,许多大公司就通过统计网页的访问量来进行网页排名。但是这种排名算法有两个很显著的问题:一是因为只能够抽样统计,所以统计数据不一定准确,而且访问量的波动会比较大,想要得到准确的统计需要大量的时间和人力,还只能维持很短的有效时间;二是访问量并不一定能体现网页的“重要程度”——可能一些比较早接触互联网的网民还记得,那时有很多人推出了专门“刷访问量”的服务。 有没有更好的方法,不统计访问量就能够为网页的重要度排序呢?在1999年,一篇以拉里•佩奇(Larry Page)为第一作者的论文[3]发表了。论文中介绍了一种叫做PageRank的算法,这种算法的主要思想是:越“重要”的网页,页面上的链接质量也越高,同时越容易被其它“重要”的网页链接。于是,算法完全利用网页之间互相链接的关系来计算网页的重要程度,终于摆脱了访问量统计的框框。 不过,不知道我们的死理性派老爸是不是了解,实际上刚刚他和孩子玩的游戏,就是PageRank算法的运行过程。 PageRank会给每个网页一个数值,这个数值越高,就说明这个网页越“重要”。而刚刚的游戏中,如果把豌豆的数量看作这个数值(可以不是整数),把孩子们看作网页,那么游戏的过程就是PageRank的算法,而游戏结束时豌豆的分配,就是网页的PageRank值。[4] 随机行走模型和马尔可夫过程 PageRank算法的思想基于“随机行走模型”(Random Walk Model)[5]。实际上,PageRank求解了这样一个问题:一个人在网络上浏览网页,每看过一个网页之后就会随机点击网页上的链接访问新的网页。如果当前这个人浏览的网页x已经确定,那么网页x上每个链接被点击的概率也是确定的,可以用向量Nx表示。在这种条件下,这个人点击了无限多次链接后,恰好停留在每个网页上的概率分别是多少? 在这个模型中,我们用向量Ri来表示点击了i次链接之后可能停留在每个网页上的概率(R0则为一开始就打开了每个网页的概率,后面可以看到R0的取值对最终结果没有影响)。很显然Ri的L1范式[4]为1,这也是PageRank算法本身的要求。 于是,整个浏览过程的一开始,我们有: 其中,A是一个表示每一次点击链接概率的矩阵。A的第i列第j行Ai, j的含义是,如果当前访问的网页是网页i,那么下一次点击链接跳转到网页j的概率为Ai, j。 这样设计矩阵A的好处是,通过矩阵A和向量Rn-1相乘,即可得出点击一次链接后每个网页可能的停留概率向量Rn。例如,令R1=AR0,可以得到点击一次链接后停留在每个网页的概率: … Continue reading

2011年08月09日
by sqybi
1 Comment

Codeforces Beta Round #80 Div. 2 总结

这次比赛是晚上7点开始的,所以状态大概比上次好一些。不过还是有题错得蛋疼,算是熟悉Python过程中的一个教训吧。 A题可以算是水之又水,模拟也可以做,写几个if或者case语句也可以做,甚至直接打表也可以。不过还真有人做错,随手hack掉了。 B题大概就是推一个公式然后计算就可以。写的时候有个小地方写错了,resubmit了一次,貌似扣了一些分。 C题是说判断一个图是不是如下形状:有一个至少三个结点的环,环上每个结点下面都可以挂一棵树。我直接DFS了一下,不过判断连通的时候出了一个很恶心的问题:我的判断连通方法是,DFS之后看是不是访问了所有结点。结果Python的++i是0+0+i的意思,于是我写的一句++n直接没有作用而且还不报错……然后pretest又没有这种情况出现,于是这道题system test的时候挂掉了。写C++写习惯了,++、--操作符总是顺手用。这个习惯得改了…… D题看起来是概率题,实际上仔细想一想就知道,整体的概率大小和X无关,只和每个.和它后面第一个X的距离是奇数还是偶数有关。尽量保证结果是.X.X……的形式,然后在不影响总概率的情况下安排字典序(如:..X.X可以改为...XX),实际上这就成了一道构造题。代码写起来可能稍微乱一点,别的没难度。 E题貌似这次是Div 1的D题,比较难。有n*sqrt(n)的算法,但是最后也没写完,不知道能不能奏效。 最后挂了C题,E题没做。因为大部分人E都没做所以成绩还好,压线变紫。下次就要做Div 1了,Ganbatte!

2011年08月04日
by sqybi
2 Comments

Codeforces Beta Round #79 Div. 2 总结

最近突然来的兴致,于是又开始刷题了。现在在做的比赛有SRM和这个Codeforces的比赛。SRM还是用C++(因为不给开Python),这个就用来练Python了。 比赛刚刚结束,结果略坑爹。虽然速度搞出五道题然后hack了两个人暂时占领ranklist第二的位置,不过System Test直接挂了三道题。 A题是一道非常水的枚举,结果被我写挂了。原因是我偷懒没开二维数组存邻接矩阵(python开二维矩阵要写好长一段啊,用过的应该都知道吧……),然后直接存了边表。更坑爹的是边表里边的查找我随手写了个in,要知道Python的in可是线性复杂度啊,不过当时没看出来。这算是C++留下的后遗症呢还是Python不够熟练呢,总之光注意循环的复杂度没问题就没管这道题了。结果悲剧地TLE了。要是把边表存成一个set其实就OK了,不过可惜比赛时没注意到这一点。 B题也是水题,纯模拟,跳过。 C题是字符串处理,对于Python来说没有任何难度。只要注意最开始别直接转成int就行了,不然会爆掉(Python不会爆不过会TLE。。。大概)。 D题大概是线段树(树状数组?)+DP,可惜我已经好久没写代码了所以没敢下手,只写了一个离散化+DP。果断TLE掉。代码能力啊代码能力,这些算法怎么写都得补啊。。。以后应该还是有用的吧。。。其实这题算时间复杂度也出现了问题,(n/2) * (n/2)我竟然当成了n的复杂度,真不知道脑子在想什么。锁了题之后才发现这一点,不过已经晚了。测了极限数据过不了(顺便用这组极限数据hack了一个人),当时还心存侥幸,其实想想也知道这种比赛的数据肯定足够强。。。 update: D题其实只要把车站进入和离开的时间点排序就可以了,我想复杂了。。。坑爹啊。 E题是简单数学题(跟D题比真的简单不少),不过写的时候手贱了多打了点东西。。。于是就挂了。自作自受啊自作自受。不过就算是在当初状态最好的时候,能不能保证不出这个失误呢?还真不好说。 最后排名惨不忍睹了(就出了两道题还不是高分题),估计下次还要做Div 2了吧。SRM那边开的小号第一场倒运气不错,直接黄了,比大号的第一场分数都高——明明排名比大号的第一次比赛低不少。SRM的分数通货膨胀了么。 唉唉,这个总结就这样吧,恢复状态任重而道远啊。。。