Wednesday, September 8, 2010
 

Telligem 办公室搬迁

呵呵,Telligem的新办公室,经过简单的rebuild,一下子感觉好了很多,
希望我们走的越来越远.
Dream,
MY FOOT

 

给师弟的一封信

在自己离开大学校园3年,源自于自己4年前,加入一个校园的IT团队-日新网;在我建立的技术梯队培养基础之上,走出了一批又一批优秀的IT毕业生,有多名师弟加入腾讯、金山、新浪公司,对于某个3流学校的一个社团来说,很不容易。

在很多天以前,一个师弟通过QQ告诉我一些社团伤感的事情,对走出校园多年的我,感到很吃惊;
原来我在这个社团也是留下了点回忆,为了鼓励他们振作起来,写了一些煽情的话,希望对他们有用。

———————————————————————————————————–
在你看下面的话之前,我先描诉一下我目前的状况:
25岁
已婚
房奴
月光族
————————————————————————————————–
从上面你可以得出一个结论:我这个人比较感性,我也喜欢这么一个评价

为了获得很多的点击,帖子的名字有点怪,仅此而已。

理性的看待下面的文字,我不喜欢别人评价我“他这人很自恋”
我再次申明 我在日新 没有裸聊历史 君子好色而不淫 泡妞守法公民

今天刚刚获知陈老师比较烦,日新网研发部的人比较烦,我不想参与这件事情,我只想讲个故事,如果故事中有诋毁别人的文字,希望谅解。
日新网研发部的衰败会给交大出来从事IT业的人带来很大的影响,甚至超过一个学院的影响
日新网从诞生张伟、吴盛幸等牛人开始,陆续的为中国互联网输送了很多人才
组建了一个技术小圈子,组建了一个日新技术的人脉圈
这件事情的重要性不言而喻 我欲知在不久的将来,所有的IT大型企业都会来交大招人,前提是日新网研发部名存实归.

今天这些话不只是讲的川哥听的,而是所有日新人听的,
川哥对日新网的贡献肯定是前无古人,暂时后无来者

当然今天不是来论功行赏的,也没有必要。

铭记历史
我觉得那些不痛快的历史,每一个日新人都应该了解一下。
所谓“察己可以知人,察今可以知古“,如果日新研发部搬迁处理的不好,可以预知日新研发部将消亡,那就不是一己私愤这么简单了,N年以后,你会发现都是那么点破事情,太不应该了

名词解释,希望日新人“去其糟粕取其精华“:
为什么我喜欢叫陈老师叫川哥,别人叫我涛哥

黑社会团队文化:这是日新网研发部 创新文化之一,我不喜欢叫陈老师,觉得不够霸气,就像国民党老大叫”总裁”,多有新意。
研发部的团队文化就是黑社会性质的,我以前一直灌输,现在只要有机会我就灌输,师弟都叫我涛哥;啥总的一点新意都没有,也很容易搞得拍马屁现象出现,06-07年这种风气太甚,貌似新闻部还有这种风气,不是批评,我是带着学习的心态来的,为什么是黑社会性质的,黑社会讲究实效,不管是打架还是抢钱,都是在极短的时间内完成和响应的,一般都是大哥比较照顾小弟,我希望这个传统需要保持,当然你也可以改进及创新。

A片文化:文化创立者张伟,外号“精神鸦片”;不知道是谁把游戏文化带入了日新网,非常不好,为什么?看A片不能天天看,游戏是天天玩,极度影响平时的学习。
日新服务器拥有交大最大的毛片库,归类相当好,不知道何时让高尚的人占为己有了,不复存在了。
试想“何以解忧 唯有杜康“,通宵写程序是何等的无聊,人很容易疲乏,A片如张伟的网名[精神食粮],何等宝贵的财富。

个人觉得 总结思考 不只局限于专业领域,对于团队的战斗力及爆发力应该好好研究一下,我今天经常和别人讲:给我一个月,我可以给你一个打硬仗的团队,能砍能杀,我每次都成功了,甚是欣慰。

不要搞个人崇拜,虽然从伟大的毛主席开始 ,林彪把个人崇拜推向了顶峰,但在一个团队里面这是不合适的,应该明白团队的重要,个人的力量是有限的.
“博古才能通今”,我今天给大家讲讲这个研发部的历史。

日新网研发部是个创造神的地方,是个有归属的地方
不可否认日新网今天个人崇拜的偶像是“张伟“
在一定程度上,我起到推手的作用,当然你可能觉得我这人很扯淡,因为张伟本来就是个天才,没关系,我来讲讲我的道理。

05-06年诞生了2个伟大的程序员,一个是张伟,一个是吴盛幸,我保证我几乎没有谈论过吴。
我承认张伟的技术,吴我一直没有公开承认过,是因为我06年维护机电学院网站的时候,他入侵过机电学院网站,还做了一个视频做培训,好吧,我承认我对他一直是有偏见的。
还有一个重要的原因是 吴这个人创立了另外一个组织“紧急响应小组”,准备收购 日新技术部。
为了赢得和小组的战争,我必须塑造一个程序员形象,而且不能让敌人打入我们内部组织,因此我一直给师弟讲日新网有个牛B技术天才,今天你随便问问日新的技术部门,有谁不知道张伟的。
就像在美工领域我一直夸 韦海宝哥和谢满山 一样。
这样做的最大好处就形成一个偶像,起到一个有凝聚力的作用,形成老子说的“无为而治”,技术自然会很好,但这种方法千万不能直接套在 真实IT企业管理。
记住这些大牛、会让日新人更有归属感,会觉得这是一个家,日新不会忘记他们的

胖哥CNN
日新研发部没有让小组收购,必须感谢一个人,我的技术总监CNN。
他把很多优秀的人聚集在一起,才有今天的研发部。

07年为什么改版
当年网站改版,是我提出来的,川哥在顶住压力情况下支持了我。
到今天为止,有些人还不是很认同这次改版,没有关系;我当时是个新人,没敢说原因,但我今天要说,因为不说出来,研发部都要OVER了
大家都知道中国的核弹是在什么情况下做出来的吗?
啥也没有的情况下,没有人承认你是大国的情况下。
我提出改版的原因就是这个,让小组及交大的人都知道 日新的技术实力还是交大最牛B的。

技术人少夸夸其谈,多做事情
不要在任何地方以任何形式和对手争吵,我在日新的时候,是日新和小组争论最多的时候,你找找论坛的帖子,我几乎没有去争吵,小组的没落和争吵无关,日新的兴衰和争吵有很大的关系

技术的阶梯培养
阶梯培养是从我这一届开始的,准确点讲,现在日新网研发部很多东西都是我开始创立的,正是因为我很傻很天真,才有了我今天的很多经验。
今天的研发部,有很多不错的师弟,非常感谢这些师弟给我发来信息说搬迁这件事情,但不得不说,你们很多方向偏了,有点自我膨胀了,有时应该学会沟通。
有时应该把注意力放在我上面说的一些东西上面,我自认为我是有点人格魅力的,如果你也有人格魅力或是有点影响的话,我希望你的影响是好的,不要把欣赏你的人带到阴沟里,那样就不好了。

不要轻言放弃
辞职或是退出日新都应该是光荣的退出,毕业了。
我知道你们都是人才,我觉得人才就应该做人才干的事情,郁郁不得志、赌气,或是因为一些小事情就选择放弃这不是人才的思维方式

工作地点及工作环境真的很重要吗?
我不谈那些伟大的创业家,没有说服力。
说说我自己,我07年在北京是在高档写字楼里面工作的,08年回来以后在交大待了1年多,最近才搬到市区来的,不是我个人能力的问题,而是我觉得这些东西对你们及对我只是锦上添花的东西。

研发部的任何成员都应该有主人翁的精神,这里就是你的家,这里 有你很多志同道合的朋友
不要觉得你的力量很渺小,觉得你的存在没有意义,不要生活在日新老一辈程序员的光环之下
交大在未来的5年能不能吸引腾讯这样的企业到校内开招聘会
日新能不能变成微软愿意在清华设立的亚洲研究院
日新是不是一个带有IT技术标签的符号
这些东西都是你们可以控制的,如果你选择了放弃,这些美好的远景是不会实现的
我深知个人的力量很小,但我更相信“星星之火可以燎原“,你们离成功只差一步,放下手中的鼠标,开始搬家吧!

come on baby !

 

腾讯-1亿个数据取前1万大的整数-题解答

题目描述:
1亿个数据取前1万大的整数

常规思路:
运用数据结构里面描述的常规排序算法,快速排序法是常规排序中速度最快的

我的思路:
====我的机器太差,就不跑1亿数据了,1000000吧
1、把1亿个数据分成1000个数组,
2、求出1000个数组的最大值,保存到$max 数组中,
3、对$max本身用快速排序法排序 $max数组中保存了一个有序序列数组
4、遍历1亿个数据,依次对比$max最小的数据,如果比这个最小数据小,那么就依次对比$max的其他数据,从大到小开始对比,如果比max数组中的数据大,就替换。
5、获得10000个从大到小的数据$max.

代码:

< ?php
 
/**
 * 交换两个数据的值
 *
 * @param unknown_type $x
 * @param unknown_type $y
 */
function swap(&$x,&$y)
{
	$c = $x;
	$x = $y;
	$y = $c;	
}
 
/**
 * 快速排序函数
 *
 */
function quicksort( $arr, $l = 0 , $r = NULL ) {
    static $list = array();
    if( $r == NULL )
        $list = $arr;
 
    if( $r == NULL )
        $r = count($list)-1;
 
    $i = $l;
    $j = $r;
 
    $tmp = $list[(int)( ($l+$r)/2 )];
    do {
        while( $list[$i] < $tmp )
            $i++;
 
        while( $tmp < $list[$j] )
            $j--;
 
        if( $i <= $j ) 
        {
           swap($list[$i],$list[$j]);
           $i++;
           $j--;
        }
    }while( $i <= $j );
 
    if( $l < $j )
        quicksort(NULL, $l, $j);
 
    if( $i < $r )
        quicksort(NULL, $i, $r);
 
    return $list;
}
 
/**
 * 计算运行时间类
 *
 */
class timer 
{ 
	var $StartTime = 0; 
	var $StopTime = 0; 
	var $TimeSpent = 0; 
	function start()
	{ 
	  $this->StartTime = microtime(); 
	} 
	function stop()
	{ 
	  $this->StopTime = microtime(); 
	} 
	function spent() 
	{ 
	  if ($this->TimeSpent)
	  { 
	   		return $this->TimeSpent; 
	  }
	  else
	  { 
		   $StartMicro = substr($this->StartTime,0,10); 
		   $StartSecond = substr($this->StartTime,11,10); 
		   $StopMicro = substr($this->StopTime,0,10); 
		   $StopSecond = substr($this->StopTime,11,10); 
		   $start = doubleval($StartMicro) + $StartSecond; 
		   $stop = doubleval($StopMicro) + $StopSecond; 
		   $this->TimeSpent = $stop - $start; 
		   return substr($this->TimeSpent,0,8)."秒"; 
	  } 
	}
}//end class timer;
 
//构造1000000个数据的数组
// $number 拆分1000*1000数组
// $number2 1000000个数据的1维数组
 
for($i=0;$i< = 999;$i++)
{
	for($j=0;$j<=999;$j++)
	{
		$number2[] = $number[$i][$j] = rand(0,10000);
	}
}
 
$timer = new timer; 
$timer->start(); 
 
$max = array();
foreach ($number as $list)
{
	$maxvalue = 0;
	foreach ($list as $value)
	{
		if($maxvalue < $value)
		{
			$maxvalue = $value;
		}
	}
	$max[] = $maxvalue;
}
 
 
$max = quicksort($max,0);
for($i=0;$i < 1000000;$i++)
{
		//如果数组的数据大于max最小值,则从大到小对比其他数据
	if($number2[$i] >$max[0])
	{
		for ($k=999;$k>=0;$k--)
		{
			if($max[$k] < $number2[$i])
			{
					//替换数据
				$max[$k] = $number2[$i];
				break;
			}
		}
	}
}
 
$timer->stop(); 
 
echo '第一次排序时间:'.$timer->spent();
/*print_r($max);*/
$timer2 = new timer();
$timer2->start();
quicksort($number2,0);
$timer2->stop();
echo '第2次排序时间:'.$timer2->spent();
/*print_r($number2);*/

运行结果:
第一次排序时间:2.370435秒
第2次排序时间:38.43304秒

ps:
运行时间可能有所变化,我是在几年前的笔记本上测试的,不过显然第一次排序结果速度更快

 

基于trie数据字典的php中文分词

keywords:中文分词、PHP中文分词、trie数据结构、Doubule Array Trie Datastruct
原理:
Trie数据结构的名词介绍我就不介绍了,大家google,百度可以搜索一大堆的文章来.
Tire索引树法
结构:首字散列表、Trie索引树结点
优点:分词中,不需预知待查询词的长度,沿树链逐字匹配。
缺点:构造和维护比较复杂,单词树枝多,浪费了一定的空间。

有时间我会写一个双数组trie的中文分词小程序来,下面来最简单的trie,
代码:

< ?php
/**
 * @version 0.1
 * @todo 构造通用的字典算法,并写了一个简易的分词
 * @author shjuto@gmail.com
 * Trie字典树
 *
 */
class Trie
{
	private $trie; 
 
	function __construct()
	{
		 $trie = array('children' => array(),'isword'=>false);
	}
 
	/**
	 * 把词加入词典
	 *
	 * @param String $key
	 */
	function &setWord($word='')
	{
		$trienode = &$this->trie;
		for($i = 0;$i < strlen($word);$i++)
		{
			$character = $word[$i];
			if(!isset($trienode['children'][$character]))
			{
				$trienode['children'][$character] = array('isword'=>false);
			}
			if($i == strlen($word)-1)
			{
					$trienode['children'][$character] = array('isword'=>true);
			}
			$trienode = &$trienode['children'][$character];
		}
	}
 
	/**
	 * 判断是否为词典词
	 *
	 * @param String $word
	 * @return bool true/false
	 */
	function & isWord($word)
	{
		$trienode = &$this->trie;
		for($i = 0;$i < strlen($word);$i++)
		{
			$character = $word[$i];
			if(!isset($trienode['children'][$character]))
			{
				return false;
			}
			else 
			{
				//判断词结束
				if($i == (strlen($word)-1) && $trienode['children'][$character]['isword'] == true)
				{
					return true;
				}
				elseif($i == (strlen($word)-1) && $trienode['children'][$character]['isword'] == false)
				{
					return false;
				}
				$trienode = &$trienode['children'][$character];	
			}
		}
	}
 
 
	/**
	 * 在文本$text找词出现的位置
	 *
	 * @param String $text
	 * @return array array('position'=>$position,'word' =>$word);
	 */
	function search($text="")
	{
		$textlen = strlen($text);
		$trienode = $tree = $this->trie;
		$find = array();
		$wordrootposition = 0;//词根位置
		$prenode = false;//回溯参数,当词典ab,在字符串aab中,需要把$i向前回溯一次
		$word = '';
		for ($i = 0; $i < $textlen;$i++)
		{
 
			if(isset($trienode['children'][$text[$i]]))
			{
				$word = $word .$text[$i];
				$trienode = $trienode['children'][$text[$i]];
				if($prenode == false)
				{
					$wordrootposition = $i;
				}
				$prenode = true;
				if($trienode['isword'])
				{
					$find[] = array('position'=>$wordrootposition,'word' =>$word);
				}
			}
			else 
			{
				$trienode = $tree;
				$word = '';
				if($prenode)
				{
					$i = $i -1;
					$prenode = false;
				}
			}
		}
		return $find;
	}
}
$trie = new Trie();
$trie->setWord('中国');
$trie->setWord('中国人');
$trie->setWord('伟大');
$trie->setWord('军队');
$trie->setWord('中国人民');
$trie->setWord('中国人民解放军');
$trie->setWord('解放军');
$trie->setWord('解放');
$words = $trie->search('伟大的中国人民解放军解放了全中国,是很伟大的军队');
foreach ($words as $word)
{
	echo '位置:'.$word['position'].'-'.(strlen($word['word'])+$word['position']);
	echo '  词:'.$word['word']."\n";
}

运行结果:
位置:0-6 词:伟大
位置:9-15 词:中国
位置:9-18 词:中国人
位置:9-21 词:中国人民
位置:9-30 词:中国人民解放军
位置:30-36 词:解放
位置:42-48 词:中国
位置:55-61 词:伟大
位置:64-70 词:军队
———————————————————————
以前研究过分词的人,很容易发现这个分词还是不足的,但是对于想了解中文分词的基本原理的同学可以参考一下。
分词结果不够准确,”解放军”都没有分出来,原因嘛,是最大匹配“中国人民解放军”以后,我直接把$word轻松了,你可以修改search函数的代码,以优化分词结果

 

腾讯php程序员面试题目答案——编程任务

编程任务:
1、 我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在 第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧。
要求如下:
1)/myworks /example/bbe.txt,98版本英文圣经一本
2)输入部分要求如下:php ./example.php [单词]
3)输出部分如下:[单词] 1,2 2,4 5,6 表示:此单词在1行2列(第二个单词),2行4列…
说明:
1)此文本 4MB之巨…
2)单词的含义:由英文字母(大小写),数字(0-9)组成的串
3)提供给你的机器OS为ubuntu 9.10,内存只有1G,而且,很不幸的,其中700M用来做了别的
4)上机考试不允许上网,但我装了man文档以及读取CHM以及PDF的 阅读器,在电脑的桌面的CHM文件夹中,有相应的PHP参考手册
5)算法复杂度要求不能大于O(N^2)(就是N的平方)
6)什 么?PHP低效且用起来不顺手,好的,你可以用别的语言来实现。但注意:提供给你的机器上只有python 2.4/perl 5.8/gcc[g++]

题目链接:http://www.xhttp.cn/2010/05/2

——————————————————————————————————————————————

分析问题:
典型的字典算法,或是分词算法,好在是英文圣经程序可以少些几行代码
1、建立字典,也就是要找的词,比如 fuck,baby,come,on -_- 估计BBE里少有这样的很黄很暴力的词汇
2、因为对内存有要求,其实这个时候可以分章节查找,就是载入内存允许的章节
3、算法时间度o(n)吧,可以一次查找多个词汇

贴我的代码:

< ?php
/**
 * @author shjuto@gmail.com
 * Trie字典树
 *
 */
class Trie
{
	private $trie; 
 
	function __construct()
	{
		 $trie = array('children' => array(),'isword'=>false);
	}
 
	/**
	 * 把词加入词典
	 *
	 * @param String $key
	 */
	function &setWord($word='')
	{
		$trienode = &$this->trie;
		for($i = 0;$i < strlen($word);$i++)
		{
			$character = $word[$i];
			if(!isset($trienode['children'][$character]))
			{
				$trienode['children'][$character] = array('isword'=>false);
			}
			if($i == strlen($word)-1)
			{
					$trienode['children'][$character] = array('isword'=>true);
			}
			$trienode = &$trienode['children'][$character];
		}
	}
 
	/**
	 * 判断是否为词典词
	 *
	 * @param String $word
	 * @return bool true/false
	 */
	function & isWord($word)
	{
		$trienode = &$this->trie;
		for($i = 0;$i < strlen($word);$i++)
		{
			$character = $word[$i];
			if(!isset($trienode['children'][$character]))
			{
				return false;
			}
			else 
			{
				//判断词结束
				if($i == (strlen($word)-1) && $trienode['children'][$character]['isword'] == true)
				{
					return true;
				}
				elseif($i == (strlen($word)-1) && $trienode['children'][$character]['isword'] == false)
				{
					return false;
				}
				$trienode = &$trienode['children'][$character];	
			}
		}
	}
 
 
	/**
	 * 在文本$text找词出现的位置
	 *
	 * @param String $text
	 * @return array array('position'=>$position,'word' =>$word);
	 */
	function search($text="")
	{
		$textlen = strlen($text);
		$trienode = $tree = $this->trie;
		$find = array();
		$wordrootposition = 0;//词根位置
		$prenode = false;//回溯参数,当词典ab,在字符串aab中,需要把$i向前回溯一次
		$word = '';
		for ($i = 0; $i < $textlen;$i++)
		{
 
			if(isset($trienode['children'][$text[$i]]))
			{
				$word = $word .$text[$i];
				$trienode = $trienode['children'][$text[$i]];
				if($prenode == false)
				{
					$wordrootposition = $i;
				}
				$prenode = true;
				if($trienode['isword'])
				{
					$find[] = array('position'=>$wordrootposition,'word' =>$word);
				}
			}
			else 
			{
				$trienode = $tree;
				$word = '';
				if($prenode)
				{
					$i = $i -1;
					$prenode = false;
				}
			}
		}
		return $find;
	}
}
$trie = new Trie();
$trie->setWord('fuck');
$trie->setWord('you');
$trie->setWord('come');
$trie->setWord('on');
var_dump($trie->isWord('fuck'));
var_dump($trie->isWord('a'));
var_dump($trie->isWord('db'));
var_dump($trie->isWord('comeon'));
var_dump($trie->isWord('you'));
print_r($trie->search('hello,tencent,i tell you sonme about bbe,
fuck you come on baby,come on,baby,baby,come on,tellgyou fuckdkkdkflsjflsjf'));

写的比较乱,代码应该还有很大的优化余地,不过足以说明Trie树的基本思想了,我如果有时间的话,会写一个中文分词的例子.
欢迎拍砖

 
 
About This Website

Lamp development & SEO & Plan of Website & Project Managment

Learn more »
Follow Us (SNS)
Help & Support

more about Bruce.xu»

Get in touch

QQ: +252339382
Email: shjuto @ gmail.com

Online contact form »