在自己离开大学校园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亿数据了,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:
运行时间可能有所变化,我是在几年前的笔记本上测试的,不过显然第一次排序结果速度更快
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函数的代码,以优化分词结果
编程任务:
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树的基本思想了,我如果有时间的话,会写一个中文分词的例子.
欢迎拍砖