Algorithm
njdragonfly
关注在线游戏服务端设计,图形引擎,算法设计。
展开
-
正确的二分查找算法
/** * binary search algorithm, correct and high performance; * this implementation will always return the first elment that equal to v; * and will avoid overflow when calc the middle; * and ca原创 2009-11-28 15:29:00 · 626 阅读 · 0 评论 -
布隆过滤器(Bloom Filter)
<br />在日常生活中,包括在设计计算机软件时,我们经常要判断一个元素是否在一个集合中。比如在字处理软件中,需要检查一个英语单词是否拼写正确(也就是要判断它是否在已知的字典中);在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上;在网络爬虫里,一个网址是否被访问过等等。最直接的方法就是将集合中全部的元素存在计算机中,遇到一个新元素时,将它和集合中的元素直接比较即可。一般来讲,计算机中的集合是用哈希表(hash table)来存储的。它的好处是快速准确,缺点是费存储空间。当集合比较小时,这个问题不显著,但是当转载 2011-04-17 23:57:00 · 1525 阅读 · 1 评论 -
B树
<br />B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;转载 2011-04-16 19:55:00 · 857 阅读 · 0 评论 -
八皇后问题
8皇后问题和由他推广得到的N皇后问题来源于国际象棋的玩法,因为皇后所在的位置可以纵向、横向、两个斜向四个方向的“捕捉”,所以8皇后问题就是要求如何布置8个皇后在8*8的棋盘上而使他们互相无法“捕捉”。也就是说不存在两个皇后同行或同列,或在同一斜线上。而N皇后问题就是如何布置N个皇后在N*N棋盘里使不存在两个皇后在同行同列和同一斜线上。因为8皇后问题可以归为N皇后问题,所以下面按照N皇后问题来进行讨论。 解决N皇后问题的最好最著名的算法就是回溯法。在算法设计的基本方法中,回溯法是最一般的方法原创 2010-09-06 22:20:00 · 885 阅读 · 0 评论 -
UNICODE(UTF-16)与UTF-8编码的相互转换
我们通常所说的UNICODE其实是UTF-16,下面这几个函数实现UNICODE(UTF-16)与UTF-8编码的相互转换。/** * This file implement functions of: * * 1. UTF-16 character to UTF-8 chaaracter converting. * 2. UTF-8 character to UTF-16 c原创 2010-05-14 18:19:00 · 4364 阅读 · 1 评论 -
基于Pawlak属性重要度的属性约简算法
大概一年前写代码实现了这个算法,今天有人问我要,在这里贴出来好了。具体算法思路我也忘了,但是代码应该还算清晰。只需要事先了解下STL。/* 测试数据21/10 X1 X2 X3 X4 X5 X6 X7 X8 X9 yU1 c 6 y E m h h a m mU2原创 2010-05-02 22:08:00 · 3256 阅读 · 0 评论 -
深度优先搜索(DFS)算法
正如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索图。在深度优先搜索中,对于最新发现的顶点,如果它还有以此为起点而未探测到的边,就沿此边继续汉下去。当结点v的所有边都己被探寻过,搜索将回溯到发现结点v有那条边的始结点。这一过程一直进行到已发现从源结点可达的所有结点为止。如果还存在未被发现的结点,则选择其中一个作为源结点并重复以上过程,整个进程反复进行直到所有结点都被发现为止。和原创 2010-04-04 22:09:00 · 38887 阅读 · 5 评论 -
最小生成树 - Kruskal算法
Kruskal算法步骤如下: 1. 新建图G,G中拥有原图中相同的节点,但没有边2. 将原图中所有的边按权值从小到大排序3. 从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中4. 重复3,直至图G中所有的节点都在同一个连通分量中 Kruskal算法的实现类似于计算连通支的算法。它使用了分离集合数据结构以保持数个互相分离的元素原创 2010-04-02 23:27:00 · 1434 阅读 · 1 评论 -
即时战略游戏中如何协调对象移动
作者:Dave C. Pottinger翻译改写:lzc 在图论中人们研究了通过怎样的计算才能找到一条从A点到B点的通路,以图论本身来说这已经解决了从A到B的问题,剩下的只是从A沿着找到的路线移动到B就可以了。这样的认识基于一个默认的假设--道路中的一切障碍物都是固定的,但是在现在已经广泛流行的即时战略类游戏中问题却远远不止这些。举个例子说上下班高峰期的时候,路上的每一个人都原创 2010-04-05 01:00:00 · 3585 阅读 · 1 评论 -
并查集(不相交集)
并查集一般以树形结构存储,多棵树构成一个森林,每棵树构成一个集合,树中的每个节点就是该集合的元素,找一个代表元素作为该树(集合)的祖先。 并查集支持以下三种操作:1、Make_Set(x) 把每一个元素初始化为一个集合 初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身。2、Find_Set(x) 查找一个元素所在的集合 查找一个元素所原创 2010-04-01 20:23:00 · 1544 阅读 · 0 评论 -
广度优先搜索(BFS)算法
广度优先搜索(BFS)算法宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根原创 2010-03-30 20:22:00 · 14542 阅读 · 2 评论 -
A* (路径搜索)算法导引
前言:A*算法是路径搜索中的经典算法,也是公认的最优算法之一,网上找到一篇文章讲的很好,适合入门,所以翻译了一下,没有完全参照原文,主要还是意译,网上也有其他人翻译好的,个人觉得还是自己来一遍比较好,读者自斟:原文开始:搜索区域这里假设有人要从A点去往B点,另外有一面墙将两者分开。如下图所示,绿色方块代表A点,红色方块代表B点,蓝色代表分开他们的墙。 图一 首先要注意的是我们这里先将原创 2010-01-10 15:56:00 · 1257 阅读 · 0 评论 -
双数组Trie树
依赖于字符串比较的词典查询算法,常用的数据结构是trie树结构。Trie树是一种有限状态自动机,每个节点代表一个状态,根据输入变量的不同,进行状态转移。对于中文句子,输入变量就是每一个汉字,每输入一个汉字,就会引发一个状态转移,可能是从一个状态到另一个状态,也可能是一个状态到它自身的转移。假设有n种状态,输入变量有m种,那么trie树的存储空间就是O(m*n),一般n>50万,m>5000,空原创 2009-12-09 20:04:00 · 4217 阅读 · 0 评论 -
大数的加,减,乘,除,乘方运算
#include #include #include #include #include using namespace std;#define tcout std::cout#define tcin std::cin#define tcerr std::c原创 2009-11-28 15:25:00 · 805 阅读 · 0 评论 -
KMP算法实现
闲来无事,实现了一下KMP算法,代码如下: /** * 由于KMP算法只预处理sub串,因此这种算法很适合这样的问题:给定一个sub串和一群不同的main串, * 问sub是哪些main串的子串。 *//* kmp & cal_next,将不使用数字的索引0,从1开始使用 */void kmp(char str_main[], int str_main_len, char原创 2009-11-28 15:53:00 · 551 阅读 · 0 评论 -
如何判断一棵二叉树是完全二叉树
<br /><br />严蔚敏那本教材上的说法:一个深度为k,节点个数为 2^k - 1 的二叉树为满二叉树。这个概念很好理解,<br />就是一棵树,深度为k,并且没有空位。<br />首先对满二叉树按照广度优先遍历(从左到右)的顺序进行编号。<br />一颗深度为k二叉树,有n个节点,然后,也对这棵树进行编号,如果所有的编号都和满二叉树对应,那么这棵树是完全二叉树。<br /><br /> <br /><br />任意的一个二叉树,都可以补成一个满二叉树。这样中间就会有很多空洞。在广度优先遍历的时候,如原创 2011-04-30 01:23:00 · 38370 阅读 · 18 评论