- 博客(25)
- 收藏
- 关注
原创 2022/2/17总结
今天用到了昨天学的内容解决问题高精度乘法当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过10位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过20位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726. 编写函数 void Multiply(char* s1, char* s2, c
2022-02-17 22:18:37
162
原创 2022/2/16总结
图的定义:图由顶点和边组成,每条边的两端都必须是图的两个顶点。一般来说,图分为有向图和无向图。有向图的所有边都有方向,确定了顶点到顶点的指向;无向图的所有边都是双向的,无向边所连接的两个顶点可以互相到达。无向图:有向图:顶点的度是指和该顶点相连的边的条数。特别是对于有向图来说,顶点的出边条数称为该顶点的出度,顶点的入边条数称为该顶点的入度。例如无向图中的V1的度为2,有向图中的V3入度为2,出度为1。顶点和边量化的属性称为权值,顶点的权值和边的权值分别称为点权和边权。权值的设定要根.
2022-02-16 23:11:03
179
原创 2022/2/15总结
今天继续高精度的四则运算,原理昨天已经了解过了。高精度减法:bign jian(bign a, bign b){ bign c; for(int i = 0; i < a.lenth || i < b.lenth; i++){ if(a.d[i] < b.d[i]){ //如果出现不够减的情况 a.d[i + 1]--; //向高的一位借位 a.d[i] += 10; //当前位加10 } c.d[c.lenth++] = a.d[i] -
2022-02-16 22:19:58
180
原创 2022/2/14总结
今天主要学习了高精度算法,在理解高精度算法时,我们可以回想一下我们在小学学习整数相加时的格式。从个位开始对齐,每一位数一一对应。高精度加法当我们的各个位数相加时,向较高的一位进一。代码实现:#include<stdio.h>#include<string.h>struct bign //bign即big number的简写,此处先构造一个函数,用于储存每一个大整数{ int d[10000]; int lenth; bign() { memset(
2022-02-14 21:57:54
233
原创 2022/2/13总结
今天接着并查集,并查集查找函数是没有经过优化的,在极端情况下效率较低。如果将所有的元素全部连成一条直线,查找效率就会大大下降。由昨天的学习可以知道,我们定义的find函数上的目的就是查找根结点,由此我们可以将所有的结点的父结点全部指向根结点。思路图如下这是所有的元素连起来的样子,现在我们转换一下,变成这样:这样就不需要一直回溯去找父结点了,时间复杂度直接降到O(1)。代码实现:int find(int x){ if(x == father[x]){ return x; /.
2022-02-13 21:50:35
247
原创 2022/2/12总结
今天主要学习了并查集,并查集是一种维护集合的数据结构,分为“并(合并)”,“查(查找)”,“集(集合)”三部分。并查集用数组实现:int father[N];我们可以从二叉树的角度来分析它,father[i]表示元素i的父结点,而父结点本身也是这个集合内的元素,例:father[1] = 2表示元素1的父结点是元素2,如果存在father[i] = i情况,则说明元素i是该集合的根结点。我们可以从示意图来理解:如图所示,我们可以得到以下结论:father[1] = 1;1的父结点是它自己
2022-02-12 19:35:27
202
原创 2022/2/11总结
BFS的学习BFS又称为广度优先搜索,由此可以看出,这种算法的关键在于广度。当碰到岔道口的时候,先依次访问从该岔道口能直接到达的所有结点,然后再按这些节点被访问的顺序去依次访问它们能直接到达的所有结点,以此类推,直到所有的结点都被访问为止。如果说DFS是一根直线,那么BFS就是以这根直线为直径的圆圈。访问顺序:1.访问A,发现从A能到B和C,因此接下来要访问B和C。2.访问B,发现B能到D;访问C,发现能到E和G。3.访问D,发现D能到F和H;访问E,发现是死路,不予理会;访问G,发
2022-02-11 22:17:09
423
原创 2022/2/10总结
今天学习了Java,学习的还不是特别的明白,先照着打一遍。首先,要检查你的电脑有没有Java的编译环境,同时按住Windows键和R键,调出命令窗口,输入cmd。然后确定,会出现这样的界面输入javac,如果出现一下界面,则有适合java的编译环境如果没出现的话,则要去oracle的官网下载JDK接下来是经典的hello world程序,我们首先在此电脑中选择一个盘,我选的是D盘,然后我们创建一个新的文件夹,我起的名字是code,然后我们在code文件夹中创建一个新的文本..
2022-02-10 22:41:32
374
原创 2022/1/24 总结
从树的角度来看BFS和DFS(虽然但是,我还是想最后搞一下树)将DFS的过程转化为树的形式,不难得到死胡同等价于叶子结点,岔道口为非叶子结点,且对于DFS的过程就与树的先序遍历一样。当我们看到DFS问题时,可以想到将其转化为树的结构,随后以先序遍历的方法来解决问题,这样可以让问题的解决更加得直观。BFS也相同,但是BFS对应的是树的层序遍历,当我们遇见可以用BFS解决的问题是也可以先画出树的结构图,然后以层序遍历的方法来解决问题。平衡二叉树(AVL树)平衡二叉树的本质还是二叉查找树,但是多了
2022-01-24 21:52:20
274
原创 2022/1/21总结
今天接触了动态规划,动态规划是一种用来解决一类最优化问题的算法思想,即将一个复杂的问题分解成一个个同类型的子问题,通过综合子问题的最优解来得到原问题的最优解。这个听起来有一些分治的思想在里面,但是动态规划会将每个求解过的子问题的解给记录下来,这样下次碰到同类型的子问题时,就能够直接使用之前记录的结果,避免了重复的计算,十分的灵活。动态规划的递归写法:还是以斐波那契数列为例子,如果按照原来的递归写法来写的话是这样的int feibo(int n){ if(n==0||n==1){ ret
2022-01-21 20:23:53
347
原创 2022/1/20总结
今天搞完这个就不搞树了,得学些其他的东西了。今天把哈夫曼树学习了一下,哈夫曼树的构建思想就是反复选择两个最小的元素,不断合并直到剩下一个元素。说到这里,来看上次周测的合并果子这道题。怎么样是不是和哈夫曼树的思想十分得接近,那么我们可以转换一下我们的思想:我们要建立一棵树,使得这个树的所有叶子结点的权值为n(n个元素),并且使得这棵树的带权路径长度最小。1.首先将n个元素当做只有一个结点的n棵树。2.合并根结点权值最小的两棵树,生成两棵根结点的父亲结点,且该结点的权值为两棵树的结点的.
2022-01-20 22:39:22
364
原创 2022/1/19总结
堆排序:堆的递增排序:对于堆来说,堆顶元素是最大的,堆排序的操作方法就是取出堆顶的元素,然后将堆的最后一个元素替换至堆顶,再进行一次针对堆顶元素的向下调整,如此重复下去。当堆中只有一个元素时,结束操作。void heapsort(){ create(); // 建堆 for(int i=n;i>1;i--) { swap(heap[i], heap[1]); // 交换heap[i]与堆顶 down(1,i-1); // 调整堆顶 }}...
2022-01-19 17:29:20
689
原创 2022/1/18总结
堆的基本操作:删除操作:若要删除堆中的最大元素,需要仍然保持堆的结构,那么只需要将最后一个元素覆盖堆顶元素,再进行调整就行了(其他的代码在昨天的总结)void deletet(){ heap[i] = heap[n--]; //最后一个元素覆盖堆顶元素,元素个数减1; down(1,n); //向下调整元素 }添加操作:把想要添加的元素放在数组的最后面,再进行向上调整的操作void up(){ int i = high , j = i / 2; //i 为要调整的结
2022-01-18 22:46:48
228
原创 2022/1/17总结
堆的学习:定义:堆是一个完全二叉树,每一个结点的值都不小于或者不大于其左右子树结点的值。如果父亲结点的值大于等于孩子结点的值,这样的堆被称为大顶堆,此时每个结点的值都是以它为根结点的子树的最大值;相反,如果父亲结点的值小于等于孩子结点的值,这样的堆则称为小顶堆,此时每个结点的值都是以它为根结点的子树的最小值。具体通过图片来看看进行若干次操作后,最终得到根据这个定义建堆:代码实现const int N = 100;//根据题目,具体情况具体分析来决定N的大小int he..
2022-01-17 23:05:16
439
原创 2022/1/14总结
分治思想:将一个问题划分成若干个规模较小,结构与原问题相同或相似的问题,再解决这些问题,最后合并这些问题的解即可得到原问题的解。打表:空间换时间的技巧,在程序中一次性计算出所有需要用到的结果,之后的查询直接调用这些结果,之前的进制转换也可以这样来解决。STL的学习:set:可用来保留元素本身而不考虑其个数,可用于去重,一般用于自动去重且按照升序排序。头文件#include<set>。//set的定义set< typename > name;insert
2022-01-14 22:25:03
266
原创 2022/1/13总结
栈今天主要学习了栈,因为我觉得要继续理解DFS,栈是必须要掌握的。栈是一种先进后出的数据结构,数据先进入的会较后一点出来。还要了解栈顶指针这一概念,栈顶指针始终指向栈的最上方元素,通常记为TOP,栈中没有元素时会令TOP为-1。栈的操作:1.清空清空将栈顶指针TOP置为-1,表示栈中没有元素。void clear(){ TOP = -1;}2.获取栈内元素的个数TOP始终指向栈顶元素,而数组下标从0开始,所以,栈内元素的数为TOP+1。int size(){
2022-01-13 22:10:37
180
原创 2022/1/12总结
DFS的学习DFS的理解就像人处在一个迷宫中一样,需要靠自己一步步地去走,但是,DFS更像是一种走出迷宫的方法,我们在走迷宫的时候可以一直贴着右边的墙壁走,虽然碰到死路会一条路走到底,但是仔细想想,这种方法是可行的,因为我们还能贴着墙走出来,一但发现是死路可以贴着右墙原路返回到最初的岔路口,再选择其他的岔路走下去,虽然看上去荒谬,但是实际上是十分可行的。例如:
2022-01-12 22:20:01
188
1
原创 2022/1/11总结
二叉查找树的删除二叉查找树删除操作的一大基本原则是要保证删除之后仍是一棵二叉树,如图所示,为了能保证其仍然为一棵二叉查找树,我们需要在左子树找到比根结点的数据小的最大结点来覆盖根结点,然后删除原来的这一结点(即结点5);另外一种方法是在右子树找到比根结点的数据大的最小结点来覆盖根结点,然后删除原来的这一结点(即结点7)。这两种方法都保证了删除操作后,左子树的每个数据域均小于根结点的数据域,右子树的每个数据域均大于根结点的数据域。因此它仍然是一个二叉查找树。node* findmax(node*
2022-01-11 23:30:21
310
原创 2022/1/10总结
今天主要学习了二叉查找树,这是一种特殊的二叉树,别称排序二叉树。二叉查找树要么是空树,要么左子树上的所有结点数据域均小于或等于根结点的数据域,且右子树上的所有结点数据域均大于根结点的数据域例如:二叉查找树的建立:二叉查找树的建立也是先后插入n个结点,这和平常的二叉树的建立是一样的node* searchtree(int data[],int n){ node* root = NULL; //根结点 for(int i = 0; i < n; i++) {
2022-01-10 23:09:18
229
原创 2022/1/9总结
今天主要学习了二叉树的遍历首先是先序遍历,就是围绕整个树跑一圈代码展示void shu(node* root){ if(root==NULL){ return;//空树 } printf("%d\n",root->data);//访问根结点root shu(root->lchild);//访问左子树 shu(root->rchild);//访问右子树} 中序遍历,把那...
2022-01-09 23:59:27
153
原创 2022/1/8总结
杨辉三角这个题目考查了对二维数组的应用,整体来说,只要掌握好了每个数字的位置,再结合杨辉三角各个数字的关系,一般都能写。代码展示#include<stdio.h>int a[1000][1000];int main (){ int n,i,j; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<i+1;j++) { a[i][0]=1; a[i][j]=1; i..
2022-01-08 22:54:38
598
原创 第四周总结
由于临近期末考试,对于c语言的学习也慢慢放慢了速度。这周的主要任务都在忙着查漏补缺,把以前不会的知识点都一个个的攻破。高数的零点定理,中值定理之类的定理都有仔细地去学习,但是还是有些迷茫,没能找到一个明确高效的复习方法。英语的单词和翻译我也在记,老师上课的时候也有在跟着老师走。但这一周总体来说还是有些颓废,有点摆烂的感觉,可能是因为复习有些力不从心,争取下一周能够赶紧摆正学习态度,争取每门课程在保证不挂科的情况下拿高分。而且还是得保持每天一定的代码量,不能因为工作室放低了要求而变相摸鱼。...
2021-12-27 21:52:30
285
原创 预备役第三周总结
这一周还是学习链表,基本的链表创建都没什么问题了,今天来讲一讲头插法的运用,以及数组和链表的关系。首先还是链表的创建typedef struct Node{ int data; struct Node* next;}node;node *head,*p,*r;int n;接下来的东西就和之前的不一样了,首先讲思想,之前的尾插法是在每个结点的后面增加新的结点,而头插法是直接在头结点后面接新的结点...
2021-12-19 13:58:20
355
原创 预备役第二周总结
这一周的主要学习目标是链表。链表这个名词很形象地体现出了它的运作方式,它将一个个的节点(元素)串联起来,看起来就和一条铁链一样。每个节点都有自己的位置和数据,因此,链表的节点一般由数据域和指针域组成。我比较喜欢尾插法这种连接方式(因为觉得稍微容易理解),它的大概意思就是在链表的尾端加上新的节点(元素)。下面来看实现的方式首先来个结构体typedef struct Node{ int data;//数据域 struct Node*next;//指针域}node;接着,咱还要..
2021-12-12 17:33:38
386
原创 本周总结
这周开始的时候,势头不错,头两天就a了几道题,但是到了后面的题就逐渐有些力不从心,这和我本身基础知识不够牢靠有关,也和我自身思考问题时不够专注有关。而且时间上与部分活动有了冲突,导致花在题目上的时间缩减了许多。接下来的一周,我要多花点时间去学习c语言和简单的算法,以及c++的入门,同时也要兼顾学业。...
2021-12-05 13:06:11
540
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅