随笔分类 -  ALGORITHMS

算法
摘要:概述: 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。一些常见的用途有求连通子图、求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等。 使用并查集时,首先会存在一组不相交的动态集合 S={S1,S2,⋯,Sk},一般都会使用一个整数表示集合中的一个元素。 每个集合可... 阅读全文
posted @ 2016-02-21 16:31 Quincy 阅读(1934) 评论(0) 推荐(0)
摘要:概述: 基数排序是一种高效的线性排序算法。其方法是将数据按位分开,并从数据的最低有效位到最高有效位进行比较,依次排序,从而得到有序数据集合。 例子: 用基数排序对十进制数据{15,12,49,16,36,40}进行排序。 在对个位数排序之后=> {40,12,15,16,36,49}; 在对十位数排序之后=> {12,15,16,36,40,49}; 有一点非常重要,在对每一位数值进行排序时其排序... 阅读全文
posted @ 2015-12-21 18:10 Quincy 阅读(315) 评论(0) 推荐(0)
摘要:概述: 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的集合排序时,它的复杂度为Ο(n+k)(其中k是元素的范围),快于任何比较排序算法。 计数排序本质上是通过计算无序集合中元素出现的次数来决定集合应该如何排序的。 例如一个数组{1, 4, 1, 2, 7, 5, 2},进行计数排序过程 1、使用Count数组记录元... 阅读全文
posted @ 2015-12-18 18:13 Quincy 阅读(431) 评论(0) 推荐(0)
摘要:题目说明: 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,失败返回-1。 题目解析: 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值... 阅读全文
posted @ 2015-11-24 23:42 Quincy 阅读(1201) 评论(0) 推荐(0)
摘要:题目说明: 归并排序是建立在归并操作上的一种有效的排序算法。该算法也是采用分治法(Divide and Conquer)的一个非常典型的应用。算法复杂度为O(N*logN)。 题目解析: 归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列。 归并排序包括两个步骤: 1)划分子表 2)合并半子表 ... 阅读全文
posted @ 2015-11-24 18:33 Quincy 阅读(5126) 评论(0) 推荐(0)
摘要:题目说明: 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。排序n 个项目要Ο(n log n)次比较。 题目解析: 1、堆 堆实际上是一棵完全二叉树,在第一个元素的索引为0的情形中满足特性: 性质一:索引为i的左孩子的索引是 (2*i+1);性质二:索引为i的左孩子的索引是 (2*i+2);性质三:索引为i的父结点的索引是 int((i-... 阅读全文
posted @ 2015-11-24 16:58 Quincy 阅读(268) 评论(0) 推荐(0)
摘要:题目说明: 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 题目解析: 快速排序使用分治法(Divide and conquer)策略来把一... 阅读全文
posted @ 2015-11-24 11:15 Quincy 阅读(580) 评论(0) 推荐(0)
摘要:概述: Trie是个简单但实用的数据结构,是一种树形结构,是一种哈希树的变种,相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串。和普通树不同的地方是,相同的字符串前缀共享同一条分支。 例如:pool,prize,preview,prepare,produce,progress这些关键词的Tire树 典型应用是用于统计,排序和保存大量的字符串(但不仅限于... 阅读全文
posted @ 2015-10-21 17:01 Quincy 阅读(2415) 评论(0) 推荐(0)
摘要:题目说明: 输入一个数列(包含正负数),求和是最大的连续子序列。例如{5,-3,4,2}的最大子序列就是 {5,-3,4,2}。 程序代码: #include using namespace std; int MaxSumOfSequence(int* pData, int nLength, int& nBegin, int& nEnd) { if (!pData || !nLen... 阅读全文
posted @ 2015-10-20 18:18 Quincy 阅读(260) 评论(0) 推荐(0)
摘要:题目说明: 找两个字符串的最长公共子序列,这个子序列不要求在原字符串中是连续的,但要求顺序是一致的,比如"abcd"和"aebfc"的最长公共子串是"abc"。 程序代码: #include #include using namespace std; enum DirectionType { TypeUp, TypeLeftUp, TypeLeft }; int... 阅读全文
posted @ 2015-10-20 17:42 Quincy 阅读(316) 评论(0) 推荐(0)
摘要:题目说明: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。比如"bab"和"caba"的最长公共子串是"ba"和"ab"。 程序代码: #include #include #include using namespace std; int GetLCS(const string& strA, const string& strB, vector& result) { ... 阅读全文
posted @ 2015-10-20 15:14 Quincy 阅读(278) 评论(0) 推荐(0)
摘要:题目说明: 输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;}; 程序代码: #include #include using namespace std; struct ListNode { int m_nKey; ListNode*... 阅读全文
posted @ 2015-10-10 15:35 Quincy 阅读(185) 评论(0) 推荐(0)
摘要:题目说明: 给定一组数字或符号,按照字典序产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。 题目解析: 如果要产生字典顺序,例如若有4个元素,则: {} => {1} => {1,2} => {1,2,3} => {1,2,3,4} => {1,2,4} => {1,3} => {1,3,... 阅读全文
posted @ 2015-09-25 15:21 Quincy 阅读(992) 评论(0) 推荐(0)
摘要:题目说明: 给定一组数字或符号,产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。 题目解析: 如果不考虑字典顺序,则有个简单的方法可以产生所有的集合,思考二进位数字加法,并注意1出现的位置,如果每个位置都对应一个数字,则由1所对应的数字所产生的就是一个集合,例如: 000 {} 00... 阅读全文
posted @ 2015-09-25 14:12 Quincy 阅读(6019) 评论(0) 推荐(0)
摘要:题目说明: 假设有个集合拥有n个元素,任意的从集合中取出m个元素,则这m个元素所形成的可能子集有那些? 题目解析: 假设有5个元素的集合,取出3个元素的可能子集如下: {1 2 3}、{1 2 4 }、{1 2 5}、{1 3 4}、{1 3 5}、{1 4 5}、{2 3 4}、{2 3 5}、{2 4 5}、{3 4 5} 这些子集已经使用字典顺序排列,如此才可以观察出一些规则: ... 阅读全文
posted @ 2015-09-25 11:41 Quincy 阅读(2260) 评论(0) 推荐(0)
摘要:题目说明: 将一组数字、字母或符号进行排列,以得到不同的组合顺序,例如1 2 3这三个数的全排列有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1。 题目解析: 设一组数p = {r1, r2, r3, … ,rn}, 全排列为perm(p),pn = p – {rn}。 则perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), …... 阅读全文
posted @ 2015-09-24 18:11 Quincy 阅读(1801) 评论(0) 推荐(0)
摘要:题目说明: 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋... 阅读全文
posted @ 2015-09-23 13:29 Quincy 阅读(3042) 评论(0) 推荐(0)
摘要:题目说明: 洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1~N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已。 题目解析: 初学者通常会直接想到,随机产生1~N的随机数并将之存入阵列中,后来产生的随机数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新产生下一个数,运气不好的话,重复的次数就会很多,程式的执行速度就很慢了,这不是一个好方法。以1~... 阅读全文
posted @ 2015-09-22 17:50 Quincy 阅读(3029) 评论(0) 推荐(0)
摘要:题目说明:通过将中序式转换为后序式,不用处理运算子先后顺序问题,只要依序由运算式由前往后读取即可。题目解析:运算时由后序式的前方开始读取,遇到运算元先存入堆叠,如果遇到运算子,则由堆叠中取出两个运算元进行对应的运算,然后将结果存回堆叠,如果运算式读取完 毕,那么堆叠顶的值就是答案了,例如我们计算12... 阅读全文
posted @ 2015-09-22 16:31 Quincy 阅读(557) 评论(0) 推荐(0)
摘要:题目说明:平常所使用的运算式,主要是将运算元放在运算子的两旁,例如a+b/d这样的式子,这称之为中序(Infix)表示式,对于人类来说,这样的式子很容易理 解,但由于电脑执行指令时是有顺序的,遇到中序表示式时,无法直接进行运算,而必须进一步判断运算的先后顺序,所以必须将中序表示式转换为另一种表示方 ... 阅读全文
posted @ 2015-09-22 14:29 Quincy 阅读(1317) 评论(0) 推荐(0)