新浪SNS,搞好友买卖和抢车位实在无趣。
原来弄得你可能认识的好友的好友倒是不错,如果对于随便访问的一个人,能搞个这样的关系网就更好了,比如和其能通过最少的好友而联系到,能够把这个连接关系显示出来。当然,显示出来的是仅对那些愿意让别人看自己好友的关系链。
不过不知道一个庞大的网络,找任两点的连接算起来是否很繁,特别是对于海量访问。
因为很多人并不愿被动的关心我可能认识谁,而是愿意主动的想知道我和我感兴趣的某个人会怎样的关联到。
冒充一下专家,说说找这个关系链的算法的设想。
SNS,六度分割理论,任两个人可以通过少于等于6个人而联系起来,对于超过六个人的,咱就当他是孤岛,不予考虑。我们把一个人的好友人群看作一度,好友的好友人群看作二度,二度的好友是三度,每这样衍生出来一度,都是海量的搜罗,两个人之间的关系,各自的衍生出前3度的人群,看看这两个人群是否有相同的一个人就可以了。对非好友关系的两个人,实际的计算中,可以各衍生一度看是否有相同的一个人,没有的话,其中一个再衍生一度,和另一个人的一度作比较是否有相同的人,没有的话另一个人再衍生一度作比较,这样推,直到各推三度。
这个东西对某两个人算起来并不难,关键是海量请求关系。不过我想SNS可以把这个做成一个增值服务,每请求一次这样的服务,都要花些虚拟币之类的,并且每算出的一次这样的连接,都可以在用户的信息中记录,下一次再有类似这样的请求,就不必重新去算。
去往论坛浏览此文章,参与讨论
现在网上关于这方面的讨论越来越热火了,我也被弄的蠢蠢欲动加入到这里面来。虽然不是编程专家,没有真正的实干参与一些大的东西的构建,但不妨碍我做这方面的思考,也许对于外行人去考虑专家才能考虑的内行的问题,天然的就能以最通俗最朴素的角度去看,当然也避免不了把复杂的问题想的简单,徒增笑料。
云计算,涉及到云和计算,我先说说计算吧。
现在文明对计算的需求是越来越多,越来越复杂。先不管那些复杂性,在我看来,计算量很大程度是海量的循环和迭代,对于后一次循环需要前一次的结果的迭代,没办法,扯不开,但是对于每次循环牵扯的东西比较固定,不依赖上次的结果的,就可以把海量的循环分成一段段,多台机器并行处理。我不知道并行计算是否是这么考虑的,如果被我误解了,就当笑话看吧,复杂的事情我想不明白,想想cpu里面所说的乱序执行阿之类的就如坠云里,不知道是不是因为没有相关性,而可以不必考虑顺序的随便来。说这么多不知所云,还是让我找个例子来说明吧,就拿两个大质数的乘积的分解来说。计算机发展到现在,质数序列的寻找是非常容易的事情了,不过反过来,一个非常大的数,要把它分解开来,看看是哪两个质数的乘积,对于现在的计算机,那是很困难的一件事,不是因为有多么玄虚,而是那种海量循环花的时间就让人吃不消。对于一个大数N,想知道它是由哪些质数的乘积,一个最笨的办法就是用2~sqrt(N)一个个的去除,看看剩下的是不是整数就行,这就涉及到循环了,不过各个循环没什么相关性,如果并行的话,就可以把这样的循环分成一段段交给不同的机器去做。不过这个办法比较笨,完全可以用2~
sqrt(N)里的质数去筛选,不过质数序列本身没有什么规律性可言,所以要把很大的质数序列分段分发给不同的机器的话,又会涉及到海量的数据流。我们就是在这样的简单的代码但冗余的运算量和很少的数据流,以及有效的运算但庞大的数据流之间寻找一个平衡。还有就是,分段下发给不同的计算机本身,如果分的过细,分发和结果的收集工作量就很大,如果分的过粗,下层的计算机要花很长时间才能有结果,如果以后大街上,家庭里,这样的计算机也可以做一个节点的话,人为的中断也会影响运算的效率,这也需要一个平衡的折中。
下面谈一下云,我要说的云是指所有连上网的计算机以及网络,这样一个整体。我们现在网络上传送的都是数据流,即使网络软件,安装前仅仅是数据的形式下载,安装好基本上就固定了,接收网上的数据,处理后发送结果。也许一些计算集群,通过网络传送的会有代码流,接收到之后结合数据而运行,随结果变化的代码再不断的分发。还是以上面的例子来说明,如果下面的某台子节点发现m能够被N整除,其把结果发送给中心计算机之后,中心计算机就应该根据结果,看看N/m能分解成什么样的数乘积,再重新根据N/m去分段和下发任务,而不是让下面的计算机继续傻算。也许读者觉得这里面只涉及到N,N/m和分段这样的数据,没有变化的代码,实际上网络计算涉及到的复杂性根本是我没法想象的,所以我只好举这样的很简单的一个例子。这里m当然还可能继续分解,又涉及到新任务的发配。。。