![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
SYiLin
人生是一场长跑,现在一定要沉得住气,静得下心来踏踏实实努力~~
展开
-
利用优先队列写哈夫曼树
数据结构中,对于用哈夫曼树写优先队列,相信网上有很多种方法,可是我认为,我这可能是最简单的方法了。我利用了优先队列,建立哈夫曼树的时候只要在哈夫曼树里面弹出两个根节点,进行频率的计算,然后把新的根节点压入新的队列(链表)里面,当然,在写压入函数的时候要写排序,这样,就可以在压入的时候进行排序,下次再弹出的时候就可以继续弹出两个最小的了!对于上一篇的优先队列,因为要把之前测试的int类型改为原创 2016-11-21 20:49:37 · 2162 阅读 · 2 评论 -
<五大经典算法> 五、分治算法
分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的转载 2017-03-18 11:28:45 · 1116 阅读 · 0 评论 -
<五大经典算法> 四、回溯法
1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 许多复杂的转载 2017-03-18 11:27:39 · 559 阅读 · 0 评论 -
<五大经典算法> 三、分支限界法
分支限界法一、基本描述 类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。 (1)分支搜索算法 所谓“分转载 2017-03-18 11:24:44 · 1539 阅读 · 0 评论 -
<五大经典算法> 二、贪心算法
贪心算法一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前转载 2017-03-18 11:23:27 · 430 阅读 · 0 评论 -
<五大经典算法> 一、动态规划算法
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能转载 2017-03-18 11:21:47 · 356 阅读 · 0 评论 -
利用优先队列编写哈夫曼树和编码
利用“有序链表”来实现优先队列,链表元素按优先级递减。元素出列即出首元素,元素入列即将元素插入有序链表使其依然有序。本程序中,字符频率小则优先级高。typedef int PQElemType;//后期需要改回HuffmanTree类型//"优先链表"基于(有序)链表LinkListtypedef struct PQNode{ PQElemType data; PQ原创 2016-11-17 19:16:02 · 2756 阅读 · 0 评论 -
图的遍历与输出 (邻接矩阵和邻接表)
#include #include #include "graph.h"using namespace std;int main(){ freopen("data.in" , "r" , stdin);// cout << "\n ** 生成邻接矩阵图,并进行DFS遍历输出: "<< endl;// MGraph mg ;// createMGra原创 2016-12-05 18:15:21 · 9574 阅读 · 0 评论 -
如何计算算法的时间复杂度
求解算法的时间复杂度的具体步骤是: ⑴ 找出算法中的基本语句; 算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。 ⑵ 计算基本语句的执行次数的数量级; 只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:转载 2016-12-19 18:03:40 · 782 阅读 · 0 评论 -
教你彻底学会动态规划(1)
动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙述概念,讲解原理,让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的时候又会觉得无所适从。我觉得,理解算法最重要的还是在于练习,只有通过自己练习,才可以更快地提升。话不多说,接下来,下面我就通过一个转载 2017-03-15 12:49:56 · 589 阅读 · 0 评论 -
教你彻底学会动态规划(2)
在我的上一篇文章中已经详细讲解了动态规划的原理和如何使用动态规划解题。本篇文章,我将继续通过例子来让大家更加熟练地使用动态规划算法。 话不多说,来看如下例题,也是在动态规划里面遇到过的最频繁的一个题,本题依然来自于北大POJ: 最长公共子序列(POJ1458) 给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到转载 2017-03-15 12:48:22 · 628 阅读 · 0 评论 -
NYOJ 273 字母小游戏
#include #include using namespace std;const char a[26] = { 'z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y' };int main(){ int N,n; strin原创 2017-04-26 11:50:21 · 425 阅读 · 0 评论