![](https://img-blog.csdnimg.cn/20200628111155593.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++数据结构算法
C++数据结构算法
Vegdie
oier
展开
-
并查集操作
初始化void init_set(int n){ // Disjoint Set init for (int i = 0; i <= n ;i++) f[i] = i;}查找int search_fa(int x){ // path compress if (f[x] != x) { f[x] = search_fa(f[x]); } return f[x];}合并(路径压缩)void mer原创 2021-11-25 22:22:06 · 538 阅读 · 0 评论 -
划分数问题——盘子与小球——排列组合——递推式思维转化
0#引入考试时遇到同球同盘的问题,一开始想用插板法,终究失败,只拿了20分,回家问了老师,老师告了我方法并让我自己研究剩下三种。1#同球同盘——递推或递归(+记忆化改进优化)这个我有真题http://www.kencoding.net/problem.php?id=1369,大家可以去做一下我先把递推公式列在这里:(n是球数,m是盘子数){f(0,0)=1f(n,1)=1f(n,m)=f(n,n) if(n<m)f(n,m)=f(n−m,m)+f(n,m−原创 2021-08-02 09:08:14 · 2185 阅读 · 0 评论 -
快速幂算法笔记
快速幂是一个logn时间复杂度的算法,其目的是计算an。在此基础上可以加入快速幂模,以便于存储数字。让我们先来思考一个问题:7的10次方,怎样算比较快?方法1:最朴素的想法,7*7=49,49*7=343,… 一步一步算,共进行了9次乘法,也就是O(n)的复杂度。这样算无疑太慢了。这时我们想到,也许可以拆分问题。方法2:先算75,即7*7*7*7*7,再算它的平方,共进行了5次乘法。但这并不是最优解,因为对于“7的5次方”,我们仍然可以拆分问题。方法3:先算7*7得49,则7的5次方为49*49原创 2021-07-20 14:47:30 · 304 阅读 · 0 评论 -
动态规划:0-1背包 与 完全背包问题摘编
动态规划我推荐在这里学习,https://oi-wiki.org/dp/0-1背包首先我们看一道题在上述例题中,由于每个物体只有两种可能的状态(取与不取),对应二进制中的 和 ,这类问题便被称为「0-1 背包问题」。一直条件有第iii个物品的重量wiw_iwi,价值ViV_iVi,以及背包的总容量W我们用二维数组存储每一种情况。设dp状态fi,jf_{i,j}fi,j为只能放前i 个物品的情况下,容量为j 的背包所能达到的最大总价值。考虑状态转移方程。假设当前已经陈富华里后了前i-1原创 2021-07-18 22:27:16 · 234 阅读 · 0 评论 -
获取一个数字的所有约数并存储进数组的算法,Getdivisor,O(sqrt(n))
Getdivisor();O(n)O(\sqrt{n})O(n)It’s very similar to, or even the same code as, the algorithm for determining prime numbersvoid getDivisor(){ len = 0; for (int i = 1; i * i <= n; i++) // or sqrt(n), but should add "cmath" or "maht.h" { if (n %原创 2021-05-24 22:50:24 · 4056 阅读 · 0 评论 -
数据结构之图笔记:图论基础术语以及基础知识略
基本概念:一、顶点(vertex)上图中黑色的带数字的点就是顶点,表示某个事物或对象。由于图的术语没有标准化,因此,称顶点为点、节点、结点、端点等都是可以的。叫什么无所谓,理解是什么才是关键。二、边(edge)上图中顶点之间蓝色的线条就是边,表示事物与事物之间的关系。需要注意的是边表示的是顶点之间的逻辑关系,粗细长短都无所谓的。包括上面的顶点也一样,表示逻辑事物或对象,画的时候大小形状都无所谓。三、路径/最短路径(path/shortest path)在图上任取两顶点,分别作为起点(start原创 2021-05-07 22:35:57 · 6917 阅读 · 3 评论 -
二叉树笔记:二叉树建立、输出(使用括号)、三种遍历、层序遍历等小功能代码记录
数据结构与算法学习网站:http://data.biancheng.net/其实二叉树并不适合用数组存储,因为并不是每个二叉树都是完全二叉树,普通二叉树使用顺序表存储或多或多会存在空间浪费的现象。最让我感觉难的地方并不是这些函数的递归,而是建立链式存储结构时的指针,老是让人摸不着头脑,还是地址没学好????。结构体——链式存储:typedef struct BiTNode{ TElemType data;//数据域 struct BiTNode *lchild,*rchild;//左右原创 2021-05-07 17:00:49 · 1511 阅读 · 0 评论 -
最小生成树(还没写完)
最小生成树目标:在网络(带权图)的多个生成树中(生成森林),寻找一个各边权值之和最小的生成树。首先明确:使用不同的遍历图的方法,可以得到不同的生成树(广度与深度);从不同的顶点出发,也可能得到不同的生成树。按照生成树的定义,n个顶点的连通网络的生成树肯定有n个顶点和仅仅n-1条边构造最小生成树的准则:必须只使用该网络中的边来构造最小生成树必须使用且仅使用n-1条边来联结网络中的n个顶点不能使用产生回路的边欲在n个城市间建立通信网,则n个城市应铺n-1条线路;但因为每条线路都会有对应原创 2021-02-05 21:50:25 · 340 阅读 · 0 评论 -
简化二叉树表示表达式用有向无环图表示
例如:((a + b) * (b * (c + d)) + (c + d) * e) * ((c + d) * e)发现有多个c+d的子树,为了简化,我们使用有向无环图原创 2021-02-03 10:12:04 · 755 阅读 · 0 评论 -
深入浅出线段树,Segment Tree学习笔记略
树什么是线段树性质及特点基本概念4倍维护函数构建用结构体建树查询更新删除以及插入这个操作是不行的,因为如果删除或插入一个元素,那么整个树的结构就会崩塌,下标就不对应了,如果重新更新那么需要耗费很多的时间,唯一可行的办法是提前预留空间,这里不演示插入。区间统一加值、改值并更新,懒操作(Lazy 操作)懒操作——统一加值对于线段树而言,对区间的值的修改,如果修改到叶子结点,其复杂度为O(n)线段树之所以能提升效率,是因为其在计算某个区间的特性时,大量使用了内部结点(记录了一原创 2021-02-02 17:50:12 · 2823 阅读 · 1 评论 -
素数筛法略
用筛法求素数的基本原理,是把从1开始的某一范围内的正整数从小到大顺序排列,逐步筛掉非素数留下素数。用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。如有:1 2 3 4 5 6 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25 26 27 28 29 301不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余原创 2021-01-31 08:06:28 · 1869 阅读 · 0 评论 -
关于最大公约数gcd算法的扩展
更多数字的最大公约数可以逐步分解为更小的最大公约数gcd(a, b, c) = gcd(gcd(a, b), c);两个数的最小公倍数就是这两个数的乘积除以最小公倍数lcm(a, b) = (a * b) / gcd(a, b); //定义lcm()为最小公倍数函数...原创 2021-01-23 20:43:26 · 312 阅读 · 0 评论 -
最大公约数——欧几里得算法最简便
如果a%x=0,我们称x是a的约数(或因数),也称a是x的倍数a与b的最大公约数,是指一个最大的整数x,使得x同时是a和b的约数,我们将a与b的最大公约数记作gcd(a,b)求最大公约数的方法:欧几里得算法(辗转相除)循环版本:int gcd(int a, int b){ int tmp; while (b) { tmp = b; b = a%b; a = tmp; } return a;}递归一句话版本int gcd(int a, int b){ retur.原创 2021-01-23 20:38:22 · 178 阅读 · 0 评论 -
C语言中智能获得数组长度
int len = sizeof(数组名) / sizeof(数组元素类型);例如:int a[101];int len = sizeof(a) / sizeof(int) << endl;char chs[101];int len2 = sizeof(a) / sizeof(char) << endl;输出:101101原理:一个数组有n个元素,每一个元素都有自己的长度,其中区分类型,这里给一个常用的长度。int 4字节,32位long long原创 2021-01-03 17:30:13 · 299 阅读 · 0 评论 -
斐波那契数列实现方法递归解决、递归优化算法
首先基础的递归算法#include <stdio.h>#include <string.h>#include <windows.h>#include <iostream>DWORD time_start, time_end;int book[1001];int fac(int i){ if ((i == 1) || (i == 2)) return 1; if (i > 2) { retur原创 2020-12-06 17:03:01 · 661 阅读 · 1 评论 -
冒泡排序算法以及优化
什么是冒泡排序呢?冒泡排序的英语名是Bubble Sort,是一种最基础的交换排序。大家一定都喝过汽水吧,汽水中常常有许多小小的气泡,往上飘,这是因为组成小气泡的二氧化碳比水要轻,所以小气泡才会一点一点的向上浮。而冒泡排序之所以叫冒泡排序,正是因为这种排序算法的每一个元素都可以向小气泡一样,根据自身大小,一点一点向着数组的一侧移动。具体如何移动呢?我们来看一下例子:有8个数组组成一个无序数列:5,8,6,3,9,2,1,7,希望从大到小排序。按照冒泡排序的思想,我们要把相邻的元素两两进行比较,根据大小转载 2020-12-01 22:14:55 · 1578 阅读 · 4 评论 -
深搜的剪枝优化技巧
【概述】搜索算法的时间复杂度大多是指数级的,难以满足对程序运行时间的限制要求,为使降低时间复杂度,对深度优先搜索可以进行一种优化的基本方法——剪枝。搜索的进程可以看做是从树根出发,遍历一颗倒置树(搜索树)的过程,所谓剪枝,就是通过某些判断,避免一些不必要的遍历过程,形象的说,就是减去搜索树中的某些枝条。显而易见,应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条舍弃哪些枝条保留,设计出好的剪枝判断方法,可以使得程序运行时间大大缩短,否则会适得其反。剪枝的原则:正确、准确、高效【优化技巧】原创 2020-11-28 21:04:02 · 448 阅读 · 1 评论 -
C++KKT基本算法模拟算法【蚱蜢】
模拟算法 蚱蜢描述有一天,一只蚱蜢像往常一样在草地上愉快地跳跃,它发现了一条写满了英文字母的纸带。蚱蜢只能在元音字母(A、E、I、O、U、Y)间跳跃,一次跳跃所需的能力是两个位置的差。纸带所需的能力值为蚱蜢从纸带开头的前一个位置根据规则跳到纸带结尾的后-个位置的过程中能力的最大值。蚱蜢想知道跳跃纸带所需的能力值(最小)是多少。如图9.3-1所示的纸带所需的能力值(最小)是4。输入一行一个字符串,字符串长不超过100。输出一行一个整数,代表(最小)能力值。理解故名思其模拟意,意把差值按原创 2020-11-21 20:40:45 · 2482 阅读 · 0 评论 -
C++KKT基本算法进制转换【数列】
基本算法 数列描述给定一个正整数k,把所有k的方幂及所有有限个互不相等的k的方幕之和构成一个递增的序列。例如,当k=3时,这个序列是:1.3.4.9.10,12,13, …请求出这个序列的第n项的值(用十进制数表示)。输入一行两个正整数k和n,之间用一个空格隔开,且3<=k<=15, 10<=n<=1000。输出一行一个正整数。解题把n转成二进制,按位取其k方幂。程序#include <iostream>#include <cmath>原创 2020-11-21 20:37:50 · 557 阅读 · 0 评论 -
DFS深度优先刷题【1215:迷宫】
http://ybt.ssoier.cn:8088/problem_show.php?pid=12151215:迷宫时间限制: 1000 ms 内存限制: 65536 KB【题目描述】一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出原创 2020-11-13 21:02:02 · 248 阅读 · 0 评论 -
DFS深度优先搜索从入门到入坟
DFS深度优先搜索与回溯入门讲解——不见南墙不死心深度优先(DFS,Deep First Search)和回溯计算机解题中常用的算法,很多问题无法根据某种确定的计算法则来求解,可以利用搜索与回溯的技术求解。回溯是搜索算法中的一种控制策略。它的基本思想是:为了求得问题的解,先选择某一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或证明无解。如迷宫问题:进入迷宫后,先随意选择一个前进方向,一步步向前试探前进(搜索),如果碰到死胡同,说原创 2020-11-04 16:37:28 · 774 阅读 · 0 评论 -
跳台阶问题-经典递归练习题-C++
将台阶分解,一次可以跳1节或者2节,所以就是return f(n - 1) + f(n - 2)分解成两部分所以,如果能走一格,就还剩下三个。走两个,就还剩下两个。最后到边界条件。Java:/** * 案例2 分治算法 走楼梯 * 一个台阶总共有n级,如果一次可以走1级,也可以一次走2级,求总共有多少种走法。 * 分析: * 如果只有1级台阶,则只有一种走法,如果有2级台阶,则有2种走法:一次走1级或一次走2级 * 假设有三级台阶,则可以一次走1级或一次走2级,如果一次走1级则还剩2级台阶原创 2020-10-02 21:41:20 · 1001 阅读 · 0 评论 -
大白话说单链表,基础使用
我是看着【C语言】带你学C带你飞和《啊哈!算法》学习的,建议看看链表这章 【C语言】《带你学C带你飞》(小甲鱼) 链表,指针!结构体可不可以这样struct Test{ int x; int y; struct Test test;};哦这显然是不行的,这样会陷入无限循环,test的结构体又会指向自己,再次指向,就成了没有出口的递归,但是有一种方法可以解原创 2020-06-07 12:07:48 · 303 阅读 · 0 评论 -
C++STL标准库——双端队列deque
C++STL标准库——双端队列deque其实deque的最大特点就是双端,其可以实现队首队尾都插入的功能对比各种stl容器的存取难度vector:只能插入在队首,但是提供下标访问方式。⭐️⭐️⭐️stack:不支持下标访问,存入只能存进栈顶,取出最后一个必须一个一个pop。⭐️queue:只能插入进队首,不支持下标⭐️⭐️array:类似数组(几乎就是),支持下标,可在任何地方插入⭐...原创 2020-05-02 16:51:14 · 567 阅读 · 0 评论 -
笔记:C++五一学习-分治
今天是五一,晚上学C++分治算法1、二分查找二分查找跨度大,速度快,枚举的跨度为1,所以慢二分是折半的,速度logn,非常快,基础代码如下参数aTarget是目标数,aData是数列,n是数组长度如果按照枚举的方法,是这样的:bool Search(int aTarget, int aData[], int n){ for (int i = 0; i < n; i++) ...原创 2020-05-02 11:49:29 · 286 阅读 · 0 评论 -
STL:容器—栈
栈(Stack)又名堆栈,它是一种重要的数据结构。从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作是线性表操作的子集,它是操作受限的线性表,因此,可称为限定性的数据结构。限定它仅在表尾进行插入或删除操作。表尾称为栈顶,相应地,表头称为栈底。栈的基本操作除了在栈顶进行插入和删除外,还有栈的初始化,判空以及取栈顶元素等。原创 2020-04-21 11:58:28 · 375 阅读 · 1 评论 -
STL之队列 笔记
STL之队列:sunny:Queue:sunny:Queue没有迭代器Queue的构造函数引入include基础操作练练手?:+1:队列经典题目1、:books:判断回文字符串-简单2、:books:取牌游戏-简单3、:books:经典约瑟夫环-中等4、:books:酒桌游戏-中等5、洛谷P2058 海港-中等6、更多题目参考文档☀️Queue☀️Queue是一种先进先出(First In ...原创 2020-04-20 22:06:34 · 211 阅读 · 0 评论 -
C++集合-初识Set
C++集合-初识SetSet是C++中模板库的一个STL库,Set就像英文中的意思一样是集合1,关于集合必须说明set是关联式容器。set作为容器,也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能够根据元素的值自动进行排序。应该注意的是set中的值不能被直接改变。C++ STL中标准关联容器set, multiset, map, mu...原创 2020-04-19 18:07:02 · 377 阅读 · 0 评论 -
C++String类详细整理
文章目录String类——按照类的方式进行动态管理字符串调用说明1、引入头文件2、命名空间String简介String语法基础定义输入整行输入输出测试代码1string的比较操作string类的常用构造函数:string类的常用函数此文章参考其他人的两篇文章,所以标为转载,点击这里查看参考文档查看String类——按照类的方式进行动态管理字符串调用说明1、引入头文件string要使用先引...原创 2020-04-10 12:27:02 · 257 阅读 · 0 评论 -
STL三大组件介绍
此文参考别人的文章记录,不完全是抄,但是也标为转载想看参考点击这里1、容器几乎可以说,任何特定的数据结构都是为了实现某种特定的算法。STL容器就是将运用最广泛的一些数据结构实现出来。常用的数据结构:数组(array) , 链表(list), 树(tree),栈(stack), 队列(queue), 集合(set),映射表(map), 根据数据在容器中的排列特性,这些数据分为序列式容器和关联...转载 2020-04-09 20:49:16 · 298 阅读 · 0 评论 -
STL简介
专栏:STL1.1 什么是STL?STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框...转载 2020-04-09 18:55:02 · 326 阅读 · 0 评论 -
C++中判断汉字
C++采用的是ANSI编码,是ASCLL编码的进阶字符串可以用ANSI,但是char不行ASCLL编码是DOS时代的东西了下面我来告诉你判断汉字的方法!认真听好了!Unsigned Char可以接受ANSI,光是Char不行bool check(unsigned char c)所以我们可以实现曾经的梦想,在统计字符中加入统计汉字原创 2020-03-30 13:32:28 · 5155 阅读 · 0 评论 -
Vector整行输入
Vector动态数组字符类型-整行输入文章目录问题描述解决方法1.自己写函数2.代码Solution问题描述 我们在字符串输入的时候,如果要输入一行字符,就直接用std::cin就可以,但是如果要输入hello world呢?就要用到getline()整行输入,getline或cin.getline的详细介绍见前面的链接。 但是,我们用vector的char类型动态数组怎么整行输入呢?...原创 2020-03-03 14:32:53 · 827 阅读 · 1 评论 -
数据结构与算法基础
一、数据结构概述数据结构的主要任务是通过分析数据对象的结构特征,包括逻辑结构及数据对象之间的关系,然后把逻辑结构表示成计算机课实现的物理结构,从而便于计算机处理。概念术语:1)数据(Data):是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输出给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包括字符及声音、图像、视频等非数值类型; 2)数据元素(Dat...原创 2020-02-04 10:45:40 · 513 阅读 · 0 评论