数据结构与算法分析
文章平均质量分 80
肥宝Fable
微信公众号:肥宝的实验室
超级实验室,技术黑工厂
展开
-
游戏中坐标转换
极坐标和直角坐标的转换,绝对坐标和相对坐标的转换原创 2016-03-10 23:31:06 · 6634 阅读 · 0 评论 -
数据结构:优先队列--堆
堆是一棵被完全填满的二叉树。底层可以例外。也成为完全二叉树。因为完全二叉树很有规律,所以可以用一个数组表示而不需要使用链。对于任一个位置i上的元素,左儿子在2i上,右儿子在2i+1上。其父亲在i/2上。堆的某个结点,必须必它的子孙结点都小,所以堆是完全二叉树,但是完全二叉树不一定是堆。//// Heap.h// HelloWorld// csdn blog:http:/原创 2017-01-10 22:35:03 · 2496 阅读 · 0 评论 -
算法分析:插入排序
插入排序是最简单的排序算法之一。插入排序由N-1趟(pass)排序组成。对于p = 1到N - 1趟,插入排序保证位置0到位置P上的元素为已排序状态。//插入排序 template void insertionSort(Vector& a) { int j; for (int p = 1; p < a.size(); ++p) { Comparable temp =原创 2017-01-11 10:30:11 · 2440 阅读 · 0 评论 -
算法分析:谢尔排序(缩减增量排序)
谢尔排序也叫缩减增量排序。谢尔排序使用一个序列h1,h2,···,ht,叫做增量序列。有些增量序列对排序效率起到更好的效果。template void shellSort(Vector& a) { for (int gap = a.size() / 2; gap > 0; gap /= 2) { for (int i = gap; i < a.size(); ++i)原创 2017-01-11 11:15:26 · 2527 阅读 · 0 评论 -
算法分析:归并排序
归并排序:最坏情形是O(NlogN)使用的比较次数几乎是最优的。这个算法中基本操作是合并两个已排序的表。归并排序通过递归,将数组自身分拆成2个数组,然后进入子数组的排序。分拆的数组左右两个,必须是紧跟着的。 //-------------归并排序---------------------- template void mergeSort(Vector& a) {原创 2017-01-11 16:29:59 · 2302 阅读 · 0 评论 -
算法分析:堆排序
基本原理就是构建一个堆,然后删除根。为了不用一个新的堆,把抽取出来的数据,放在堆末尾。所以,要实现一个升序排序,就要构建一个最大堆,不停抽取最大数,放到末尾处。 //----------------堆排序-------------------- template void heapsort(Vector& a) { //构建堆,从二分一后的点都是在最底层的,所以往回执行下滤,原创 2017-01-11 14:38:01 · 2304 阅读 · 0 评论 -
算法分析:快速排序
快速排序(quicksort)是在实践中最快的已知排序算法。平均运行时间是O(NlogN),最坏的情形是O(N^2)算法之所以特别快,主要是由于非常精炼和高度优化的内部循环。1.如果S中元素个数是0或1,则返回2.取S中任一元素v,成为枢纽元(pivot)3.将S-{v}(S中其余元素)划分成两个不想交的集合:左边<v,右边≥v。4.返回左边的排序,后跟v,继而右边的排序原创 2017-01-11 21:56:51 · 2761 阅读 · 0 评论 -
算法分析:快速选择
使用类似快速排序的方法,找出第k小的元素。k从0开始的。使用了快速排序的部分函数 快速排序 //快速选择 template Comparable& quickSelect(vector& a, int left, int right, int k) { if (left + 10 <= right)//这个子数组大于10,继续使用快速排序原创 2017-01-11 22:26:40 · 2549 阅读 · 0 评论 -
算法分析:间接排序
排序的过程中,经常要交互数据,尤其是对于C++这种语言,交互两个比较大的对象,是很耗时间的。如果只是交互两个对象的指针,就会快很多了。间接排序的关键是排序后,怎样才能按指针的顺序,摆好数组的位置。其中核心的排序算法,是使用了快速排序 //------------间接排序--------- template class Pointer//构建一个可以比较的指针 { publi原创 2017-01-12 11:09:31 · 3920 阅读 · 0 评论 -
算法分析:冒泡排序
应该是最简单的排序了,看代码就行了//冒泡排序 template void bubbleSort(Vector& a) { int i, j, temp; for (j = 0; j < a.size() - 1; j++) { //每一次循环,都会产生一个最大数在末尾,所以下面的不用比较了 for (i = 0; i < a.size() - 1 - j; i+原创 2017-01-12 11:20:14 · 2339 阅读 · 0 评论 -
数据结构:散列2(探测法)
上一章的内容:散列1:分离链接法对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现散列表的填装因子(load factor)λ为散列表中的元素个数和散列表大小的比值。探测散列表:在找到位置后,发现已经有数据,继续找下一个,直到找到位置。这种表叫做探测散列表。再散列:当散列表中数据很多的时候,插入可能会失败,这个时候原创 2017-01-10 17:53:35 · 2467 阅读 · 0 评论 -
数据结构:散列1(分离链接法)
散列:将每个键映射到从0到TableSize-1这个范围的某个数,并将其放到适当的单元中。这个映射成为散列函数理想情况下,不同的键映射到不同的单元,但是现实中是不可能的,所以好的散列函数,应该尽量均匀地分配键。列表的大小最好是素数,这个非常非常重要。解决冲突:冲突:如果一个元素插入时与一个已经插入的元素散列到相同的值,那么就产生了一个冲突。解决冲突的方法:分离链接法原创 2017-01-10 17:33:56 · 2535 阅读 · 0 评论 -
数据结构:伸展树,M叉树,B树
伸展树(splay tree):也叫分裂树,当一个结点被访问后,它就要经过一系列AVL树的旋转被推到根上。M叉树:可以有M路分支,高度大约是logmNB树:经过M叉树的多次变种和改进。有如下特性:1.数据项存储在树叶上2.非叶结点存储知道M-1个键,以指示搜索的方向;键i代表子树i+1中的最小键。3树的根或者是一片树叶,或者其儿子数在2和M之间。4除根外,所原创 2017-01-10 10:36:44 · 2693 阅读 · 0 评论 -
MMO游戏技能攻击区域的计算
游戏技能攻击区域的计算,关乎服务端的效率。需要确保正确,简洁地计算攻击区域,才能快速寻找攻击对象。今天只讨论地图上距离的问题。一般情况下攻击区域分为以下几种:1.点对点,对个人进行攻击2.射线攻击,其实就是矩形区域3.扇形攻击4.圆形攻击当然,还有其他情况,例如多区域和其他奇奇怪怪的形状。不过考虑的实际观赏价值,和精度的问题,多区域,只考虑圆形和扇形,其他形状也不考虑了原创 2016-03-11 18:45:38 · 5876 阅读 · 3 评论 -
MMO游戏技能攻击区域的计算2--给地图划分格子
本文来自肥宝游戏,引用必须注明出处!之前已经写过关于攻击区域的算法。但后来,发现别人的游戏(《凡人修真2》其实也不算别人的游戏了)不是这么写的。我居然找不到算矩形之类的代码。找来找去,发现实现思路跟我的差别太大。我的思路在这里先说一种情况,就是一个玩家的角色在地图上走动的时候,是需要不断的跟服务端同步的。例如图中坐标系,从位置1走到位置2.这个过程中是要不断的跟服务端同步的。服原创 2016-04-04 08:30:31 · 6551 阅读 · 0 评论 -
MMO游戏技能攻击区域的计算3--效率分析
对于攻击区域的计算,请看上两遍文章:MMO游戏技能攻击区域的计算MMO游戏技能攻击区域的计算2--给地图划分格子这两篇文章已经对攻击区域进行详细讲解,分为没划分格子和划分格子的情况。这里就不在详述了。在前面的文章,已经得出结论:由于服务端的承载问题,需要对地图划分格子。但是划分格子后,通过格子配置,也可以实现对圆形,扇形,矩形等图形的计算。但是在获得简便的计算之后,却是原创 2016-04-04 20:12:09 · 4702 阅读 · 0 评论 -
数据结构:向量Vector的实现与代码分析
Vector是比较常用的结构,在C++的STL中就有了vector的实现,在头文件中可以看到。但是STL的实现就像一个超级大的蛋糕,我们不可能一口一口地吃下去。最好的办法是从基础的思想开始,自己跟着写一个简单版本的Vector。vector究竟是什么?其实本质上就是数组,只是经过封装后,可以忽略数组的长度限制。除了这一点,其他的特性跟数组都差不多。对于队首和队中插入和删除都要耗费O原创 2017-01-07 21:02:49 · 5467 阅读 · 0 评论 -
数据结构:链表List的实现与代码分析
跟Vector一样,我自己也写了一个简单的List来进行研究。这里实现的是双向链表,因为双向链表包含了单向链表的所以功能,所以就没有单独写一个了。这个双向链表的实现,在创建的时候,就已经有了两个节点,分别是head和tail。这是抽离出来,不存放数据的节点,是为了让程序简化,被称为哨兵节点。假如不使用哨兵节点,在表头表尾操作的插入删除的时候,有很多要特殊处理的地方。加了着两个节点,原创 2017-01-08 19:16:43 · 3303 阅读 · 2 评论 -
数据结构:栈Stack的实现与代码分析
栈的主要特点是LIFO,后进先出。只能访问栈顶。可以使用数组或者链表来实现。所以写了两个版本的实现。其实,从代码的角度看,直接使用List是最简单的,但是从效率的角度看,使用vector更加高效一点。对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现先看看代码://// Stack.h// HelloWorld/原创 2017-01-08 23:39:47 · 2479 阅读 · 0 评论 -
数据结构:队列Queue的实现与代码分析
队列Queue是先进进出FIFO和后进后出LILO的。只能从队尾放入数据,从对头删除数据。跟Stack一样,我也写了两个版本,但是跟Stack还是有所不同的。用List实现的队列,是没有大小限制的,用Vector实现的队列,是有大小限制的,其实更加复制,很多地方要注意的。对于List和Vector,都是使用自己实现的简单模板。Vector模板的实现 List模板的实现同原创 2017-01-09 11:50:27 · 2495 阅读 · 0 评论 -
数据结构:树tree和二叉树BinaryTree的实现与代码分析
一些概念:一棵树是一些结点的集合。这个集合可以是空集,若不是空集,则树由称作根(root)的结点r以及零个或多个非空的(子)树T1,T2...Ta组成,子树中每一个棵的根都被来自根r的一条有向的边(edge)所连接。每一棵子树的根叫做根r的儿子(child),而r是每一棵子树的根的父亲(parent)。没有儿子的结点成为叶(leaf)结点。具有相同父亲的结点为兄弟(siblings原创 2017-01-09 19:16:13 · 2839 阅读 · 0 评论 -
数据结构:平衡二叉树(AVL树)
AVL树是每个结点的左子树和右子树的高度最多差1的二叉查找树。要维持这个树,必须在插入和删除的时候都检测是否出现破坏树结构的情况。然后立刻进行调整。看了好久,网上各种各种的AVL树,千奇百怪。关键是要理解插入的时候旋转的概念。//// AvlTree.h// HelloWorld// csdn blog:http://blog.csdn.net/u012175089/原创 2017-01-10 00:27:25 · 2645 阅读 · 0 评论 -
C++标准库和模板库
C++标准库的内容总共在50个标准头文件中定义。在C++开发中,要尽可能地利用标准库完成。这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费时间、人力重新开发呢;(2)质量:标准库的都是经过严格测试的,正确性有保证;(3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平;(4)良好的编程风格:采用行业中普遍的做法进行开发。原创 2017-01-12 17:15:41 · 2663 阅读 · 0 评论