算法

垃圾收集算法

假如想象 提交于 2020-02-08 16:59:07
收集算法思想: 垃圾收集算法的实现涉及大量的程序细节,仅介绍几种算法的思想以及发展过程。 标记-清除算法 最基础的后手算法,算法可分为标记、清除两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,标记算法即二次标记过程。 不足之处: ①效率问题,标记和清除两个过程的效率都不高 ②空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾回收动作 复制算法 解决标记-清除算法效率问题,讲可用内存划分为内存大小相同的两块,每次只使用其中一块。当一块内存用完时,就将还存活着的对象复制到另外一块上面,然后再把使用过的内存一次性清理。这样使得内存分配实现简单、运行高效,仅需要按顺序分配内存空间即可。 缺点:内存可用空间缩小为原来的一半。 解决方案:将该类算法应用于新生代(新生代对象98%“朝生夕死”),无需按1:1划分,可将新生代内存划分为一块较大的Eden空间和两块较小的Survivor空间,每次使用一块Eden空间与一块Survivor空间。每当回收时对正在使用的Eden和Survivor空间进行垃圾收集,存活的对象将一次性复制到空闲的另一块Survivor空间(大对象将直接进入老年代)。 担保:10%的内存区域并不是每次都足以容纳继续存活的新生代对象

扒一扒JVM的垃圾回收机制,下次面试你准备好了吗

我们两清 提交于 2020-02-08 16:14:59
  相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋。 一、 技术背景你要了解吧 二、 哪些内存需要回收? 2.1 引用计数算法 2.1.1 算法分析 2.1.2 优缺点 2.1.3 是不是很无趣,来段代码压压惊 2.2 可达性分析算法 2.3 Java中的引用你了解多少 2.4 对象死亡(被回收)前的最后一次挣扎 2.5 方法区如何判断是否需要回收 三、常用的垃圾收集算法 3.1 标记-清除算法 3.2 复制算法 3.3 标记-整理算法 3.4 分代收集算法 3.4.1 年轻代(Young Generation)的回收算法 3.4.2 年老代(Old Generation)的回收算法 3.4.3 持久代(Permanent Generation)的回收算法 四、常见的垃圾收集器 五、GC是什么时候触发的(面试最常见的问题之一) 5.1 Scavenge GC 5.2 Full GC 结束语 一、 技术背景你要了解吧   按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,早在1960年Lisp这门语言中就使用了内存动态分配和垃圾回收技术

C++ 实现 STL 标准库和算法(二)模板编程

亡梦爱人 提交于 2020-02-08 14:10:37
为什么需要模板? 面向对象的继承和多态机制,有效提高了程序的可重用性和可扩充性。而在程序的可重用性方面,要想得到更多的支持,就需要模板。 例如,当需要交换两个变量的值时: void Swap ( int & x , int & y ) { int tmp = x ; x = y ; y = tmp ; } 以上的程序仅仅解决了int型变量的值,而当需要交换两个double变量的值时,还需要另外再编写一个函数。而这些Swap函数除了处理数据类型不同外,形式上都是一样的,能否只写一遍Swap函数,就能用来交换各种类型的变量值呢? 而 有了模板,编译器就能在需要的时候,根据模板自动生成程序的代码。 什么是函数模板? 有了模板,可以只写一个Swap模板,编译器会根据Swap模板自动生成多个Swap函数,用以交换不同类型的值。 函数模板的基本语法 如下: template < typename / class 类型参数 > template 告诉编译器,接下来是一个模板 ,typename 和 class 都是关键字,在这里二者可以互用没有区别。在< >中 T 叫做模板形参,一旦模板被实例化,T 也会变成具体的类型。 template < typename T > T add ( const T lva , const T rva ) { T a ; a = lva + rva ;

数据结构和算法思维导图

拈花ヽ惹草 提交于 2020-02-08 13:35:07
需要重点以下10种数据结构和10种算法: 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 来源: https://www.cnblogs.com/gaopengpy/p/12276035.html

注册与登录的加密算法

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-08 10:22:43
算法目的 提供固定的 秘钥 和 明文 能够产生不同的密文摘要 hamc 算法 大概流程是 使用一个秘钥 对明文进行两次散列操作得到密文摘要 哈希(散列)函数 MD5 SHA1 SHA256 注册 向服务器请求一个随机的秘钥 把注册的密码进行 md5.hmac(hamc使用md5的散列函数来操作字符)加密 : md5.hmac(key,message) ==> 密文摘要(key : 秘钥 , message : 明文) : md5.hmac密文摘要 把摘要提交到服务器,同时服务器把 该 秘钥 和 md5.hmac密文摘要 持久化到数据库 登录 客户端向服务器请求秘钥(注册时候存储的秘钥) 在用户提交数据的时候对密码进行加密 : md5.hmac(key , pwd) ==> 子摘要 md5.hamc(key , (子摘要 + '当前提交时间')) ==> 总摘要 当服务器接收到总摘要消息的时候处理流程 : 取出 秘钥 key , 存储的密文摘要 pwdDigest 根据以下公式计算两段密文摘要 : md5.hamc(key , '当前提交时间' + pwdDigest) ==>目的摘要1 md5.hamc(key , '当前提交时间 + 1(分钟)' + pwdDigest) ==>目的摘要2 如果用户提交的 总摘要 == 目的摘要1 || 总摘要 == 目的摘要2 为密码正确

Android——登陆逻辑实现

拟墨画扇 提交于 2020-02-08 09:46:39
QQ 1285575001 Wechat M010527 技术交流 QQ群599020441 纪年科技aming MD5算法 Message-Digest Algorithm 5(信息–摘要算法) Message Digest MessageDigest MessageDigest.getInstance( ); 由于注册登录涉及密码,我们需要对用户的密码进行 MD5 算法加密, MD5 算法是把任意长度的字符串变成固定长度(通常是128位)的16进制字符串, 且此算法不可逆。 具体代码如下: 当点击登录按钮时,需判断用户名和密码是否为空。 若为空,则提示请输入用户名或密码, 若不为空,则获取用户输入的用户名, 由于用的是本地数据,需要根据用户名在 SharedPreferences 中查询是否有对应的密码, 若有对应的密码且与用户输入的密码(需通过 MD5 加密)比对一致情况,则登录成功 来源: CSDN 作者: amingMM 链接: https://blog.csdn.net/qq_33608000/article/details/104218798

怎么样压缩数据?

Deadly 提交于 2020-02-08 08:03:14
文章目录 基本定义 RLE 算法 莫尔斯编码 莫尔斯 VS 哈夫曼 可逆压缩 与 非可逆压缩 Windows95/98处于16色或256色状态 可逆以及不可逆算法适用的情况分析 基本定义 文件 : 是将数据存储在磁盘等存储媒介中的一种形式。程序文件中存储数据的单位是字节。文件的大小之所以用××KB、××MB 等来表示,就是因为文件是以字节(B = Byte)为单位来存储的 压缩比 :压缩后文件大小 / 压缩前文件大小 常用压缩软件 : 1、LZH 是用 LHA 等工具压缩过的文件的扩展名。该压缩格式有时也称为 LZH 格式 2、ZIP 是用 PKZIP 等工具压缩过的文件的扩展名。该压缩格式有时也称为 ZIP 格式 3、日本人比较常用的压缩软件LHA,使用的就是哈夫曼算法,是吉崎荣泰开发的一款免费压缩软件 RLE 算法 例子 : 开始 :尝试一下对存储着AAAAAABBCDDEEEEEF这17个半角字符的文件(文本文件)进行压缩 结果 :A6B2C1D2E5F1是12个字符也就是12字节,因此结果就将原文件压缩了12字节÷17字节≒70%。 把文件内容用“数据 ×重复次数”的形式来表示的压缩方法称为 RLE(Run Length Encoding,行程长度编码)算法 应用 : RLE算法经常被用于传真FAX等。G3类传真机是把文字和图形都作为黑白图像来发送的。由于黑白图像的数据中

全排列的递归算法

老子叫甜甜 提交于 2020-02-08 07:55:26
递归思想来进行全排列是最接近人的思维的,例如对a, b , c,进行全排列第一轮是a**,b**,c**,第二轮是ab*,b a*, c b*,就是轮番把一个数固定在首位,然后剩下几位进行枚举; 代码: #include using namespace std; int total = 0; //交换函数 void swapArray(int &a,int &b) { int temp; temp = a; a = b; b = temp; } //递归函数 void fullPermutation(int * fullArray,int start,int endn,int number){ //这里,既可以是">=",也可以是">",,应该也可以是"==" if(start>=endn){ for(int i=0;i cout<<fullArray[i]; } cout<<endl; total++; } else{ for(int i=start;i<=endn;i++){ swapArray(fullArray[start],fullArray[i]);//交换 fullPermutation(fullArray,start+1,endn,number); swapArray(fullArray[start],fullArray[i]);//注意恢复原样 } } } int

全排列的递归算法

不羁的心 提交于 2020-02-08 07:53:41
递归思想来进行全排列是最接近人的思维的,例如对a, b , c,进行全排列第一轮是a**,b**,c**,第二轮是ab*,b a*, c b*,就是轮番把一个数固定在首位,然后剩下几位进行枚举; 代码: #include using namespace std; int total = 0; //交换函数 void swapArray(int &a,int &b) { int temp; temp = a; a = b; b = temp; } //递归函数 void fullPermutation(int * fullArray,int start,int endn,int number){ //这里,既可以是">=",也可以是">",,应该也可以是"==" if(start>=endn){ for(int i=0;i cout<<fullArray[i]; } cout<<endl; total++; } else{ for(int i=start;i<=endn;i++){ swapArray(fullArray[start],fullArray[i]);//交换 fullPermutation(fullArray,start+1,endn,number); swapArray(fullArray[start],fullArray[i]);//注意恢复原样 } } } int

A*算法初探

独自空忆成欢 提交于 2020-02-08 05:26:44
注:本文为半转载文章,原文链接为 A_L_A_N的博文 总之比原文充实… /* Name: A* Copyright: CQHFBZ Author: YJ Date: 2020/01/26 18:45 Description: 咕咕咕,一个让人咕的寻路算法... */ 1 M e e t A ∗ 1\space Meet\space A* 1 M e e t A ∗ A ∗ A* A ∗ 是一个 让人咕咕咕的 优秀的寻路 o r or o r 搜索算法 T A TA T A 的中心思路是贪心, B F S BFS B F S ,和预估函数 T A TA T A 的时间复杂度是 θ ( \theta( θ ( 出的题能过 ) ) ) 并不是我懒 2 D o A ∗ 2\space Do\space A* 2 D o A ∗ 此处有一地图: 绿色代表起点( A A A ),红色代表终点( B B B ),蓝色代表障碍(即不可行的状态),小方格代表一种状态(起点,终点皆为一种状态) 那我们开始搜索c 定义两个列表 O p e n L i s t , C l o s e L i s t OpenList, CloseList O p e n L i s t , C l o s e L i s t 代表待搜索列表和已搜索列表( H a s h Hash H a s h 映射也行) 1.