算法探寻之路
文章平均质量分 85
一点一点的钻研...
_Luffy
https://github.com/JianmingXia
展开
-
最大子数组问题(动态规划)--【算法导论】
《算法导论》中引入这个问题是通过股票的购买与出售,将前一天的当天的股票差价重新表示出来,即转为了一个最大子数组的问题,具体内容我不多说,转的内容是:13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7找到这连续的16个数里面的连续和最大的子数组;书中练习部分说用设计非递归的,线性时间的算法,我就YY为动态规划处理了;从数组的左边界开始,从左至右处理,记录到目前为止已经处理过的最大子数组。若已知A[1..j]的最大子原创 2014-01-07 10:32:01 · 9172 阅读 · 0 评论 -
最大子数组问题(分治法)--【算法导论】
《算法导论》中引入这个问题是通过股票的购买与出售,经过问题转换,将前一天的当天的股票差价重新表示出来,即转为了一个最大子数组的问题,具体内容我不多说,转的内容是:13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7找到这连续的16个数里面的连续和最大的子数组;假定我们要寻找子数组A[low..high]的最大子数组,使用分治法意味着我们要将子数组划分为两个规模尽可能相等的子数组。也就是说,找到子数组的中央位置,比如mi原创 2014-01-07 11:44:05 · 5257 阅读 · 16 评论 -
堆排序(最大堆[1])--【算法导论】
前一章的“概率分析与随机算法”实在伤脑子,好在看过去了,现在正在看的是排序部分;堆排序,这次说的是最大推排序(和最小堆原理也是相同的),和原文中的思路也是一样的,后序有补充也会贴出来的;最大堆...即是父节点的值大于孩子的值,若不满足条件,则经过调节使其满足条件:原创 2014-01-08 19:23:04 · 2793 阅读 · 0 评论 -
堆排序(最大堆进阶)--【算法导论】
上篇【堆排序(最大堆)】说过,代码是按照书中的伪码写出,书中的根结点是1,但一般我们数组的下标由0开始,故而现在改为由0开始;上篇已说过实现的过程,故而不在赘述,可见上篇;将其中的一些条件改变即可:首先是建堆的值,由0开始的根结点,对于A[n],它的父节点是(n - 1) / 2,并且到0为止,都是父节点;故而建堆:原创 2014-01-08 20:01:54 · 1195 阅读 · 0 评论 -
堆排序(最小堆)--【算法导论】
堆排序的思想在堆排序(最大堆)已做说明,故不再赘述;总之,思想就是首先进行建堆,由于这是最小堆,故而必须保证父节点都小于孩子节点,若不满足条件,则进行调节;最后进行堆排序,不断将最小的提取出来,并对剩下的进行调节,使之满足最小堆;故而将最大堆中的判断父节点与孩子大小部分改变即可: if (left <= length && A[largest] > A[left]) //左孩子比父节点小 { largest = left; } if (righ原创 2014-01-08 21:39:06 · 8439 阅读 · 0 评论 -
最大优先队列--【算法导论】
堆排序是一个优秀的算法,但是在实际应用中,如快速排序的性能会优于它。但是堆排序有着另外的作用,如优先队列;与堆排序一样,优先队列也有两种形式:最大优先队列,最小优先队列(暂且讨论最大优先队列);优先队列:是一种用来维护由一组元素构成的集合S的数据结果,其中的每个元素都有一个相关的值,称为关键字。最大优先队列支持:原创 2014-01-09 14:07:40 · 2785 阅读 · 0 评论 -
快速排序--【算法导论】
对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为O(n²)的排序算法。虽然最坏情况时间的复杂度很差,但是快速排序通常是实际排序应用中最好的选择,因为它的平均性能非常好:它的期望时间复杂度是O(nlgn),而且O(nlgn)中隐含的常数因子非常小,另外,它还能够进行原址排序,甚至在虚存环境中也能很好的工作。快速排序使用了分治的思想:分解:将数组A[low..high]划分为两个子数组A[low..mid - 1]以及A[mid + 1..high],使得A[low..mid - 1]子原创 2014-01-09 15:49:23 · 1132 阅读 · 0 评论 -
计数排序(线性时间排序)--【算法导论】
之前的排序都是通过比较得到的,即比较排序:在排序的最终结果中,各元素的次序依赖与它们之间的比较。而时间复杂度最好的也是O(nlgn),接下来说一个未经比较的排序,而复杂度则是线性的。计数排序假设n个输入元素的每一个都是在0-k区间内的一个整数,其中k为某个整数。当k = O(n)时,排序的运行时间为O(n)。计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上了。例如,如果有17个元素小于x,则将x放在第18个位置即可。但是当存在几个原创 2014-01-09 20:56:59 · 1151 阅读 · 0 评论 -
“栈与队列”之栈--基本数据结构
亡羊补牢犹未晚啊,栈,按照书上小小的操作一下,后续会有补充...栈和队列都是动态集合,且在其上进行DELETE操作所移除的元素是预先设定的。在栈(stack)中,被删除的是最近插入的元素:即栈实现的是一种后进先出(last-in,first-out,LIFO)策略。下面是栈的简单操作,即初始化InitStack,空栈StackEmpty,入栈Push,出栈Pop;原创 2014-02-15 13:44:41 · 1337 阅读 · 2 评论 -
“栈和队列”之队列--基本数据结构
第一期:在队列中,被删去的总是在集合中存在时间最长的那个元素:队列实现的是一种先进先出(first-in,first-out,FIFO)策略;队列上的INSERT操作称之为入队(ENQUEUE),DELETE操作称为出队(DEQUEUE);正如栈的pop操作一样,DEQUEUE操作也没有元素参数。队列的先进先出特性类似于收银台前排队结账的一排顾客。队列有队头(head)和队尾(tail),当有一个元素入队时,它被放在队尾的位置;下面是一个简单的队列操作,初始化队列,入队,出队处理;原创 2014-02-15 15:15:30 · 1110 阅读 · 0 评论 -
二叉排序树(Binary Sort Tree,二叉查找树,二叉搜索树)--【算法导论】
1、首先是了解了二叉搜索树;2、接下来看的是查询二叉搜索树,查询二叉搜索树的内容比较多;(1)查找:即是查询关键字,若存在,返回该节点的指针;否则,返回空;这个书中给了两段伪码,迭代、递归随意;(2)最大关键字及最小关键字元素:顾名思义,肯定是二叉搜索树的最大最小值,以最大关键字为例,一直查询树的右孩子,直到改节点无右孩子为止,该节点就是最大关键字,当然,最小关键字同理;(3)后继与前驱:对一个节点来说,最大的小于该节点值的即是前驱,最小的大于该节点值的即是后继。以后继为例,如果该节点的右子树不为空原创 2014-02-26 22:45:22 · 11684 阅读 · 2 评论 -
先序、中序、后序遍历(三种情况访问二叉树)
昨天才写了篇关于二叉排序树的博客,想起之前有所遗漏,如先序,中序以及后序遍历;先序遍历:也叫做先根遍历,前序遍历,可记做根左右(二叉树父结点向下先左后右)。首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。 即:若二叉树为空则结束返回,否则:(1)访问根结点(2)先序遍历左子树(3)先序遍历右子树中序遍历:首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右原创 2014-02-27 17:43:59 · 2672 阅读 · 0 评论