随笔分类 - 算法合集
1
C语言实现
二项堆
摘要:原理参考《算法导论》,仅给出代码。 声明一个mergeable_heap类 对应成员函数实现 heap_min函数,找出堆中最小结点 heap_max函数,找出堆中最大结点 heap_search函数,查找对应关键字k的结点 heap_union函数,两个堆的合并,原理来自于《算法导论》 两个对应的
阅读全文
B树
摘要:插入原理参考《算法导论》,删除原理请参考以下链接:https://www.youtube.com/watch?v=fKubKYzwDl0 代码实现如下 声明一个B树类,随机生成对应关键字的数据data 对应的成员函数实现 Insert函数,原理来自《算法导论》 两个辅助函数 Search函数,查找某
阅读全文
不定长哈夫曼树
摘要:原理参考《算法导论》,我借用了stl中的deque类,这样方便构造书中说的有序队列Q。其次,本博客的所有代码都采用C和C++混编形式,所以建议使用VS2015及其以上版本编译代码。 代码如下 声明一个Huffman类以及对应的节点数据 对应的成员函数实现 Huffman_init成员函数,构建Huf
阅读全文
动态规划之01背包问题
摘要:在说01背包问题前,简单的说下部分背包的问题。 部分背包的问题,有N个可分割的物品,每个物品对应重量Wi, 价值Vi(i从1到N)。给定总重量C,如何保证最大价值? 01背包问题,和部分背包问题唯一不同的是,01背包问题要求物品i,要么全部拿走,要么不拿走。而对应的部分背包问题,则可以拿一小部分物品
阅读全文
贪心算法之活动规划
摘要:问题描述:有N个活动,活动i的开始时间为Si,结束时间为fi。那么如何在N个活动之间,找出活动时间不冲突的活动组合呢? 原理参考《算法导论》。 代码如下: 常规的activity_selector函数 贪心下的greedy_activity_selector函数 数据录入 Main函数 测试结果图(
阅读全文
动态规划之最优二叉树
摘要:原理来自于《算法导论》,其实和矩阵的动态规划基本一样,所以这里就不作阐述了。 直接上代码,通过构造了最优的root数组后,很容易再创建一个二叉树(这一小部分大家可以自己理解后试试)。 关于代码的说明,因为书上给出的是伪代码,数组并没有采用C语言格式,下标不是从0开始,所以算法和root数组我做了调整
阅读全文
动态规划之最长公共子序列
摘要:原理请参考《算法导论》 定义常量 版本1,带辅助数组b 对应输出函数 版本2,不带辅助数组b 对应输出函数 最后,打印所有可能函数 Main函数 辅助函数 打印结果: 所有代码均经过测试,结果正确。
阅读全文
动态规划之多矩阵乘积
摘要:算法原理请参考《算法导论》,因为算法这东西千篇一律,关键还是实现和理解,这里只提几个关键点,帮助大家理解。 1. 为什么需要动态规划? 比如矩阵A是p x q大小,矩阵B是q x r大小,很明显,得到的矩阵C是p x r大小,其中花费的时间必定是p*q*r。这只是两个矩阵,如果存在N个矩阵需要算其乘
阅读全文
动态规划之车间装配问题
摘要:《算法导论》给出了详细的描述,这里归纳下。 算法原理:任意一条装配线中的装配站j的最快路径,都是来自于任意一条装配线中的装配站j-1。 采用算法导论中,给出的图以及数据,如下: 由于采用C语言数组,装配线下标是0或者1,装配站下表是0,1,2,3,4,5,上面的l1和l2数组分别翻译成0 1 0 0
阅读全文
区间树
摘要:《算法导论》描述了一个关于区间树的重叠搜索,这里简单描述下原理,然后给出代码。 区间树是建立在红黑树的基础上,额外维护了一个信息域。在《算法导论》中,已经给出了任何额外信息域的维护,是相似的证明。所以,建议不懂得,先试着实现一个基本的,带size域的红黑树(书上已经给出原理),然后再扩展到区间树。下
阅读全文
Treap树
摘要:Treap树包含所有二叉树的性质,但是以一个随机的优先值排序。《算法导论》关于这个Treap树的原理和实现描述非常少,我就直接给代码吧,原理大家自己百度了。 首先定义的个类 关于各个成员实现 left_roate函数 right_rotate函数 tp_insert函数 tp_insert_fixu
阅读全文
AVL树
摘要:算法原理请参考《算法导论》,简单描述下:就是所有节点(根节点除外)的最大深度和最小深度之间的差小于2。 代码实现,只贴出和红黑树不同的类成员函数实现,其余都是和红黑树一样。 类声明 和红黑树不同的类成员函数实现 avl_insert成员函数 avl_delete成员函数 avl_fixup成员函数,
阅读全文
红黑树
摘要:原理请参考《算法导论》 定义一个红黑树类 相关成员函数的实现 left_rotate成员函数,实现某节点的左旋转 right_rotate成员函数,实现某节点的右旋转 rb_insert成员函数,将某个key值插入到红黑树中,并修正让其满足红黑树的性质 rb_insert_fixup成员函数,接上面
阅读全文
基数树
摘要:原理参考《算法导论》 注:代码设定,支持索引的位数最大是32位,当然可以修改让其支持64和32位的索引 首先定义一些常量(修改此处的常量,让其支持64位的索引) 然后定义一个基数树类 关于类成员实现 radix_mask成员负责根据所在树的层数,动态生成掩码。比如本例中使用18位的索引值,然后定义树
阅读全文
常见的哈希函数
摘要:原理参考《算法导论》 一、除法散列函数 根据描述实现算法,先取对应种子 关键算法实现 二、乘法散列函数 根据算法描述实现(应用时,slot大小是2^p,此函数无论如何映射,不会超出slot大小) 三、全域散列 原理是:假设数组有n个元素,通过除法散列算法中的hash_mod_seed函数取得一个素数
阅读全文
七种常见的排序算法
摘要:原理请参考《算法导论》 一、插入式排序算法实现: 二、递归实现分治,merge函数实现合并算法实现: 三、冒泡算法实现: 四、堆栈排序算法实现(实质上是数组和二叉树之间的映射): 定义数组: A[0]表示堆栈大小,即数组元素个数;所以数组中数据的下标是1开始到n 元素交换: 父子节点获取: 针对指定
阅读全文
任意N阶幻方算法实现
摘要:算法原理请参考:https://www.zhihu.com/question/23531676 先定义一些通用的函数,比如创建空幻方,删除幻方,打印幻方。 创建幻方 删除幻方 打印幻方 一、奇数幻方算法实现: 辅助函数(实现算法) 主函数(负责打印) 二、偶数幻方算法实现: 辅助函数(算法实现) 主
阅读全文
1
浙公网安备 33010602011771号