会员
周边
众包
新闻
博问
闪存
赞助商
Chat2DB
所有博客
当前博客
我的博客
我的园子
账号设置
会员中心
简洁模式
...
退出登录
注册
登录
Tiancai Ye
Algorithm: The Soul of Programming
博客园
首页
新随笔
联系
订阅
管理
2016年6月23日
自己动手从零写mmo游戏服务器
摘要: 不知不觉进入游戏行业工作已近一年,在这一年的时间里,除了繁忙的完成策划的逻辑需求,我也一直在思考一个问题:一个支持横向扩展的mmo游戏服务器,其底层实现到底是怎样的呢?当然,既然都已经在公司待了近一年时间,对其架构和实现肯定都是有一定了解了,但是没有具体实现过,永远都只是纸上谈兵,对其思考总不可能深
阅读全文
posted @ 2016-06-23 00:02 Tiancai Ye
阅读(5879)
评论(5)
推荐(2)
2015年4月23日
markdown写博客
摘要: 不说了 latex公式$$s = a b + c$$ 这个是插入代码
阅读全文
posted @ 2015-04-23 20:03 Tiancai Ye
阅读(153)
评论(0)
推荐(0)
2014年4月10日
最大子序列和:一道题窥探分治与动态规划
摘要: 最大子序列和,这是个再经典不过的题目了,而且这一道题可以分别用分治法,动态规划来做(时间复杂度分别为O(n*lg(n))和O(n))。题目就不再赘述了,直接上代码:首先是分治法: 1 #include 2 #include 3 4 using namespace std; 5 6 struct Tag 7 { 8 Tag(int _lowmark, int _highmark, int _sum) 9 {10 lowmark = _lowmark;11 highmark = _highmark;12 sum = _sum;...
阅读全文
posted @ 2014-04-10 15:51 Tiancai Ye
阅读(200)
评论(0)
推荐(0)
与Merge Sort相关的两题
摘要: 1. 给定一个包含n个整数的数组a和一个整数x,判断数组中是否存在两个元素相加刚好等于x2. 反转数对:对于一个数组A[1...n],n个元素都各不相同。如果i A[j],就称为A的一个反转数对。在O(n*lg(n))的时间内找到A有多少反转数对。这两个题目都可以使用分治的思想,关键是在O(n)的时间内merge。这两题并不容易联想到用分治,主要在于,merge的时候,还要进行一次类似merge_sort一样的排序才能在O(n)内完成对原问题的merge,拐了点弯,不太容易想到。上源码:第一题: 1 #include 2 #include 3 4 using namespace std...
阅读全文
posted @ 2014-04-10 11:16 Tiancai Ye
阅读(181)
评论(0)
推荐(0)
2014年1月11日
寒假读书计划
摘要: 以前上算法课的时候,许多都没听懂,当时也不以为然,感觉这些算法离应用太远,可能百八十年都用不到,所以也就准备到过了考试而已,并没有深入理解。最近又拿起算法导论看了看,发现算法真的是程序的灵魂,研读了一些章节后发现,原来我以前写的那些代码是那么的低质量,不管是效率还是清晰度上讲。所以我到现在才明白,算法为什么是计算机专业的学生必修的课程,学好它终生受用。不过话又说回来了,如果我不读研,只是去做一些逻辑上的程序,那么也不会认识到这些,所以一个人对事物的理解都是随着一个人的阅历而逐渐完善改变的。而且,我还发现,打好基础真的很重要。算法考试前,我也尝试过突击图论,但是始终感觉图论好难,当时也就简单的记
阅读全文
posted @ 2014-01-11 13:37 Tiancai Ye
阅读(290)
评论(0)
推荐(0)
2014年1月7日
图算法(5)-最小生成树(Prim, Kruskal)
摘要: 最小生成树算法实际上就是一个不断添加safe edge,直到当前的最小生成树包含所有节点为止,如果算法停止时,还有没有访问的节点,说明该图是不连通的,返回-1。当算法运行完毕,最小生成树的边即为每个节点与p的边。prim算法:首先是数据结构的定义: 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 struct Edge 8 { 9 int end;10 int weight;11 12 bool operator other.weight;15 }16 };17 18 stru...
阅读全文
posted @ 2014-01-07 21:38 Tiancai Ye
阅读(322)
评论(0)
推荐(0)
图算法(4)-强连通分量
摘要: 一个图的连通分量即是这样的一个顶点集合,其中各个节点直接都可以相互到达连通。而强连通分量则是这样一个集合的极大值,即:添加任何另外节点,这个集合都不再是连通分量。计算强连通分量,可以先对原图进行一次DFS遍历,计算得到每个节点的finish time。然后计算转置图,并对转置图进行DFS遍历(其中遍历的主循环,按照原图节点的finish time逆序),这样对转置图DFS遍历得到的每一棵深度遍历树的节点即为一个强连通分量。算法如下:(用cout输出了强连通分量,每个强连通分量一行,DFS函数与前面相同,只是在最开始一行输出了当前节点) 1 void GraphTranspose(Graph&a
阅读全文
posted @ 2014-01-07 16:01 Tiancai Ye
阅读(331)
评论(0)
推荐(0)
图算法(3)-图的拓扑排序
摘要: 什么是拓扑排序?设想有这样一种情形:Tom早上起床穿衣服,但是穿衣服有一些限制,比如穿夹克前,必须先打好领带,穿皮带前必须先穿好裤子吧?这样,由穿衣顺序的依赖关系,可以构成一个图,图一条边就代表了一个依赖关系,end节点依赖begin节点。那么我们应该确定怎样的一个穿衣顺序,以保证所有限制都满足呢?这就是一个典型的拓扑排序问题。拓扑排序可以在深度优先遍历的基础上很容易的实现,首先对图进行一次深度优先遍历,然后按照节点的完成时间排序即可,完成时间越晚,则越排序在前,需要提前完成。(算法正确性的具体证明请看算法导论22.4)在前面代码的基础上,我实现的拓扑排序如下: 1 bool cmp(Node
阅读全文
posted @ 2014-01-07 15:04 Tiancai Ye
阅读(278)
评论(0)
推荐(0)
图算法(2)-深度优先遍历
摘要: 深度优先遍历中,我们使用的数据结构与上一讲基本相同,除了Node做了修改:1 struct Node2 {3 std::string value;4 std::vector edges;5 int d;6 int f;7 int p;8 Color color;9 };这里d表示discovery time,记录节点首次被遍历到的时间,f表示finish time,记录节点遍历完成返回的时间。算法中使用了一个全局变量time,目的是为了打上时间戳: 1 int time; 2 3 void DFS(Graph& g, int u) 4 { 5 ...
阅读全文
posted @ 2014-01-07 14:30 Tiancai Ye
阅读(218)
评论(0)
推荐(0)
图算法(1)-广度优先遍历
摘要: 图的广度优先遍历其实并不难,当边的权重相同时,由图的广度优先遍历可以得到其余节点到源节点的最短路径。我使用了邻接表实现了这个算法。首先来看看图的数据结构的定义: 1 struct Edge 2 { 3 int end; 4 }; 5 6 enum Color {WHITE, GRAY, BLACK}; 7 8 struct Node 9 {10 std::string value;11 std::vector edges;12 int d;13 int p;14 Color color;15 };16 17 struct Graph18 {1...
阅读全文
posted @ 2014-01-07 14:02 Tiancai Ye
阅读(571)
评论(0)
推荐(0)
下一页
公告