关于《社交网络》中Facemash网站算法(转载)

copy from http://www.douban.com/note/122191956/

《社交网络》中,Eduardo在玻璃上写下了两个式子,Mark以此算法,建立了www.facemash.com,从学校内的网站抓取大部分女生的照片上传。男生们在凌晨四点钟疯狂浏览此网站,在随机跳出的两副女生照片中,选择两者较“美”者,一举出名,导致哈佛网络瘫痪。

不过,那两个貌似很帅气的式子写得有点问题,分数线下方是1+10的幂次,而非10的倍数。
否则两者等级分差距过大的话,会造成分母为负数,从而期望为负……(王八翻不了身)

根据Wiki的介绍,此排名系统出自于匈牙利裔美国物理学家Arpad Elo,最初应用于国际象棋排名,现在也广泛应该于足球、篮球等运动。中文称为等级分排名。

Elo假设:
1.参赛选手在每次比赛中的表现成正态分布;后来普遍认为Logistic分布更为合理

2.在一局比赛中,赢的一方被认为表现较好,输的一方被认为表现较差;若平局,则双方表现大致相当。虽然这个假设貌似很稀松平常

算法如图:


Ea为选手A的期望表现,Ra为选手A当前的等级分排名。
当选手A和B进行比赛时,可根据公式算出两选手的期望表现。
Ea+Eb=1
胜方得1分,负方得0分。(在电影中,不会出现平局)

如果选手的表现比期望要好,那么此选手的排名应该上升。相反,若表现不如期望,则排名会下降。

Sa为选手A本局的得分(1或0),Ea为选手A的期望表现。K为常数,在大师级象棋赛中通常取16。得到的Ra’为选手本局比赛后的等级分排名。

初始可认为每个人的等级分排名为0。

第一局是A和B进行比赛。此时Ra=Rb=0,Ea=Eb=0.5。
假设本局A胜B负,则A的得分为1,B的得分为0。
Ra’=0+16*(1-0.5)=8
Rb’=0+16*(0-0.5)=-8

所以每进行一次比赛,就会有新的等级分排名产生。4小时内巨大的参加人数与点击量,让这个游戏格外邪恶也好玩儿。毕竟都是自己周围的女生XD

参考文献http://en.wikipedia.org/wiki/Elo_rating_system
=======================

若有错误的地方,请提出,便于改正。

本身不懂国际象棋排名制度,也不懂博弈论。连Logistic模型神马的,也忘得差不多了……

THINKPHP兄弟连李文凯老师视频笔记:10 create方法和令牌

10 create方法和令牌
一般多服务器的时候,我们不向本地文件系统写入数据
专门写到镜像服务器上面

可以将相对应的字段名称写到model,节约I/O

protected $fields=array(); //参考runtime/data/fields

$obj->getPk(); // get primery key
$obj->getFileds(); // get fileds info

curd (create update read del (save))

create:自动获取数据,自动令牌验证,自动映射,自动填充,自动验证
如果开启字段缓存,先匹配,不存在则获取字段

自动令牌:session中一个md5值,form表单中一个令牌,提交之后做匹配
function add()
{
$user = new Model(‘user’);
if($user->create()) //可以去core下的model查看
{
if($user->add())
{
$this->success(‘success’);
}
else
{
$this->error(‘failed’);
//$user->getError();
}
}
}
关闭令牌:8.2.11手册 ‘TOKEN_ON’=>false;
success必须要放到Tpl/default/Public/ 下

单个页面不需要令牌,在模版下面写{__NOTOKEN__}

$this->autoCheckToken();

THINKPHP兄弟连李文凯老师视频笔记:09数据库实例化模型

09数据库实例化模型
大M方法,M(‘user’); 等价于 $user = new Model(‘user’);

AdvModel是高级模型

M(’user’,’CommonModel’)实例化多个模型

大D

关闭掉自动缓存防止磁盘IO过高

THINKPHP兄弟连李文凯老师视频笔记:08数据库操作

mysql mssql pgsql.oracle

一个php直接return

dsn数据库链接
$dsn = ‘mysql://username:[email protected]:3306/dbname’;
$dsn = array(
‘dbms’=>”,
‘username’=>”,
‘password’=>”,
‘hostname’=>”,
‘database’=>”,
);
$db = new Db($dsn);

Common/convention.php thinkphp所有的默认配置

开启主从数据库

/* 数据库设置 */
‘DB_TYPE’ => ‘mysql’, // 数据库类型
‘DB_HOST’ => ‘localhost,192.168.1.2,192.168.1.3’, // 服务器地址
‘DB_NAME’ => ‘videodemo’, // 数据库名
‘DB_USER’ => ‘root’, // 用户名
‘DB_PWD’ => ”, // 密码
‘DB_PORT’ => 3306, // 端口
‘DB_PREFIX’ => ‘think_’, // 数据库表前缀
‘DB_SUFFIX’ => ”, // 数据库表后缀
‘DB_FIELDTYPE_CHECK’ => false, // 是否进行字段类型检查
‘DB_FIELDS_CACHE’ => true, // 启用字段缓存
‘DB_CHARSET’ => ‘utf8’, // 数据库编码默认采用utf8
‘DB_DEPLOY_TYPE’ => 1, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
‘DB_RW_SEPARATE’ => true, // 数据库读写是否分离 主从式有效
读写时,默认第一台是用来写,其它用来读

大C是用来读取配置文件中的参数

如何设置数据库集群?

THINKPHP兄弟连李文凯老师视频笔记:07开启调试模式

Conf/config.php ‘APP_DEBUG’=>true

Common/debug.php
默认是关闭字段缓存
如果想显示单个调试信息(单独的页面执行时间,单独的数据库操作次数…等)

自定义TRACE信息:Common/Tpl/PageTrace.tpl.php
然后在config.php定义 ‘TMPL_TRACE_FILE’=>’testTrace.php’;

在ACTION中自定义TRACE,$this->trace(‘session’,$_SESSION);

dump函数

// 用于代码优化,显示执行时间,占用内存等
debug_start(‘run’);
// many codes
debug_end(‘run’);

halt(‘aaaaaa’) //输出aaa,终端程序执行

// 模型调试
显示数据库操作类当中执行的SQL语句
$user = new Model(‘user’);
$user->find();
echo $user->getLastSql(); // 获取SQL语句

// 日志处理
lib/think/core/log.class.php

开启日志记录:
LOG_RECORD=>TRUE

日志记录方式:记录到system,mail,tcp,file(默认使用file)
手动记录:
log::write($msg=信息,$level=级别,$type=类型,存储位置)
log::save
log::record