随笔分类 - 算法设计
摘要:最近在研究图计算的性能,需要构造不同的测试数据对图算法进行压测,其中就涉及到均匀图的概念。 因为做的是理论测试,因此就需要一种理论上绝对均匀的图测试数据,接下来我们就讨论一下绝对均匀图的生成。 一、何为绝对均匀图? 为了方便讨论,我们只讨论无向图,而且图中的边是无权值的,且两点之间只能存在一条边,即
阅读全文
摘要:hash_map的简洁实现hash_map是经常被使用的一种数据结构,而其实现方式也是多种多样。如果要求我们使用尽可能简单的方式实现hash_map,具体该如何做呢?我们知道hash_map最重要两个概念是hash函数和冲突解决算法。hash_map键-值之间的映射关系,hash函数将键映射为内存地址,冲突解决算法用于解决不同的键映射为相同地址时候的情况。数据结构和算法导论中介绍了大量的hash函数和冲突解决算法,如果选择实现精简的hash_map,那么可以选择“除留取余法”作为hash函数,选择“开散列地址链”作为冲入解决算法。这样的选择不仅使得hash_map实现简单,而且有很高的查询效率
阅读全文
摘要:红黑树数据结构剖析红黑树是计算机科学内比较常用的一种数据结构,它使得对数据的搜索,插入和删除操作都能保持在O(lgn)的时间复杂度。然而,相比于一般的数据结构,红黑树的实现的难度有所增加。网络上关于红黑树的实现资料汗牛充栋,但是乏于系统介绍红黑树实现的资料。本文通过一个自己实现的红黑树数据结构以及必要的搜索,插入和删除操作算法,为大家更系统地剖析红黑树数据结构的实现。对于大部分数据结构,一般都会使用抽象数据类型的方式实现,C++提供的模板机制可以做到数据结构与具体数据类型无关,就像STL实现的那样。不过本文并非去实现STL中的红黑树,更重要的是透过红黑树的实现学习相关的算法和思想。当然,我们还
阅读全文
摘要:快速傅里叶变换C++递归算法实现 网上有些算法资料经测试运行结果是错误的,虽然代码的使用的是非递归形式。为了方便验证快速傅里叶变换的准确性,我提供了自己设计的递归算法。 基于时域抽取的“基2”快速傅里叶变换算法代码: Fouier.h文件:#pragmaonce#include"Complex.h"classFouier{Complex*data;voidfft(intstart,intstep,intlen);ComplexW(intk,intn);//e^(-i*2*pi*k/n)public:Fouier(void);~Fouier(void);voidfft();}
阅读全文
摘要:多柱汉诺塔最优算法设计探究引言汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究。最简单的汉诺塔是三个柱子(A、B、C),因此多柱汉诺塔的柱子个数M≥3。下面从三柱汉诺塔说起,慢慢深入我们要关心的问题。1. 三柱汉诺塔三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的典型问题。其算法是这样的: 首先把A 柱上面的n- 1 个碟子通过C 柱移到B 柱上【T(n-1)步】,然后把A 柱剩下的一个碟子移到C 柱上【1步】, 最后把B 柱上所有的碟子通过A 柱移到C 柱上【T(n-1)步】。很容易得到算法的递归方程为:T(n)=2*T(n-1)+1,因此
阅读全文
摘要:算法设计关于递归方程T(n)=aT(n/b)+f(n)之通用解法在算法设计中经常需要通过递归方程估计算法的时间复杂度T(n),本文针对形如T(n)=aT(n/b)+f(n)的递归方程进行讨论,以期望找出通用的递归方程的求解方式。算法设计教材中给出的Master定理可以解决该类方程的绝大多数情况,根据Master定理:o-渐进上界、w-渐进下界、O-渐进确界。设a≥1,b>1为常数,f(n)为函数,T(n)=aT(n/b)+f(n)为非负数,令x=logba:1. f(n)=o(nx-e),e>0,那么T(n)=O(nx)。2. f(n)=O(nx),那么T(n)=O(nx logn)。3. f
阅读全文
摘要:关于如何评价洗牌质量的猜想洗牌算法是卡牌类游戏中必须使用的算法,本质上说洗牌算法的目的是使某个给定的顺序更加的无序,因此出现了很多种洗牌算法。我们不重点讨论如何洗牌,我们将眼光关注于洗出的牌是否达到我们预期的要求,以及如何衡量洗出的牌无序的程度。首先先看一个简单有效的洗牌算法。一、一个简单的洗牌算法一个比较容易实现的洗牌算法是这样的,通过随机选出两张牌进行交换,通过多次这样的重复操作,就能达到洗牌的目的。事实证明这种洗牌方式还是比较可行,最重要的是比较简单,代码如下。//洗牌算法,随机交换数组的两个元素,交换数组长度次为一次洗牌template<classT>voidmess(Td
阅读全文