![](https://img-blog.csdnimg.cn/20210528134636346.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 80
数据结构与算法
SOC罗三炮
嵌入式软件开发,ARM CPU架构研究,某厂芯片SOC系统验证工程师
展开
-
从放苹果问题到零钱兑换问题(动态规划)
放苹果问题题目描述把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1是同一种分法。数据范围:0<=m<=10,1<=n<=10。输入描述:输入两个int整数输出描述:输出结果,int型示例1输入:7 3输出:8举例:总结:m=0,没有苹果,所有盘子空着,一种放法,即f(0,n) = 1; n=0,没有盘子,没办法放,即f(m,...原创 2021-04-25 11:20:22 · 358 阅读 · 0 评论 -
C/C++冒泡排序4种优化方法
普通冒泡排序:优化1:设置排序完成标志优化2:使用位运算交换两个数优化3:跳过无意义的交换优化4:转载 2021-04-10 18:04:20 · 4799 阅读 · 0 评论 -
C++四则运算字符串解析(附动图以及动图制作方法)
算法动态演示的演示图一般是怎么制作的,PPThttps://juejin.cn/post/6844903749203263501https://github.com/MisterBooo/Play-With-Sort-OChttps://www.screentogif.com/原创 2021-04-05 15:42:47 · 3381 阅读 · 1 评论 -
C++堆排序的原理及实现
首先回顾下堆的数据结构的特点:堆的描述堆是一颗二叉树,这样的二叉树是局部有序的,任何节点与其兄弟节点之间都没有必然的顺序联系,但是它与父子节点之间有大小顺序关系,按照关系的不同,分为最大值堆和最小值堆:最大值堆:子节点比父节点小的堆,根节点是树中最大的节点。 最小值堆:子节点比父节点大的堆,根节点是树中最小的节点。堆是左平衡的树,所以随着节点的增加,树会逐级从左至右增长。因此对于一个堆来说,一个比较好的表示左平衡二叉树的方式是:将节点通过水平遍历的方式连续存储到一个数组中。假设有一个零原创 2021-03-31 15:55:30 · 3219 阅读 · 3 评论 -
C++使用队列实现二叉树的层序遍历(BFS广度优先搜索)
BFS 通常借助队列的先入先出特性来实现。算法流程:特例处理: 当树的根节点为空,则直接返回空列表 [] ; 初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ; BFS 循环: 当队列 queue 为空时跳出; 出队: 队首元素出队,记为 node; 打印: 将 node.val 添加至列表 tmp 尾部; 添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ; 返回值: 返回打印结果列表 res...原创 2021-03-14 21:11:07 · 910 阅读 · 3 评论 -
常用查找算法总结
一、顺序查找 条件:无序或有序队列。 原理:按顺序比较每个元素,直到找到关键字为止。 时间复杂度:O(n)二、二分查找(折半查找) 条件:有序数组,折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,折半查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,那就不建议使用。 原理:查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束; 如果某一特定元素大于或者小于中间转载 2021-02-13 14:46:54 · 3019 阅读 · 0 评论 -
常用排序算法总结
排序算法可以分为两大类:比较排序和线性时间排序。比较排序:依赖于比较和交换来将元素移动到正确的位置上。时间复杂度不可能小于O(n logn)。 线性时间排序:依赖于数据集合中的某些特征,并不是所有场合都能使用,时间复杂度为O(n)。某些排序算法只使用数据本身的存储空间来处理和输出数据(就地排序);而有些则需要额外的空间来处理和输出数据。插入排序 O()插入排序虽然不是最有效的排序算法,但是它简单,并且不需要额外的存储空间。其最佳的应用场景是对一个小的数据集合进行递增排序。打扑克整理扑克牌时,原创 2021-02-12 22:30:31 · 505 阅读 · 0 评论 -
数据结构之图
图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关联和联系。对象由顶点表示,而对象之间的关系或关联则通过顶点之间的边来表示。图的搜索方法:深度优先 广度优先原创 2021-02-09 21:02:23 · 178 阅读 · 0 评论 -
数据结构之堆和优先队列
在许多问题中,当对数据集进行频繁的插入和删除操作时,往往需要快速确定最大或最小的元素。处理这种问题的方法之一,就是使用一个已经排好序的数据集。通过这种方法,最大或最小的元素总是处在数据集的头部(这取决于升序还是降序)。然而将数据集一遍又一遍地排序代价非常高,很多情况下,将元素排序并不是操作的目的,最终我们可能在真正要做的工作外做了许多其他的工作。想要快速找到最大或最小元素,只需要让元素存储在可以找到它的位置上就行。堆和优先队列就是一种处理这种问题的有效方法。堆:是一种树形组织,使我们能够迅速确定包含最大原创 2021-01-17 20:47:23 · 461 阅读 · 0 评论 -
二叉搜索树与AVL树
目录二叉搜索树AVL树AVL树的旋转LL旋转LR旋转RR旋转RL旋转二叉搜索树二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。左小右大:小于根节点的数放左边,大于根节点的数放右边。重复的节点值不允许出现二叉搜索树中序遍历得到的值.原创 2021-01-05 20:03:54 · 879 阅读 · 0 评论 -
数据结构之二叉树
树的一个节点拥有多少个子节点取决于树的类型,这个量值称为树的分支因子,它决定了当插入节点是,树的分支扩展速度。二叉树的分支因子为2。二叉树是一种将节点按照层次结构组织起来的数据结构,每个节点最多只有两个与它直接相关联的子节点。二叉树二叉树概念基本形态相关术语特殊类型性质二叉树的应用霍夫曼编码用户界面数据库系统表达式处理人工智能优先级队列二叉树的数据结构树的周游算法先序遍历中序遍历后序遍历层级遍历树的平衡二叉树概念基本形态二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:1、空二原创 2020-12-04 12:14:26 · 2001 阅读 · 0 评论 -
快速排序平均时间复杂度O(n log n),目前最好的一种内部排序方法(C++实现)
快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。算法流程快速排序算法通过多次比较和交换来实现排序,其排序流程如下:(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。(2)将大于或等于分界值的数据集中到数组右边,小原创 2020-11-30 10:22:53 · 1597 阅读 · 0 评论 -
非比较排序:基数排序(radix sort)以线性时间O(n)进行排序(C++实现)
虽然可以证明:任何只使用 比较 的一般排序算法在最坏的情形下需要的运行时间为O(n log n),但是,在某些特殊情况下,以线性时间O(n)进行排序仍然是可能的:基数排序、计数排序、和桶排序。非比较排序基数排序基数排序基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。时间效率 :设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radi原创 2020-11-26 17:01:12 · 210 阅读 · 0 评论 -
使用插入排序、归并排序对链表进行排序
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next)原创 2020-11-21 21:28:02 · 634 阅读 · 0 评论 -
字典序算法与下一个排列问题算法推导
字典序算法一.字典序基础二.字典序算法相关下一个排列问题算法推导算法过程求字典序全排列递归方法一.字典序基础字典序(dictionary order),又称 字母序(alphabetical order),原意是表示英文单词在字典中的先后顺序,在计算机领域中扩展成两个任意字符串的大小关系。 英文中的 字母表(Alphabet) 按照如下的顺序排列: ABCDEFG HIJKLMN OPQRST UVWXYZ abcdefg hijklmn opqrst uvwxyz原创 2020-11-10 16:02:45 · 445 阅读 · 1 评论 -
C++哈希表unordered_map的使用以及与map和hash_map的对比
哈希表c++中map与unordered_map的区别内部实现机理优缺点以及适用处map 优点map缺点unordered_map 优点unordered_map 缺点unordered_map是hash_map的替代名称hash_map原理unordered_map详解1. 原型2. 说明3. 容器属性4. 常用函数c++中map与unordered_map的区别内部实现机理map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,对于map进行的查找,删原创 2020-11-01 15:46:41 · 7884 阅读 · 0 评论 -
数据结构之哈希表(散列表)
哈希表支持一种最有效的检索方法:散列。从根本上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素。哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表。哈希函数每次接受一个键将返回与键相对应的哈希编码或哈希值。键的类型可能多种多样,但哈希值的类型只能是整型。由于计算哈希值何在数组中进行索引都只消耗固定的时间,因此哈希表的最大亮点在于:它是一种运行时间在常量级的检索方法。在理想状态,哈希函数能够保证不同的键生成的哈希值互不相同。但是在实际运用过程中,能够直接寻址原创 2020-10-29 11:06:57 · 529 阅读 · 0 评论 -
C++实现二叉树的前序遍历和后序遍历(递归)
前序遍历:首先访问根结点,然后遍历左子树,最后遍历右子树(根->左->右)顺序:访问根节点->前序遍历左子树->前序遍历右子树递归方法/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), righ原创 2020-10-27 15:20:19 · 964 阅读 · 0 评论 -
数据结构之集合
集合是不同对象(称为成员)的无序聚集。集合是成员彼此之间相关,但每个成员在集合中只出现一次的无序聚集。集合的两个特点:成员是无序的每个成员都只在集合中出现一次集合的应用:数据关联:用来确定数据集合之间的关系,例如,求两个集合之间的交集,集合覆盖:一种优化求解问题。例如从一大堆选手中挑选人员来组成一支队伍,每名队员都具有某种特定的技能的组合。我们可以采用集合覆盖的抽象方法来组成一只拥有特定技能组合的最小团队。也就是说,对于团队这个集合所需要的任意一种技能,队伍中应该至少有一名队员拥有这项能力。原创 2020-10-25 18:39:38 · 886 阅读 · 0 评论 -
数据结构之单链表、双向链表和循环链表
链表是一种最为基础的数据结构,原创 2020-10-21 14:56:41 · 1429 阅读 · 0 评论 -
LeetCode-1002-查找常用字符-C语言实现
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。你可以按任意顺序返回答案。示例 1:输入:[“bella”,“label”,“roller”]输出:[“e”,“l”,“l”] 示例 2:输入:[“cool”,“lock”,“cook”]输出:[“c”,“o”]提示:1 <= A.length <= 1001 <=原创 2020-10-15 21:50:03 · 284 阅读 · 0 评论 -
使用埃拉托色尼筛查找2至N内的质数
筛选步骤:(1)先把1删除(现今数学界1既不是质数也不是合数)(2)读取队列中当前最小的数2,然后把2的倍数删去(3)读取队列中当前最小的数3,然后把3的倍数删去(4)读取队列中当前最小的数5,然后把5的倍数删去(5)读取队列中当前最小的数7,然后把7的倍数删去(6)如上所述直到需求的范围内所有的数均删除或读取输入上限N,查找2-N内的所有质数,代码如下:#include <iostream>using std::cout;using std::cin.原创 2020-10-13 15:29:24 · 238 阅读 · 0 评论 -
二叉搜索树(排序树)
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树中序遍历得到的值序列是递增有序的如上图,中序遍历得到的序列为:[2, 5,9, 12, 14, 16, 17, 18, 19]...原创 2020-10-12 18:41:10 · 514 阅读 · 0 评论 -
C语言实现二叉树的中序遍历
二叉树是一种重要的数据结构,对二叉树的遍历也很重要。这里简单介绍三种二叉树中序遍历的方法。二叉树的中序遍历就是首先遍历左子树,然后访问当前节点,最后遍历右子树。对于下面的二叉树,中序遍历结果如下: 结果:[5,10,6,15,2] 直观来看,二叉树的中序遍历就是将节点投影到一条水平的坐标上。如图: 1、递归法这是思路最简单的方法,容易想到并且容易实现。递归的终止条件是当前节点是否为空。首先递归调用遍历左子树,然后访问当前节点,最后递归调用右子树。代码如下: void inorder(s原创 2020-10-12 16:52:18 · 7243 阅读 · 0 评论 -
数据结构之算法分析O表示法
算法分析最坏情况分析为什么要考虑最坏情况O表示法O表示法简单规则计算的复杂度最坏情况分析通常评判算法性能的三种情况:最佳情况平均情况最坏情况算法在不同的情况下性能差异可能很大。比如一种简单的线性搜索算法,它从数据集头部遍历到尾部查找一个数据。最好情况是要查找的元素在数据集的第一个位置,平均情况是可能在数据集中间的某个位置找到该元素,最坏情况是该元素位于数据集最后一个位置,需要遍历所有元素才能找到该元素。为什么要考虑最坏情况许多算法在最坏情况下会消耗相当长的时间考虑算法在最佳情况下的性原创 2020-10-11 16:36:08 · 2632 阅读 · 0 评论