随笔分类 - 算法
摘要:线段树在一些acm题目中经常见到,这种数据结构主要应用在计算几何和地理信息系统中。下图就为一个线段树:(PS:可能你见过线段树的不同表示方式,但是都大同小异,根据自己的需要来建就行。)1.线段树基本性质和操作线段树是一棵二叉树,记为T(a, b),参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L。线段树T(a,b)也可递归定义为:若L>1 : [a, (a+b) div 2]为 T的左儿子; [(a+b) div 2,b]为T 的右儿子。 若L=1 : T为叶子节点。线段树中的结点一般采取如下数据结构:struct Node{ int left...
        阅读全文
                
摘要:搜索算法按搜索的方式分有两类,一类是深度优先搜索,一类是广度优先搜索。我们知道,深度搜索编程简单,程序简洁易懂,空间需求也比较低,但是这种方法的 时间复杂度往往是指数级的,倘若不加优化,其时间效率简直无法忍受;而广度优先搜索虽然时间复杂度比前者低一些,但其庞大的空间需求量又往往让人望而却步。 所以,对程序进行优化,就成为搜索算法编程中最关键的一环。本文所要讨论的便是搜索算法中优化程序的一种基本方法叫“剪枝”。 一、what is it? 搜索的进程可以看作是从树根出发,遍历一棵倒置的树——搜索树的过程。而所谓剪枝,顾名思义,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索.
        阅读全文
                
摘要:在调试中,经常需要计算某一段代码的执行时间,下面给出两种常用的方式: 第一种:使用GetTickCount函数#include<iostream> #include<windows.h> int main() { DWORD start_time=GetTickCount(); { //此处为被测试代码 } DWORD end_time=GetTickCount(); cout<<"The run time is:"<<(end_time-start_time)<<"ms!"<<en
        阅读全文
                
摘要:5个数之间的大小关系构成的一个树形图T。T中的一个结点代表一个数,而一条边代表它所 关联的两个数的大小关系,T的根就是中位数。显然T中的一条边要由一次比赛来确定。在 下 面的图中,如果x大于y,则节点x在节点y的上方且x和y有一条边相连。另外,*表示一般的 数,o表示下一次即将进行比较的两个数。 第1步,先任取两个数比较,结果为: * | * o o * 第2步,再取另外两个数比较,结果为: o o | | * * * 第3步,按照上图比较其中两个标记为o的数,比较结果只有一种情况: * / \ o * | * o 第4步,按照上图比较其中两个标记为o的数,比较结果有两种情况: o o * \
        阅读全文
                
摘要:找到最快的算法,一直是计算机界的目标之一,而排序就是其中最基本的算法。什么样的排序才是最快的呢?1.最少的比较次数,算法理论证明n个数排序,如果是基于比较的算法,至少需要 ㏒(n!) 向上取整数。下面给出小数目下,最少比较次数:n12345678㏒(n!)013571013162.移动次数最少,根据群论置换群理论,n个数的序列,变换到这n个数组成另一个序列,一定可以在最多n次移动内做到。 在理论的指引下,人们开始寻找这些传说中的极限。人们开始简单地完成了n=1,2,3,4的极限算法,但是当n=5时,人们长期停留在了8次比较。但是在1956年,H.B.Demuth在终于首先找到5个次7次比较的排
        阅读全文
                
                    
                
浙公网安备 33010602011771号