算法导论
后打开撒打发了
有些人注定要生活在彼岸 可以亲近可以爱怜 甚至可以穷尽一生去思念 只是无法触及 有些距离 注定不能跨越 只能俩俩相望 就像有些爱只能养在心里 长在眼中 不要捧在手里 放在身边 注定只能邂逅 无法遭遇
展开
-
求最大子数组的和,算法导论之分治递归求解,暴力求解,记忆扫描方法。
求最大子数组的和,算法导论只分治递归求解,暴力求解,记忆扫描方法。原创 2014-11-04 01:00:06 · 2107 阅读 · 0 评论 -
算法导论-----------------最优二叉搜索树
给定一个由n个互异的关键字组成的有序序列K={k123n}和它们被查询的概率P={p1,p2,p3,……,pn},要求构造一棵二叉查找树T,使得查询所有元素的总的代价最小。对于一个搜索树,当搜索的元素在树内时,表示搜索成功。当不在树内时,表示搜索失败,用一个“虚叶子节点”来标示搜索失败的情况,因此需要n+1个虚叶子节点{d01n},对于应di的概率序列是Q={q0,q1,……,qn}。其中d0表示原创 2014-12-16 20:01:13 · 1301 阅读 · 0 评论 -
算法导论-----------二叉搜索树
先上二叉树查找树的删除的代码,因为删除是二叉查找树最复杂的操作:int BinarySearchTree::tree_remove(const T& elem){ BinarySearchTreeNode *z = tree_search(elem);//根据元素查找到要删除的节点 BinarySearchTreeNode *x, *y; if (z != NULL) {原创 2014-12-04 00:20:51 · 1645 阅读 · 0 评论 -
算法导论-----------------0-1背包问题dp求解
首先介绍一下动态规划...设计一个动态规划算法,通常可按照以下几个步骤进行:(1) 找出最优解的性质,并刻画其结构特征。(2) 递归地定义最优解的值(3) 以自底而上的方式计算出最优值(4) 根据计算最优值时得到的信息,构造一个最优解。对于一个给定的问题,若具有以下两个性质,则可以考虑用动态规划法来求解。(1) 最优子结构。如果一个问题的最优原创 2014-12-20 20:11:34 · 2799 阅读 · 0 评论 -
算法导论--------------优先队列的研究
算法导论之优先队列的研究原创 2014-11-16 00:10:23 · 1230 阅读 · 0 评论 -
算法导论之--------------Huffman编码
学习Huffman编码最大的收获是学会了STL中优先队列的使用以及在使用的时候要注意的问题:在使用自定义数据类型的时候,优先队列要重载自己的比较操作符。关于Huffman树怎么讲解请看算法导论讲解,原理真的很简单,不过要写出完整的代码难点就在于优先队列的使用。不废话了啊,再次强调,想把原理弄清楚,请看算法导论,树上的讲解比网上什么垃圾讲解不知道清晰多少,一看就懂。-----------原创 2014-12-21 22:25:12 · 1442 阅读 · 2 评论 -
算法导论---------动态规划之钢条切割
动态规划方法通常用来求解最优化问题。动态规划算法设计步骤:1.刻画一个最优解的结构特征。2.递归定义最优解的值。3.计算最优解的值,通常采用自底向上的方法。4.利用计算出的信息构造一个最优解。动态规划的实现方法:带备忘的自顶向下法:此方法仍按自然的递归形式编写过程,但过程会保存每个子问题的解(通常保存在一个数组或散列表中)。当需要一个子问题的解时,过原创 2014-12-13 01:30:14 · 2935 阅读 · 1 评论 -
算法导论------------------动态规划之矩阵链问题
【问题描述】给定有n个连乘矩阵的维数,要求计算其采用最优计算次序时所用的乘法次数,即所要求计算的乘法次数最少。例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10*100,100*5和5*50,采用(A1A2)A3,乘法次数为10*100*5+10*5*50=7500次,而采用A1(A2A3),乘法次数为100*5*50+10*100*50=75000次乘法,显然,最好的次序是(A1A2原创 2014-12-14 17:10:46 · 1612 阅读 · 0 评论 -
算法导论--------------Strassen矩阵乘法
由于看到 了动态规划来分析解决矩阵链乘的问题,所以回顾了一下矩阵乘法,发现这个知识点忘记的差不多了,现在再来总结一下。首先我们知道两个矩阵相乘A*B,那么A的列数必须等于B的行数,否则不能进行相乘.首先我们来回顾一下解决矩阵相乘问题的一般方法:利用三个for循环来解决,时间复杂度为o(n^3)。矩阵乘法定义: 例如有两个n乘以n的矩阵A和B,C=A*B;那么求C的原创 2014-12-13 21:56:39 · 2072 阅读 · 0 评论 -
算法导论--------------LCS问题(最长公共子系列)
1、基本概念 一个给定序列的子序列就是该给定序列中去掉零个或者多个元素的序列。形式化来讲就是:给定一个序列X={x1,x2,……,xm},另外一个序列Z={z1、z2、……,zk},如果存在X的一个严格递增小标序列1,i2……,ik>,使得对所有j=1,2,……k,有xij = zj,则Z是X的子序列。例如:Z={B,C,D,B}是X={A,B,C,B,D,A,B}的一个子序列,相原创 2014-12-15 00:49:59 · 1900 阅读 · 0 评论 -
冒泡排序
冒泡排序原创 2014-11-07 22:25:14 · 796 阅读 · 0 评论 -
算法导论------------基本数据结构之二叉树
1、二叉树的定义 二叉树(Binary Tree)是一种特殊的树型结构,每个节点至多有两棵子树,且二叉树的子树有左右之分,次序不能颠倒。 由定义可知,二叉树中不存在度(结点拥有的子树数目)大于2的节点。二叉树形状如下下图所示:2、二叉树的性质(1)在二叉树中的第i层上至多有2^(i-1)个结点(i>=1)。备注:^表示此方(2)深度为k的二叉树至多有2^原创 2014-11-26 00:11:09 · 1405 阅读 · 0 评论 -
算法导论-------------队列(queue)的简单实现
队列的基本操作包括入队enqueue和出队dequeue,队列有队头head和队尾tail指针。元素总是从队头出,从队尾入。采用数组实现队列时候,为了合理利用空间,可以采用循环实现队列空间的有效利用。原创 2014-11-24 21:09:03 · 1281 阅读 · 0 评论 -
算法研究之——链表的一些操作(创建、打印,在头部、中间、尾部插入节点)
#includeusing namespace std;struct Node{ int data; Node* next;};typedef class Node List_Node;//1.链表初始化void init_list(Node *head){ head = nullptr; cout << "the list have been inited" <原创 2014-11-11 23:35:23 · 1982 阅读 · 0 评论 -
二叉树树的研究——从创建到打印到从顶层逐步打印.....持续研究中
time:2014.11.14#include#includeusing namespace std;typedef struct BiTNode{ char data; struct BiTNode *lChild; struct BiTNode *rChild;}BiTNode,*BiTree;//************************************原创 2014-11-14 00:27:45 · 716 阅读 · 0 评论 -
算法导论------------计数排序and基数排序
计数排序假设n个输入元素中的每一个都介于0和k之间的整数,k为n个数中最大的元素。当k=O(n)时,计数排序的运行时间为θ(n)。计数排序的基本思想是:对n个输入元素中每一个元素x,统计出小于等于x的元素个数,根据x的个数可以确定x在输出数组中的最终位置。此过程需要引入两个辅助存放空间,存放结果的B[1...n],用于确定每个元素个数的数组C[0...k]。算法的具体步骤如下:(1)根据输原创 2014-11-17 01:46:29 · 1462 阅读 · 0 评论 -
算法导论------------桶排序算法之研究
举个来说明桶排序的过程,假设现在有A={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68},桶排序如下所示: 研究过计数排序我们知道了————计数排序是假设输入是由一个小范围内的整数构成,而桶排序则假设输入由一个随机过程产生的,该过程将元素均匀而独立地分布在区间[0,1)上。当桶排序的输入符合均匀分布时,即可以线性期望时间运行。原创 2014-11-19 00:33:07 · 3135 阅读 · 1 评论 -
算法导论-------------快排的研究
快速排序采用的是分治算法思想,对包含n个数的输入数组,最坏情况下运行时间为θ(n^2),但是平均性能相当好,期望的运行时间为θ(nlgn)。另外快速排序能够就地排序(我理解是不需要引入额外的辅助空间,每次划分能确定一个元素的具体位置),在虚拟环境中能很好的工作。原创 2014-11-16 17:00:44 · 953 阅读 · 0 评论 -
归并排序算法的理解
归并排序:先对两个有序的系列进行合并,合并的时候不断的对两个系列的第一个元素进行比较,把较小的那个移动到最前面成为了第一个元素,那么移动的元素后面的元素就是成为了下次比较的序列的第一个元素,如此不断的取两个系列的第一个元素进行比较。原创 2014-11-02 23:01:26 · 1967 阅读 · 0 评论 -
算法导论-------------中位数和顺序统计学
文章来自网络加课本: 本次学习的内容讨论的问题是在一个由n个不同数值构成的集合中选择第i个顺序统计量问题。主要讲的内容是如何在线性时间内O(n)时间内在集合S中选择第i小的元素,最基本的是选择集合的最大值和最小值。一般情况下选择的元素是随机的,最大值和最小值是特殊情况,书中重点介绍了如何采用分治算法来实现选择第i小的元素,并借助中位数进行优化处理,保证最坏保证运行时间是线性的O(n)。原创 2014-11-21 22:51:04 · 1651 阅读 · 0 评论 -
算法导论-----------2-8章----9种排序算法的总结
研究算法的人知道,排序算法真的很重要,也是算法研究中的最基础的东西,研究算法先研究排序算法,排序的问题无处不在..........排序的定义:输入:n个数:a1,a2,a3, ...,an输出:n个数的排列:a1',a2',a3',...,an',使得a1'In-place sort(不占用额外内存或占用常数的内存):插入排序、选择排序、冒泡排序、堆排序、快速排原创 2014-11-22 22:31:54 · 1556 阅读 · 0 评论 -
算法导论------------栈(stack)简单的数组实现
栈和队列都是动态集合,元素的出入是规定好的。栈规定元素是先进后出(FILO),队列规定元素是先进先出(FIFO)。栈和队列的实现可以采用数组和链表进行实现。在标准模块库STL中有具体的应用,可以参考http://www.cplusplus.com/reference/。栈的基本操作包括入栈push和出栈pop,栈有一个栈顶指针top,指向最新如栈的元素,入栈和出栈操作操作都是从栈顶端进原创 2014-11-23 22:55:30 · 1619 阅读 · 1 评论 -
插入排序之算法研究
#include#includeusing namespace std;//void insert_sort(vector &a)//{// int temp;// size_t n = a.size();// for ( int i= 1; i < n; i++)// {// for (int j = i - 1; j >= 0 && a[j]>a[j + 1]; j--原创 2014-11-08 01:30:39 · 1143 阅读 · 0 评论 -
算法导论---------------散列表(hash table)
摘要: 本章介绍了散列表(hash table)的概念、散列函数的设计及散列冲突的处理。散列表类似与字典的目录,查找的元素都有一个key与之对应,在实践当中,散列技术的效率是很高的,合理的设计散函数和冲突处理方法,可以使得在散列表中查找一个元素的期望时间为O(1)。散列表是普通数组概念的推广,在散列表中,不是直接把关键字用作数组下标,而是根据关键字通过散列函数计算出来的。书中介绍散列表非原创 2014-11-30 02:22:15 · 1458 阅读 · 0 评论 -
算法导论-----------堆排序研究 (堆排序原理及算法实现(最大堆))
算法导论之 堆排序研究原创 2014-11-15 00:16:37 · 2903 阅读 · 0 评论