- 博客(32)
- 资源 (12)
- 收藏
- 关注
原创 全排列算法
输入字符,对字符进行全排列。这里用了两种方法,递归调用(一些书上写的是DFS)和c++系统自带的方式。#include <iostream>#include<string>#include<algorithm>using namespace std;char output[10];bool s[10];void permutation(string str, int index){ if (index == str.size()) { for
2021-03-16 21:16:44
1597
原创 矩阵运算
#include <iostream>using namespace std;struct Matric { int row, low; int matric[100][100]; Matric(int x, int y) :row(x), low(y) {}};//矩阵相加void add(Matric x, Matric y){ Matric a = Matric(x.row, y.row); for(int i=0;i<100;i.
2021-03-12 23:28:41
175
原创 分解质因子
1,用质数筛选法确定一定范围内所有质数2.用质数对该数进行质数分解#include<vector>#include <iostream>#include<cmath>using namespace std;vector<int > p;bool ifPrime[10000];//质数筛选法void isPrime(){ for (int i = 0; i < 10000; i++) { ifP
2021-03-12 00:41:09
146
原创 X进制转化为10进制
#include <iostream>#include<string>using namespace std;//X进制数会有字母表示,例如16进制string str;int charToInt( char x){ if (x >= '0' && x <= '9') { return x-'0'; } else { return x - 'A' + 10; }.
2021-03-11 22:45:23
1679
1
原创 统计字符
统计一个给定字符串中指定的字符出现的次数。对每个测试用例,统计第1行中字符串的每个字符在第2行字符串中出现的次数,按如下格式输出: c0 n0 c1 n1 c2 n2 ... 其中ci是第1行中第i个字符,ni是ci出现的次数。样例:输入:ITHIS IS A TESTi ngthis is a long test string#输出:I 2i 3 5n 2g 2#include <iostream>...
2021-03-10 23:05:14
446
原创 简单数字问题之数字黑洞问题
#include<algorithm>#include <iostream>using namespace std;void divide(int a, int b[] ){ for (int i = 0; i < 4; i++) { b[i] = a % 10; a /= 10; }}bool cmp1(int a, int b) { return a > b;}bool cmp2(int a, int b){ return
2021-03-04 00:58:57
348
1
原创 算法数学问题之判断是否是素数(质数)
#include <iostream>using namespace std;bool isPrime(int n){ if (n < 2) return false; int bound = (int)sqrt(1.0*n); for (int i = 2; i <= bound; i++) { if (n % i == 0) { cout << "no"; return false; } } cout << ..
2021-03-04 00:56:42
202
1
原创 散列表的算法应用。PAT题目之PATest
输入一串字母例如:redlesPayBestPATTOPTeePHPereatitAPPT。筛选这串字母中的字母使其拼凑出尽量多的PATest序列,并且欠缺字母时可忽略。例如这里:其实该算法就是利用散列表用于计数每个字母的次数。#include<string>#include <iostream>using namespace std;int main(){ string s; cin>>s; string dic = "P
2021-03-04 00:52:44
111
1
原创 区间贪心策略,杭电2073题之NOAC
问题:给出多个电视节目的时间段,问如何安排时间可以看到完整的最多的节目。算法思路1:对所有节目开始时间由晚到早排序后,从头开始选取节目并且下一个节目的结束时间<上一个节目的开始时间。每次选取最晚开始时间的节目相当于这个节目之前的时间更多。算法思路2:其实和1的想法一样。这次我们每次选取节目结束时间最早的节目,这样相当于看完这个节目后剩余的时间更多。代码采用算法思路1#include<algorithm>#include <iostream>using namespac
2021-03-04 00:41:18
106
1
原创 算法数学问题之寻找一个范围内的素数(质数),埃氏筛法
#include <iostream>using namespace std;void findprimes(int n, int prime[]){ int p[10000] = { 0 }; int num = 0; for (int i = 2; i < 100000; i++) { if (p[i] == 0) { prime[num++] = i; if (.
2021-03-04 00:31:44
193
1
原创 算法数学问题之大整数加减法运算
将大整数string化为bigint的数组存储,再进行运算。代码很简单易懂如下。注意:carry进制的做法有点抽象#include <iostream>#include<string>using namespace std;struct bigInt{ int len; int d[1000];} ;bigInt change( string s){ bigInt a; int num = 0; for (int i = 0; i < 1000;
2021-03-04 00:25:41
433
1
原创 说反话
输入一句话例如“welcome to the new world".算法使其输出“ world new the to welcome”.算法考察主要对string类的函数操作。#include <iostream>#include<string>using namespace std;int main(){ string s; getline(cin, s); while (true) { int i = s.rfind('
2021-03-02 00:14:27
161
原创 D进制转换问题
输入两个十进制数字a,b和进制数D。求a+b的D进制数字。#include <iostream>using namespace std;int main(){ int a,b,n; cin >> a>>b>>n; int sum = a + b; int ans[31]; int num = 0; while (sum != 0) { ans[num] = sum % n;
2021-03-02 00:04:52
218
原创 图解GC(垃圾回收)三种增量式垃圾回收
通常的GC算法很繁重,一旦GC开始执行,我们原本该进行的程序就被迫停止。也就是说,繁重的GC原本是辅助程序变成了主程序,而本该执行的主程序变成了辅程序。这就是臭名昭著的停止型GC,英文名称很酷叫:Stop the world GC。针对繁重的GC算法,人们提出增量式垃圾回收算法。增量:incremental,意味着慢慢变化,也就是说增量式垃圾回收算法是慢慢回收,一点一点与主程序交替执行而不是直接霸占主程序的运行时间。三色标记算法三色标记算法由图灵奖得主Dijkstra等人提出。三种颜色所包含的...
2021-02-12 23:21:06
1334
原创 图解GC(垃圾回收)分代垃圾回收算法
我们对系统内的垃圾有个经验就是“新生的对象马上变成垃圾,而存活下来的对象将保留很长时间。”,根据这个经验,我们把堆空间分为新生代对象和老年带对象,这样每次垃圾回收时,除了引用计数法以外的算法例如标记-清除,都只对特定某代对象进行扫描,而不是对整个堆所有对象进行扫描清除。我们来看一下具体的做法:一开始堆空间按下图方式划分为“:老年代空间和新生代空间。而新生代空间 = 生成空间+幸存空间。幸存空间分为两部分,我们将会把两部分把它作为FROM和TO空间。每次生成新的对象我们都分配到生成空间。第一次启动
2021-02-06 16:37:45
780
原创 图解GC(垃圾回收算法)保守式GC加强版(2)MostlyCopyingGC
MostlyCopyingGC算法由科学家Batlett研究提出,MostlyCopyingGC是对保守式GC算法修改,使保守式GC能兼容复制算法,换句话说也就是继承了复制算法的优点。MostlyCopyingGC:就是抛开不能移动的对象,对大多数对象经行复制算法。不过,MostlyCopyingGC还有如下前提条件:1,根是不明确的根。2,没有不明确的数据结构3,对象大小是任意的。其中条件1,2这个两个条件的意思我们在保守式GC这篇文章中已有提到,在这里就不再赘述。我们来具体谈谈Mos
2021-02-05 16:54:09
316
原创 图解GC(垃圾回收)保守式GC加强版(1)间接引用
间接引用保守式GC有个缺点,就是不能使用类似复制算法等移动的算法,解决这个问题的方法之一就是“间接引用法”。间接引用:简单的说就是在根和堆之间插入一个我们称为句柄的管理者,用来管理从根像堆的引用。采用间接引用, 即使是想要移动不明确的根所引用(所指向)的对象,只需要修改句柄所指向的对象就好了,不用直接修改根,这样即使根是非指针也不用因为直接修改了非指针根而导致程序错误。我们以下图为例子:根在指向堆中引入了句柄作为管理者,所以称为间接引用。当原本修改根引用的对象的地址时需要直接修改根的指针
2021-02-04 18:13:04
518
原创 GC(垃圾回收)准确式垃圾回收算法
准确式GC准确式GC和保守式GC的不同点在于,准确式GC能准确识别指针和非指针来经行垃圾回收。创建正确的根有多种方式,但是这些都需要语言处理程序的支援。方法一:打标签打标签的目的在于明确的对根里所有的指针和非指针明确的区分开来。我们以最基本的第一位作为标签的方法。在32bCPU下,指针的值是4的倍数,低2位一定是0,我们利用这特性具体打标签的方法如下:1,将非指针(如int)左移一位2,将低1位至为1注意:在对数值也就是非指针左移时注意不要让数值溢出,若发生溢出则换位更大的数据类型,
2021-02-04 00:05:09
989
原创 GC(垃圾回收)保守式GC
垃圾回收算法可以分为两类,保守式GC和准确式GC。保守式GC指的是:不能识别指针和非指针的GC,而保守就保守在:将非指针指向的对象视为活动对象并且不废弃处理。准确式是指:能够识别保守式GC和准确式GC。我们先来了解一个概念:不明确的根。实际上寄存器,调用栈,全局空间变量。这些都是不明确的根。因为寄存器,调用栈,全局空间变量这三者都能包含指针和非指针,所以GC扫描到他们的时候就不知道里面存的到底是指针还是非指针。比如说调用栈,调用栈里面就有调用帧,调用帧包含局部变量和参数,局部变量就有例如int,doub
2021-02-03 18:56:10
733
1
原创 图解GC(垃圾回收)标记-压缩加强版 Two-Finger算法
Two-Finger算法Two-Finger算法由Saunders提出,比起典型的标记-压缩算法,只需要2次搜索堆,并且Two-Finger算法没有必要为forwarding指针准备空间,只需要在原对象的域中设定forwarding指针即可。但是Two-Finger算法的前提是:必须所有对象大小相等。两次搜索堆分为:移动对象和更新指针两次操作。首先,移动对象由堆的free和live指针从两边相中间搜索,free指向空闲空间,live指向活动对象,当两指针交叉时则步骤移动对象结束。这里两个指针就像
2021-02-03 15:34:50
318
原创 图解GC(垃圾回收)标记-压缩算法
标记-压缩算法顾名思义,就是标记活动对象,再对活动对象进行压缩到堆的一边,两部分组成。标记-压缩算法效果和复制算法差不多,但是有点在于他不用牺牲半个堆的空间。首先,我们介绍最初由Kunth研究出来的标记-压缩算法Lisp2Lisp2lisp2算法中每个对象头中都开辟新空间用来存放forwarding指针。forwarding指针用来指示活动对象将要被压缩过去的空间地址。算法首先是标记阶段,标记和之前标记-清除算法的标记一样,这里不再赘述,标记完成后堆的状态如图:算法第一步:设定for
2021-02-02 18:47:24
601
2
原创 图解GC(垃圾回收)复制算法加强版(3) 多空间复制算法
多空间复制算法典型的GC复制算法将堆空间劈成两半,利用一半存放对象另一半只能空着。多空间复制算法将空间继续细分,例如:分为10等份。这10等份里拿出两份做为FROM空间和TO空间,剩余8份利用标记-清除算法进行垃圾处理。这样,多空间复制算法浪费的空间只为堆空间的1/10。我们直接上图来理解执行过程:...
2021-02-02 16:55:12
182
原创 图解GC(垃圾回收)复制算法加强版(2)近似深度优先算法
近似深度优先算法上篇文章我们提到cheney虽然比传统的复制算法改进很多,但是失去缓存优势这在计算机里特别是现代中更是弊大于利。根据这一缺陷,1991年,Wilosn,Lam,Moher提出了近似深度优先遍历的算法。所谓近似深度优先遍历其实就是深度优先与广度优先相结合(有没有再次感受到计算机基础的重要性,上篇文章cheney把深度改广度直接名垂千史,这次有人深度+广度再次名垂千史),具体如何结合我们先进一步分析一下Cheney算法为何不利于缓存。...
2021-02-01 18:28:20
290
原创 图解GC(垃圾回收)复制算法加强版(1)Cheney的复制算法
Cheney的复制算法cheney复制算法由cheney1970年研究提出,与典型的复制算法递归进行不同cheney是迭代的复制进行。典型的复制算法以类似深度优先遍历进行而cheney由广度优先遍历进行。(有木有再次感受到计算机基础的重要性,深度改广度换上自己的名字就可以名垂千古)。Cheney的复制算法需要Scan和Free两个指针指向TO空间。SCAN用于搜索已复制完成的对象从而实现广度优先遍历,Free指针用于指向下一个空闲区域。开始由复制被根指向的对象复制到TO区域,然后在TO区域中由SC.
2021-02-01 16:28:31
743
1
原创 图解GC(垃圾回收算法)复制算法
GC(垃圾回收算法)复制算法典型的GC复制算法由科学家Robert R.Fenichel与Jerome C. Yochelson研究出来。算法思想比较简单,我们将空间划分为FROM空间和TO空间,而每次分配给对像都在FROM空间,如下图所示:而当FROM空间被完全占满时,GC会将活动对象复制到TO空间,一般来说FROM空间和TO空间的大小是一样的。然后再清除FROM空间所有的对象,这里就包括了FROM空间中活动的对象和不活动的对象,完毕后将TO空间和FROM空间对换。到这里算法也就完成了。
2021-01-29 16:33:49
1169
原创 图解GC(垃圾回收算法)加强版计数引用法(4)部分标记-清除法
部分标记-清除法 之前加说,结合标记-清除算法可以解决引用计数法不能解决循环垃圾的问题,但是标记清除-算法从标记再到清除两次遍历虽然解决了问题但是同时也毁灭了引用标记法的优点。这里我们介绍部分标记-清除算法来解决循环的问题。典型的标记-清除算法用来查找活动对象,而使用部分标记-清除算法用来查找不活动的对象。 这个算法的伟大之处在于判断图的循环问题。(图的循环老生常谈,我们知道有标记,快慢指针算法等等等等算法。)这里我们具体问题具体分析,采用一种另外一种更合适的伟大算法。算法为每个对象设...
2021-01-28 18:13:03
215
1
原创 图解GC(垃圾回收算法)加强版计数引用法(3)1位引用计数法
1位引用计数法 1位引用计数法(one bit reference counting)由三位计算机科学家W.R.Stoye,T.J.W.Clarke,A.C.Norman提出。根据这三位科学家观察,“几乎没有什么对象是公用的,所有对象都能马上回收”。 因此,三位科学家提出只用1b来计数。1b固然只有0,1两种表示法。当计数器为0时表示只有1个引用,当计数器为1时表示被多个引用。有意思的是,三位科学才采用不一样的计数思维来解决难题。传统的技术法中计数器在对象自己本身中技术,而在1位引用计数法中,...
2021-01-28 17:25:14
218
3
原创 图解GC(垃圾回收算法)加强版计数引用法(2)Sticky引用计数法
Sticky引用计数法 在典型的引用计数法中我们为每个对象头是设置一个位宽。通常例如:32b的计算机位宽设为32b,64b的计算机位宽设为64b,而位数越多则越占用内存空间这是一个弊端,另外我们从计算机组成原理知道,32b计数范围为:0~-1.。那么我们看可以想到,若是被引用的大小超过-1.则存在爆表的现象。第一, 针对这种现象我们可以放在视为长期活动的对象不管。实验表明,更多的对象一创建就死了,而爆表的对象在程序中肯定是非常重要的范围。(我们知道溢出后数值改变的原理)第二,我们可以结...
2021-01-27 22:57:31
273
原创 图解GC(垃圾回收算法)加强版计数引用法(1)延迟引用计数法
延迟引用计数法 典型的引用计数法计数器增减处理繁重的原因之一就是从根的引用变化。因此我们让从根指向的指针变化不反应到计数器上。因此,根对对象将不在影响,那么如何判断一个对象是否是垃圾?我们将创造一个ZCT(Zero Count Table),它会指向每个计数器为0的对象。如果在分配的时候内存没有足够的空间,则扫描ZCT表,若表中的对象被根所指向则计数器+1,否则计数器依旧为0视为垃圾处理,释放空间后活动对象计数器回复为0。如图:此刻对象B,C将是被当作垃圾处理的对象。具体扫描sca...
2021-01-27 22:27:38
328
原创 图解GC(垃圾回收)引用计数法
引用计数法(Reference Counting)由1960年GeorgeE.Collins提出。引用计数法为每个对象引入技术器,当对象被引用(被其他对象指向)时技术器+1,当技术器为0时表示对象不可达则被视为垃圾处理。优点:与不同标记-清除算法,标记-清除算法由系统没有剩余空间分配时明确促发启动,而引用计数法当计数为0时即可回收垃圾从而减少最大暂停时间并且减少沿着指针搜索查找的时间。缺点:1,计数器增减运算繁重,代码实现复杂,实现复制就意味着容易产生BUG。2,典型的引用计数器需要占更多bit。3,循
2021-01-27 18:40:12
622
原创 图解GC加强版标记清除算法之多个空闲链表法,位图标记法,延迟清除法
上篇文章我们学习到典型的垃圾回收标记-清除算法,该算法实现简单,与保守式GC算法兼容。但是存在易碎片化,分配速度慢和与写时复制技术(像mysql中保持一致性读原理类似)不兼容的问题。这篇文章我们来学习改进型标记-清除算法。多个空闲链表: 典型的标记-清除算法只用到一个空闲链表,在这个链表中大大小小的空间都由一个链表串在一起,系统进行空间分配时最差的时间复杂度是O(N)。这里我们可以利用最常见的空间换时间的做法加以改进。我们对每个堆空间按照其大小进行分类,例如占1字节内存空间为一类...
2021-01-26 23:41:22
319
原创 图解GC(垃圾回收)标记-清除算法
GC标记-清除算法(Mark Sweep GC) GC标记-清除算法自问世以来,一直到半个世纪后的今天,依然是处理各类程序的所用的经典算法。典型的标记-清除算法很简单,现在更常用的是与其他的算法巧妙结合达成意想不到的效果。 GC标记-清除算法顾名思义,就是标记和清除。标记活动的对象,清除没有标记或者是说没有在活动的对象。标记: 在标记阶段中,垃圾收集器会给所有活动打上标记即mark=true。标记函数根据传入的参数为根,由根(链表头)再逐步搜索(一般采用深度优先搜...
2021-01-26 22:05:39
566
在线问卷vue.zip
2021-06-27
大学生毕业设计/实验作业。民宿网站(ssm).zip
2021-06-27
毕业设计旅游网站(spring boot-jpa-thmleaf).zip
2021-06-27
就业信息管理(spring boot+layui).zip
2021-06-27
大学生毕业设计仿微博(ssm).zip
2021-06-27
大学生毕业设计段子发布平台(ssm-vue).zip
2021-06-27
大学生毕业设计/实验作业之疫情数据查看
2021-06-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人