![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法入门到进阶
文章平均质量分 81
Jacky~~
Learning Linux kernel!
展开
-
算法入门到进阶(Huffman编码)
文章目录案例源码测试案例输入一个字符串,分别用普通ASCII编码(每个字符8bit)和Huffman编码,输出编码后的长度,并计算出压缩比。输入样例:AAAAABCD输出样例:64 13 4.9源码#include<iostream>using namespace std;#include<queue>#include<string>#include <iomanip>//创建一个优先级队列,按从小到大的顺序进行排序pri原创 2022-04-14 15:21:26 · 150 阅读 · 0 评论 -
算法入门到进阶(贪心法)
文章目录基本概念应用规则解析源码测试归纳贪心法适用特征最优子结构性质贪心选择性质贪心法使用常见问题区域覆盖问题最优装载问题多及调度问题活动安排问题源码测试基本概念贪心(Greedy)是最容易理解的算法思想:把整个问题分解为多个步骤,在每个步骤都选取当前步骤的最优方案,直到所有步骤结束;在每一步都不考虑对后续步骤的影响,在后序步骤中也再也不回头改变前面的选择。简单的说就是走一步看一步,不吃回头草!应用规则 某人带着3中面值的硬币去购物,有1元,2元,5元的,硬币数量不限; 他需要支付M元,问怎么支原创 2022-04-13 15:54:07 · 1105 阅读 · 0 评论 -
二叉搜索树(BST)——Treap树
文章目录Treap树Treap树的唯一性Treap树的平衡问题Treap树的插入Treap树的删除案例源码运行结果Treap树Treap树是一种比较简单的平衡二叉树。Treap是一个合成词,把Tree和Heap各取一半组合而成。Treap是树和堆的结合,可以翻译成堆树。二叉搜索树的每一个结点有一个键值,除此之外,Treap树为每一个结点还人为的添加了一个被称为优先级的权值。对于键值来说,这颗树是排序二叉树;对于优先级来说,这颗树是一个堆。堆的特征是:在这棵树的任意子树上,根结点的优先级最大。Tr原创 2022-04-04 16:21:15 · 1303 阅读 · 0 评论 -
关于链表中环的入口结点的两种解法(C/C++)
文章目录前言描述方法一——使用STL容器,set集合源码通过测试方法二——快慢指针思路源码通过前言题目来源于牛客网描述给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。数据范围: n≤10000n\le10000n≤10000, 1<=结点值<=100001<=结点值<=100001<=结点值<=10000要求:空间复杂度 O(1)O(1)O(1),时间复杂度 O(n)O(n)O(n)例如,输入{1,2},{3,原创 2022-03-26 16:50:48 · 752 阅读 · 0 评论 -
算法入门到进阶——二叉树
文章目录基本概念二叉树的存储二叉树的性质二叉树的存储结构二叉树的遍历宽度优先遍历深度优先遍历先序遍历中序遍历后序遍历例题题目思路源码运行结果同理,已知中序和后序,输出先序源码运行结果基本概念树是非线性数据结构,它能很好的描述数据的层次关系。树形结构的现实场景很常见,例如,文件目录,书本的目录就是典型的树形结构。二叉树是最常用的树形结构,特别适合程序设计,常常将一般的树转换成二叉树来处理。二叉树的存储二叉树的性质二叉树的每个结点最多有两个子结点,分别是左孩子,右孩子,以它们为根的子树称为左子树和原创 2022-03-19 19:39:39 · 761 阅读 · 0 评论 -
算法入门到进阶——并查集
文章目录基本概念例题源码运行结果优化源码运行结果再优化源码运行结果基本概念并查集(Disjoint Set)是一种非常精巧而且实用的数据结构,它主要用于处理一些不相交集合的问题。经典的例子有连通子图、最小生成二叉树Kruskal算法和最近公共祖先等。通常用“帮派”的例子来说明并查集的应用背景。在一个城市中有n个人,它们分成不同的帮派;给出一些人的关系,例如1号和2号是好朋友,2好和3号是好朋友,那么他们就属于一个帮派;在分析完所有的朋友关系之后,问有多少帮派,每个人属于那个帮派。给出的n可能是10的原创 2022-03-18 16:17:14 · 804 阅读 · 0 评论 -
算法入门到进阶(三)——搜索技术(DFS和递归)
文章目录DFS和递归案例:用DFS实现红黑瓷钻题目思路源码运行结果分析总结DFS和递归前面博客中“一只老鼠走迷宫的问题”。设num是到达的钻块数量,算法过程描述如下:在初始值令num=1,标记这个位置已经走过。左,上,右,下4个方向,按顺时针顺序选一个能走的方向,走一步。在新位置num++,标记这个位置已经走过。继续前进,如果无路可走,回退到上一步,换个方向再走。继续上面的过程,直到结束。在以上过程中,能够访问到所有合法的钻块,并且每个钻块只访问一次,不会重复访问(回退不算重复),如下原创 2022-02-04 11:36:00 · 846 阅读 · 0 评论 -
算法入门到进阶(三)——搜索技术(BFS和A*算法)
文章目录用BFS求最短路径A*算法与最短路径A*算法与八数码问题双向广搜题目思路用BFS求最短路径最短路径是图论的一个基本问题,有很多复杂的算法。不过,在特殊的地图中,BFS也是很好的最短路径算法。下面仍然以之前讲的“红黑瓷砖”为例进行分析,任务是求两点之间的最短路径。如下图所示,黑点表示可以走的路,#表示不能走,求起点@到所有黑点的最短距离方法很简单,从@出发用BFS搜索所有点,记录到达每个点时经过的步数,即可得到从@到所有黑点的最短距离,图c给出了答案。在这个例子中,BFS搜最短路径的计算复原创 2022-02-03 19:38:06 · 2062 阅读 · 5 评论 -
算法入门到进阶(三)——搜索技术(八数码问题和状态图搜索)
文章目录基本概念八数码问题八数码问题思路康托展开康托展开的原理案例:判断2143是{1,2,3,4}的全排类中第几大的数题目思路源码(8数码问题)运行结果分析拓展提示:15数码的问题总结基本概念BFS搜索处理的对象不仅可以是一个数,还可以是一种“状态”。八数码问题是典型的状态图搜索问题八数码问题在一个3x3的棋盘上放置编号为1~8的8个方块,每个方块占一格,另外还有一个方块有一个空格。与空格相邻的数字方块可以移动到空格里。任务1:指定初始棋局和目标棋局(如下图)计算出最少移动步数;任务2:输出数码原创 2022-02-02 16:12:17 · 3495 阅读 · 0 评论 -
算法入门到进阶(三)——搜索技术(BFS和队列)
文章目录BFS和DFS案例:“Rad and Black”题目思路源码运行结果分析总结BFS和DFS深度优先搜索(Depth-First Search,DFS)和广度优先搜索(Breadth-First Search,BFS 或称为宽度优先搜索)是基本的暴力技术,常用于解决图,树的遍历问题。首先考虑算法思路。以老鼠走迷宫为例,这是DFS和BFS在现实中的模型。迷宫内部的路错综复杂,老鼠从入口进去以后怎么才能找到出口呢?有两种不同的方法:一只老鼠走迷宫。它在每个路口都选择先走右边(当然,选择先走左原创 2022-01-30 22:21:28 · 884 阅读 · 0 评论 -
算法入门到进阶(三)——搜索技术(子集生成和组合问题)
文章目录前言案例1:打印n位二进制数的所有子集源码运行结果分析回到上一篇博客的问题3题目思路源码运行结果分析总结前言上一篇博客中,我们求10个数的排列问题中,如果不需要输出全排列,而是输出组合,即子集(子集内部的元素是没有顺序的),那么该如何做呢?从以前我们所学的知识中,一个包含n个元素的集合,它的子集有2^n个。用二进制的概念进行对照是最直观的例如n=3的集合{a1,a2,a3},它的子集和二进制的对应关系如下空集:0 0 0a1: 1 0 0a2: 0 1 0a3: 0 0 1原创 2022-01-26 17:41:27 · 641 阅读 · 0 评论 -
算法入门到进阶(三)——搜索技术(递归和排列)
文章目录前言基本概念递归和排列案例1:采用STL库中的next_permutation()函数实现全排列题目思路源码运行结果分析案例1:采用递归求全排列题目思路验证运行结果递归思路源码运行结果分析案例2,打印n个数中任意m个数全排列总结前言搜索技术是基本的编程技术,在算法竞赛学习中是基础的基础。搜索使用的算法是BFS和DFS,BFS用队列,DFS用递归来具体实现。在BFS和DFS的基础上可以扩展出A算法,双向广搜算法,迭代加深搜索,IDA等技术。第三阶段都将详细介绍这些知识点基本概念搜索技术是“暴原创 2022-01-25 20:46:28 · 897 阅读 · 6 评论 -
算法入门到进阶(二)——STL和基本的数据结构(sort函数和next_permutation函数)
文章目录sortsort()的比较函数案例源码运行结果分析sort()还可以对结构变量进行排序相关函数next_permutation例题:Ignatius and the Princess II思路源码运行结果分析总结sortSTL的排序函数sort()是非常常用的函数之一,它的定义有以下两种:void sort(RandomAccessIterator first, RandomAccessIterator last);void sort(RandomAccessIterator first,原创 2022-01-22 21:34:22 · 753 阅读 · 0 评论 -
算法入门到进阶(二)——STL和基本数据结构(set和map)
文章目录setset的相关操作set案例:“产生冠军”源码运行结果分析map案例:"Shopping"源码运行结果分析总结setset就是集合,STL的set是用二叉树实现,集合中的每一个元素只出现一次,并且是排好序的。访问元素的时间复杂度是O(log2n),非常的高效。set和map一般在算法竞赛中应用是十分广泛的,特别是需要用二叉搜索树处理数据的题目,如果用set或map实现,能极大的简化代码。set的相关操作set< Type >A; //定义一个集合,Type表示数原创 2022-01-21 18:14:41 · 722 阅读 · 0 评论 -
算法入门到进阶(二)——STL和基本数据结构(队列和链表)
C++STL中队列,优先队列,链表的解读和实际操作原创 2022-01-20 21:59:38 · 342 阅读 · 0 评论 -
算法入门到进阶(二)——STL和基本数据结构(vector和栈)
主要是对STL概念的介绍,以及通过实际的算法体来掌握vector容器和栈stack的操作和使用注意事项。原创 2022-01-19 18:34:56 · 870 阅读 · 0 评论 -
算法入门到进阶(一)——算法复杂度
文章目录前言一、计算资源例题分析冒泡排序快速排序哈希算法算法的选择二、算法的定义算法的评估总结前言这个专栏我都是参考书籍《算法竞赛入门到进阶》,罗勇军、郭卫斌老师著进行编写的。通过书籍上的材料以及自己的理解来撰写博客。有不恰当的地方,欢迎各位朋友指正!也非常欢迎各位hxd一起学习探讨。一、计算资源程序运行时需要两种资源,即计算时间和存储空间。资源是有限的,一个算法对这两个资源的使用程度可以用来衡量该算法的优劣。时间复杂度:程序运行需要的时间空间复杂度:程序运行需要的存储空间通常用原创 2022-01-18 18:52:31 · 3353 阅读 · 9 评论