帐前卒专栏

code, software architect, articles and novels.
代码,软件架构,博客和小说

google 将7年前的索引拿了出来,现在大家可以输入各种关键字看看过去的互联网世界。

不过google也有没有爬到的地方。不过Google的这个活动还是蛮新奇的。

Hey!everybody, we are looking back the history!

使用GOOGLE 2001的索引,发现7年前的网络是啥样的,来个今昔大对比,对比那可是真是相当惊人呐。
_ http://www.google.co m/search2001.html _

主要是关于树立自信的,其实我也知道很多学生是调剂到湖大软件学院的。这点和我有很大的不同。因为我第一志愿就是软件学院。天知道我当时是怎么想的。估计是感觉计科太
接近硬件了吧。

不过不管怎样,既然进来了就要好好学。否则耽误4年,太不值了。

_ ppt下载地址 _

已经过去半年了,将自己的东西整理整理都贴到网上来吧。

_ 实习总结下载 _

csdn上传文件还是很方便的。

这是自己的毕业设计论文。

其实算法感觉上也没有什么高深的,只是至今还没有用那个算法而已。

前一个算法是导师想到的,后一个算法是自己看了大量的论文发现还为提出的。

这篇论文估计已经存在在湖大的档案室中了。

本来想投稿到某个杂志发表一下。但是自己迟迟未整理文章,没有将文章缩减至7000字一下。所以发表的概率也不大。

而且还要交版面费。索性发表到csdn,供各位做电子地图的人参考一下。

电子地图的前台代码即将开源。但是写的不好,大家也不要有太高的期望。我感觉那javascript运行的太慢了。

也可能是传输和画图的地方没有设计好。另外也使用的开源的javascript画图包。

后台代码的算法部分开源。因为还有一些是阿咪写的。

暂且就写这么多吧。

_ 先把论文挂上。 _
这里资源分是0,所以只要是注册用户都可以下载。

心存叵测之人勿将此文当作自己的毕设论文。因为我会写大量的关键词来让Google索引的。(__) 嘻嘻……

在暑假里为One编程组设计的logo

里面有One编程组组建宗旨:

Open Share

然后环绕一圈的就是One这个词了

意为统一整体。

编程组成员以后可以使用这个logo,扩大One编程组的影响。呵呵。

![](http://p.blog.csdn.net/images/p_blog_csdn_net/cctt_1/EntryImages/20081006/
OneGroup.png)

Google做图片它也防了一手。

在不同的图层水印不知道是否相同,不过这个图层的水印比较清晰。黑框中的便是。但是缩放后就了无痕迹。

![google 水印图片](http://p.blog.csdn.net/images/p_blog_csdn_net/cctt_1/EntryImage
s/20081004/google.JPG)

这个是美国的硅谷。不远处就是Google的前沿阵地。据说那个地方是用来挖微软墙角用的。

[ ](http://p.blog.csdn.net/images/p_blog_csdn_net/cctt_1/EntryImages/20081004/
google.JPG) [ ](http://p.blog.csdn.net/images/p_blog_csdn_net/cctt_1/EntryImag
es/20081004/google.JPG)

1.首先设置ubuntu中的网络配置,使用ifconfig查看

2.这个已经帮我配好了。但是怎么都ping不通网关。使用network-admin命令调出网络管理界面

3.输入密码unlock这个界面。然后选择wired connection。发现也是使用的dhcp。

4.现在仍然没有找到问题。在网络上找了很久依旧没有发现什么启示。无奈只得乱点,在wired connection的property选项卡选中了enable
roaming mode。

5.奇迹呀。竟然可以ping通网关了。

6.然后去掉enable roaming mode,竟然也是可以ping通的。

这个做的实在是太高科技了。

不过这个暂时好像只适合我的机器。不知道别人的机器有没有这个问题。

ubuntu 8.0

VMware 6.0

当你的一个类与某一个类的时候,只需要将你这个类中特有的变量析构就可以了

你不要在关心继承类中的变量。

上午编码

SplayTree继承了BinaryTree

其中没有任何自己特有的成员变量。

然后在~SplayTree()中写到clearSubTree(this->head);

其实这一句已经在~BinaryTree()中写过了。

结果就抛了个exception。

于是刚刚考虑下virtual虚构函数。发现自己没有使用到多态,只是想把代码重用,也就没有再使用virtual的必要。

或许以后在考虑下这几个树之间的错综复杂的关系。

现在把~SplayTree()中的内容清空。

一切恢复正常。

伸展树用于查询结果的概率非平均情况,即起初假设某些要查询的信息偏多,有些信息几乎无人问津。对于平均访问概率来说,使用SplayTree实现并不是一个明智的选
择。

可能会用到此数据结构的程序:词典或者多维搜索树,还有连接/切除树(link/cut tree)(这个树是用于网络优化问题包括最大流和最小代价)

  1. /*
  2. * create by chico chen
  3. * date: 2008/10/02
  4. */
  5. template < class T>
  6. class SplayTree: public BinaryTree
  7. {
    1. public :
  8. explicit SplayTree(T& data):BinaryTree(data)
  9. {
    1. }
    1. explicit SplayTree(TreeNode* root):BinaryTree(root)
  10. {
    1. }
  11. ~SplayTree()
  12. {
    1. }
  13. public :
    1. void insertNode(T& data)
  14. {
    1. if (NULL == this ->head)
  15. {
  16. this ->head = new TreeNode(data);
  17. return ;
  18. }
    1. splay( this ->head,data);
  19. if ( this ->head->data > data)
  20. {
  21. //     A     B                 A
  22. //            / /     ->         / /
  23. //         C   D             C   B
  24. //                                /
  25. //                                 D
  26. TreeNode* node = new TreeNode(data);
  27. node->left = this ->head->left ;
  28. node->right = this ->head;
  29. this ->head->left = NULL;
  30. this ->head = node;
  31. }
  32. else if ( this ->head->data < data)
  33. {
  34. //     A     B                 A
  35. //            / /     ->         / /
  36. //         C   D             B   D
  37. //                              /
  38. //                            C
  39. TreeNode* node = new TreeNode(data);
  40. node->right = this ->head->right;
  41. node->left = this ->head;
  42. this ->head->right = NULL;
  43. this ->head = node;
    1. }
  44. else
  45. {
  46. // insert the same key
  47. // throw exception
  48. throw “the same key” ;
  49. }
  50. }
    1. // use the data as key to splay the tree
  51. // then we can get the structures of the tree like the following:
  52. //     (1)  A             (2)   A
  53. //              /                    / /
  54. //               B               C   B
  55. // the difference between the two structures is whether the root has left child
  56. // In case (1), we can simpliy make the root right child instead the root.
  57. // In case (2), we should splay the root left subtree and then it will be
  58. // changed like case (1), and we make the splayed left subtree root instead
  59. // the root.
  60. void deleteNode(T& data)
  61. {
    1. if (NULL == this ->head)
  62. {
  63. return ;
  64. }
  65. splay( this ->head, data);
  66. if ( this ->head->data != data)
  67. {
  68. // not found the key to delete
  69. return ;
  70. }
  71. TreeNode* newRoot;
  72. if (NULL == this ->head->left)
  73. {
  74. newRoot = this ->head->right;
  75. }
  76. else
  77. {
  78. newRoot = this ->head->left;
  79. splay(newRoot,data);
  80. newRoot->right = this ->head->right;
  81. }
  82. delete this ->head;
  83. this ->head = newRoot;
    1. }
      1. TreeNode* searchNode(T& data)
  84. {
  85. if (NULL == this ->head)
  86. {
  87. return NULL;
  88. }
  89. splay( this ->head, data);
  90. if ( this ->head->data == data)
  91. {
  92. return this ->head;
  93. }
  94. return NULL;
  95. }
    1. private :
  96. // use top-down splay method,
    1. // you should make the suitable final step
  97. // according to the situation, such as “insert”, “delete”, “search”.
  98. // And what’s the top-down method?
  99. // now we should add LeftMaxRoot as L and RightMinRoot as R
  100. // 1. L  A  R         2. L  A  R        3. L   A   R
  101. //         /                        /                      /
  102. //        B                     B                     B
  103. //                               /                          /
  104. //                              C                          C
  105. //
  106. // 1.->L  B  R      2.->L  C   R        3.L   C    R
  107. //        /                     /                          /      /
  108. //     A                    B                         B    A
  109. //                             /
  110. //                              A
  111. // but in case 3. we can simplified case 3 rotate as
  112. // 3. L   B      R
  113. //            /      /
  114. //            C  A
  115. // and we must integrate the LeftMaxRoot and RightMinRoot together,
  116. // then we have final step to do this. And L is left tree, and R is right tree.
  117. // L     A     R               A
  118. //         / /         ->         /   /
  119. //       B   C                L     R
  120. //                                 /   /
  121. //                                B C
  122. void splay(TreeNode* &subRoot,T& data)
  123. {
  124. if (NULL == subRoot)
  125. {
  126. return ;
  127. }
  128. TreeNode* leftRoot;
  129. TreeNode* rightRoot;
  130. // here some code use static member, if you promise you have sync-control
  131. // or you don’t use this code in thread or process, you could choose static
  132. // member to accelerate your program.
  133. // It means the following code is thread-safe.
  134. TreeNode head(data);
  135. leftRoot = rightRoot = &head;
  136. while ( true )
  137. {
    1. if (data < subRoot->data)
  138. {
  139. if (NULL == subRoot->left)
  140. {
  141. break ;
  142. }
  143. else if (data < subRoot->left->data)
  144. {
  145. // Left rotate
  146. TreeNode* tempLeft = subRoot->left;
  147. subRoot->left = tempLeft->right;
  148. tempLeft->right = subRoot;
  149. subRoot = tempLeft;
    1. }
  150. else
  151. {
  152. // do nothing
  153. }
  154. // split the tree with right root
  155. if (NULL == subRoot->left)
  156. break ;
  157. rightRoot->left = subRoot;
  158. rightRoot = subRoot;
  159. subRoot = subRoot->left ;
    1. }
  160. else if (data > subRoot->data)
  161. {
  162. if (NULL == subRoot->right)
  163. {
  164. // need not to rotate
  165. break ;
  166. }
  167. else if (data > subRoot->right->data)
  168. {
  169. // right rotate
  170. TreeNode* tempRight = subRoot->right;
  171. subRoot->right = tempRight->left;
  172. tempRight->left = subRoot;
  173. subRoot = tempRight;
  174. }
  175. else
  176. {
  177. // do nothing
  178. }
  179. // split the tree by left root
  180. if (NULL == subRoot->right)
  181. break ;
  182. leftRoot->right = subRoot;
  183. leftRoot = subRoot;
    1. subRoot = subRoot->right;
  184. }
  185. else
  186. {
  187. // the same key
  188. break ;
  189. }
    1. }
    1. // the final step
  190. // we have find the last node, ant then we should
  191. // integrate the left root, the right root and the root into One tree.
  192. // head.right is left root
  193. // head.left is right root
  194. leftRoot->right = subRoot->left;
  195. rightRoot->left = subRoot->right;
  196. subRoot->left = head.right;
  197. subRoot->right = head.left;
      1. }
          1. };

发现CSDN的代码编辑器还是有些问题,空格处理不好,导致我注释中的树形错乱了…

不过没有大关系,应该抓起旁边的纸边看边画就能明白。

在网上找splayTree的源码学习,发现凭自己的实力还真的看不懂…

幸好在家里翻到了古老的数据结构教材。这才明白。

至于不使用添加父节点或者采用递归栈等方式的原因在于:空间消耗太大。

另外递归栈也不好调试

这个top-down splay的方法消耗空间为O(1),带来的效果却和添加父节点类似,没有使用递归的方法。

至于具体的方法,在代码的注释里。

这里为了编代码方便就没有将treeNode 类中的成员变量私有化。

另外的BinaryTree的代码在 _ 以前的blog中 _

这个splayTree还是较为完整的,至少比Apache中的splayTree完整些。现在我依旧不明白为什么Apache中的内存管理使用的是splayTre
e,而且splayTree还没有delete函数。难道内存管理的东西没有必要删除吗?

思考中…

想想大学来做的项目也做了很多个了。。其中也包括各类课程设计

1.CAI(c语言教学系统)使用C语言开发。功能图形化的界面指导C语言教学。自己认为失败。 但是学到C的图形编程
。(成员:剑哥,老万,少博)开发环境:TurboC2.0。职位:组长。自己完成的任务:c教学图形界面。

2.学生机房监控系统 (MFC开发)。功能监控各个学生的上机情况,并可以关闭学生的某个进程,锁定或者学生机。失败。
学到团队培训,团队管理的技巧,如何采用其他解决方案解决棘手问题。
(成员:剑哥,阿咪,波波,小李子,小强)开发环境:VC6.0。职位:组长。自己完成的任务:实现MD5c++版,需求和程序大体框架图。

3.多对多聊天系统(java开发)。失败。功能类似于QQ,可以进行公聊私聊。最后只是实现了公聊,没有实现私聊。
学到java多线程和socket编程的一些概念。 (成员:晔,武大姐,阿咪)开发环境:eclipse3.0,
jdk1.4。职位:组长。自己完成的任务:公聊模块。

4.实验室管理系统(.net开发)。半失败。功能??只是将原有的系统更加完善,但我现在仍然不知道那东西扔到什么地方了。 学到如何快速的学习一门语言。(
成员:中华兄,小刚,疯子,汤亮学长)开发环境:vs2003。职位:组员。自己的任务:找bug和Sql语句的改动。

5.个性化学习系统(J2EE)。失败。功能可以管理课程,可以对学生进行管理,对学生的选课进行管理。将原系统从Oracle迁移mySql,从WebLogic迁
移至JBoss。 学到如何收集资料自己学习,如何利用团队成员的资源。 (成员:汤亮学长,浩哥,中华兄,小刚,疯子)开发环境:JBoss4,eclipse
3.0,Jbuilder9,WebLogic8,Oracle9i,mySql,myEclipse,Rational
Rose2003。职位:组员。自己完成的任务:平台迁移工作,用户管理部分的bug修复和程序框架UML图

6.湘钢设备管理系统(.net)。半失败。功能可以对湘钢备件台帐储备系统自动化。
学到如何增强团队凝聚力,团队间如何协作,如何制作模板,如何讲课,如何与人沟通,如何请求别人帮助
。(创新班全体。本组成员:波波,疯子,yaya,小李子,剑哥,中华兄,小刚,广胜,老万)开发环境: vs2005 Team System
,vs2005,Rational Rose2003.职位:组员。自己实现的模块:台帐查询删除回收页面和用户视图订制。

7.咨询投诉系统(.net).半失败。功能ms是处理投诉。关于 学到如何分工,如何独挡一面。有时不能因为组员的不积极而放弃整个项目。(
成员:华仔,菲菲,小可,雪山)开发环境:.net2005,Rational Rose2003.职位:组长。自己实现的部分:页面层和业务逻辑层

8.光盘管理系统(.net).半失败。功能:光盘管理,会员管理。 学到如何软件体系结构复用,如何快速的开发软件。
开发环境:.net2005,Rational rose2003.自己完成

9.档案管理系统(J2EE)。成功。功能就是管理档案、管理成员、审批流程。 学到如何使团队高效的开发软件,如何采取措施来控制软件进度,如何协调成员。(
成员:兴隆,波~,军~,帅子,睿)开发环境:tomcat5,eclipse3.1,myeclipse,mysql.职位:组长。自己的任务:用户管理非页面的整
个模块,测试文档和测试用例。

10.动态交通网络1.0(MFC).成功。 学到如何在线交流思想,如何在没有代码管理的情况下完成项目,如何配合成员,如何表达自己的想法。
(成员:红亮,阿咪)开发环境:vs2005.职位:无。自己的模块:数据结构层

11.人脸识别系统(Matlab).正在… 学到如何独立的完成项目,如何通过别人的经验来快速的完成任务,如何写学术报告。(
成员:锦哥)开发环境:MatlabR2006b。自己的任务:除去最后论文剩下的所有工作。

12.Mini数据库管理系统.成功。这个项目 后成为下一届以至以后若干届的教学实例项目。
功能:实现数据库表的创建,删除,更新,数据的增,删,查,改,支持表的主键外键,保证数据一致性。采用索引提高查询效率。
学习到如何结对编程,运用快速开发迭代。如何减少风险。如何发挥每一个成员的特长。如何在最短时间获得最大"收益" 这是迄今为止自己领导的最为成功的一个项目。小
宁哥说要推广到北大去。呵呵,如果真是这样,我就出名了。(成员:军~,福勇,圆圆)开发环境:VS2005,rationalRose
2003.自己的任务:数据结构层和核心层,以及界面层的若干行代码。

13.VisualDiff图片自动对比系统(C#,javascript)。成功。功能: 差异图片人工对比后当作bug上传到Product
Studio。运用在Taipan项目测试阶段。支持图像部分掩盖和图像版本的历史记录 。 学会如何在未知的领域独立完成任务。
这是当微软实习生时完成的项目。 这个项目导师给我5个月,后来1个月完成了。令导师吃惊不已,由于这个原因获得微软FTE面试机会。开发环境vs2005。

14.PSSP同步工具(C#)。成功。功能:ProductStudio到SharePoint上的内容同步工具。 学会如何看微软文档以及别人的API文档。
开发环境vs2005。自己完成。

15.自动化压力测试工具(C#,dos
script).成功。功能:运用在微软Taipan项目发布测试阶段。产生大量用户,自动执行程序主要路径,用log记录这些用户的活动。
学会如何自己找任务,如何在别人任务繁忙无法全局考虑的时候,站出来指出团队还有啥事没有做 。开发环境:VS2005。自己完成。

16.公交车查询系统web版(C#,javascript)。成功/不成功。功能:类似于 动态交通网络1.0,但是迁移到web平台。
学会如何写大规模javascript代码。如何对比结果。如何查阅大量文献提出自己的想法。 这个系统的 javascript代码几乎是我崩溃。幸好全是我写
的。成功是因为毕业论文因此得优。不成功是因为自己认为这个系统的构建公交车网络的页面无法容纳大量数据。(成员:阿咪)职务:无。自己的任务:自己的论文写作,ja
vascript页面层代码的开发,公交选路算法的实现,算法的对比。

17.数字签名工具(c++)。成功。功能:防止学生伪造分数,要求改分。 学到如何考虑自己身边的小事,用程序改善自己的生活学习工作状态。
用于我当数据结构课程助教时期。这个不能称上项目应该叫做程序。因为代码量在千行以下,但是这个工具非常实用。所以这里提及。自我完成。

18.计算器工具(c++),其实微软自带了计算器,但是每按一个数就要再按一次运算符。我认为这是失败的一次迁移。因为算式较长,我很难记得自己按到那个地方了。所
以实现了可以计算字符串算式的计算器。当然google的文本框也可以计算字符串算式。但是我和它的相比较,发现精度比它稍高些。不过怎么说也只是个计算器,用于偶尔
无聊的时候炫耀一下。功能用于计算字符串算式。

19.分类器(java).成功。功能:用于网页中的文本分类。可以自动的判断类别。使用的是搜狗的新闻库。bayes正确率高达83%~85%左右,另外还有svm
分类(可惜大规模的时候最多达到30%),knn分类(支持多类)。界面华丽适合自娱自乐。学会看别人的代码(类似于看完后,全部重写)。
成功是因为这个项目提前做完,而且分类效果也不错,另外结交了不错的朋友 。(成员:振华,牛mm)职务:组长。这个项目的缺点在于没有合理的架构的时候就提前动工
。所以最后的整合至少花掉了9*3个人时。我从下午一直整合到凌晨。痛不欲生,下次再做项目,谁要敢在没有架构的时候就编代码,一定饶不了他!

20.中文分词(python).成功。功能:将一篇文章中的句子进行分词。使用的是人民日报词库。最后分词中未登录词处理使用的是相同词性词合并原则。因为使用这一
原则使得最后的分词数大大减少。最后发现,其实动宾短语,动名词短语等还可以再细处理。分词采用的是FMM和一元非统计nbest算法进行粗分。后采用二元模型得到最
好的结果。然后使用此结果在对词性进行标注。最后根据词性再合并分词。发现python确实好用。
成功是因为这个项目在短短的不到一周的时间内搞定。而且效果不错。分词正确率80%以上,词性标注正确率和北大的分词系统不相上下。 (成员:牛mm).这个项目的
缺点在于最后使用一个python文件。另外也没有很好的分词和标注的标准答案。所以只能根据北大的分词来统计最后的结果。这个项目因为较小,而且属于摸着石头过河。
所以没有进行架构。的确不符合第19个项目得出的结论。并且因为牛mm的缘故,所以不能计入一般的软件工程方法论。

0%