算法

GC算法-引用计数法

喜你入骨 提交于 2020-04-05 18:54:37
概述 引用计数法又是什么鬼呢? 顾名思义, 对对象的引用进行计数. 通过记录每个对象被引用的次数, 来确定这个对象是否可以被回收. 实现 首先, 对对象的引用数量进行管理, 什么时候会更新呢? 创建对象: 新建一个对象(对这个新的对象引用数量+1) 更新指针: 将一个指向A对象的指针重新指向B对象(将A对象引用数量-1, B对象引用数量+1) 这次就不上代码了, 简单介绍一下思路就行. (我哥说代码看着费劲) 前提 : 我们有一个全局的空闲地址链表: FREE_HEAD 创建对象的操作 从FREE_HEAD中寻找内存 若找到了, 该对象计数器置为1, 返回 若没有找到, 内存扩容, 返回1 更新指针的操作 将新的对象引用计数+1 将旧的对象引用计数-1. 若-1后引用数量为0, 则将该对象及所有的子对象添加到 FREE_HEAD 链表中. 实现说起来简简单单, 毕竟我也不用真的去实现, 简单想一下. 分析 在上一次的 标记清除算法 中, GC在每次内存不足时运行, 势必会导致程序暂停时间比较长. 但 引用计数 则在每次指针变更的同时进行管理, 在产生新的垃圾的时候立刻进行回收. 这就体现出它的几个优势了: 最大暂停时间短. 产生垃圾可立即回收 当然, 只说优势不说劣势都是扯犊子. 首先, 引用计数 的优势也会成为它的劣势, 计数频繁的计算, 会拖累程序的速度.

详解时间、空间复杂度(内含彩蛋~~)

一世执手 提交于 2020-04-04 18:42:45
目录 一、时间复杂度:执行算法所需要的计算工作量 (一)时间复杂度的理解 1.时间频度定义 2.(渐进)时间复杂度定义 (二)时间复杂度的计算 计算攻略: 常见的算法时间复杂度由小到大排序: 大O表示法推导实例: 1.常数阶 ⇒ O(1) 2.线性阶 ⇒ O(n) 3.平方阶 ⇒ O(n2) 二、 空间复杂度:执行这个算法所需要的内存空间 三、彩蛋 学习算法我们首先需要清楚的概念就是 时间复杂度 和 空间复杂度 接下来我们就详细讲解一下时间复杂度和空间复杂度,为大家后面的学习打好基础! 算法入门书籍挑选点这里~ 帮你快速找到适合自己的算法书籍(详细,内含彩蛋哦~) 一、时间复杂度:执行算法所需要的计算工作量 (一)时间复杂度的理解 1.时间频度定义 我们需先明白: 一个 算法花费的时间 是与 算法中语句的执行次数 成 正比 的 (也就是说一个算法中语句执行次数越多,花费的时间也就越多) 时间频度:T(n): 一个算法中的语句执行次数,记为T(n) 2.(渐进)时间复杂度定义 T(n): 算法中基本操作重复执行的次数是问题规模n的某个函数。 f(n): 某个辅助函数 算法的(渐进)时间复杂度O(f(n)): 若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。 记作T(n)=O(f(n)),称O(f(n

工作6年,私藏的25个,调优工具/技术网站,我贡献出来了

假如想象 提交于 2020-04-04 18:31:40
工作6年,私藏的25个,调优工具/技术网站,我贡献出来了 对于程序员来说,不停的学习新技术,是我们一直要做的事情,平时不积累,等到金三银四,金九银十的跳槽季节,身边的朋友,一个个的拿着高薪跳槽,自己只能眼巴巴的看着,后悔平时没有积累学习。 其实很多程序员最头疼的事情,就是找学习资料或面试题,我这里,就给大家推荐一些,我赞了6年的优质技术网站,都是我精心挑选的,涵盖:4个算法网站,7个调优排错工具网站,4个问答社区,4个教程网站,4个代码协作平台,都是大家学习IT路上的好帮手,对技术提升有很大帮助,而且都是里免费的! 算法网站 LeetCode https://leetcode.com https://leetcode-cn.com LeetCode: 被称为刷题神器,里面有很编程算法面试的海量题目,可以在线编译运行,难度比较高。如果自己能都做出来,对面试大公司很有帮助。建议一次只针对一种题型进行训练,如数组、链表、二叉树、回溯、动态规划,这样效果会更好。 LintCode https://www.lintcode.com LintCode: 汇集了各大公司的算法面试题,有阶梯式训练题库,帮你选好应该刷的题目,特别适合小白和懒人。评测数独特快,支持中文在线题库,不需要你处理输入和输出,方便了很多,测试速度也很快。 VisuAlgo https://visualgo.net/zh

数据结构绪论

时光总嘲笑我的痴心妄想 提交于 2020-04-04 08:59:15
/*--> */ /*--> */ 数据结构:问题的数学模型,是指互相之间存在着一种或多种特定关系的数据元素的集合 算法:求解问题的策略,操作步骤 /*--> */ /*--> */ 物理(存储)结构:数据结构在计算机中的表示 设计数据结构的存储结构时要存放所有数据元素的值和他们之间的逻辑关系 2种存储结构: 顺序存储映像—顺序存储结构借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系 非顺序存储映像—链式存储结构借助指示数据元素存储地址的指针来表示数据元素之间的逻辑关系 /*--> */ /*--> */ 抽象数据类型(Abstract Data Type 简称ADT) :是指一个数学模型以及定义在此数学模型上的一组操作。 (D, R, P)三元组表示 : D是数据对象 R是D上的关系的集合 P是D上的操作的集合 定义格式: /*--> */ /*--> */ ADT抽象数据类型名 { 数据对象:〈数据对象的定义〉 数据关系:〈数据关系的定义〉 基本操作:〈基本操作的定义〉 } ADT抽象数据类型名 eg: ADT Complex { 数据对象:D={e1,e2|e1,e2∈RealSet} 数据关系:R1={ (e1,e2)| e1是实数部分 , e2 是复数的虚数部分 } 基本操作: AssignComplex( &Z, v1, v2 ) 操作结果:构造复数 Z

gen语言

半世苍凉 提交于 2020-04-03 17:02:35
概率编程语言(PPL)领域正经历着机器学习技术快速发展带来的奇迹般的复兴。在短短的几年里,PPL 已经从一个模糊的统计研究领域发展出十几个活跃的开源方案。最近,麻省理工学院(MIT)的研究人员推出了一种新的概率编程语言 Gen。这种新语言让研究人员在不需要处理方程式和手动编写高性能代码的情况下,编写应用人工智能技术的多个领域的模型和算法。 PPL 是机器学习 pipeline 的常规组件,但其实现仍然具有挑战性。虽然市场上的 PPL 显著增加,但大多数 PPL 仍局限于研究工作,不适用于实际的应用。在 2015 年谷歌开源 TensorFlow 之前,深度学习领域也经历了类似的挑战。使用 TensorFlow,开发人员能够使用一致的框架构建复杂但高效的深度学习模型。从某种意义来说,Gen 正在寻找概率规划的方法,正如 TensorFlow 为深度学习所做的那样。然而,为了做到这一点,Gen 需要在 PPL 的两个关键特征上进行精细平衡。 表达性与效率 现代 PPL 最大的挑战是在建模表达性和推理效率之间取得平衡。虽然许多 PPL 在语法上都很丰富,可以用来表示几乎任何模型,但它们往往支持有限的推理算法,这些算法的收敛速度非常慢。其他 PPL 有丰富的推理算法,但仍然局限于特定的领域,使其不适用于一般的应用。 通用 PPL 应能实现两个基本效率向量: 1)推理算法效率:一个通用的

数据结构与算法之美学习笔记:第二十二讲

本秂侑毒 提交于 2020-04-03 16:04:51
上一节,我讲了哈希算法的四个应⽤,它们分别是:安全加密、数据校验、唯⼀标识、散列函数。今天,我们再来看剩余三种应用: 负载均衡、 数据分片、 分布式存储 你可能已经发现,这三个应用都跟分布式系统有关。没错,今天我就带你看下, 哈希算法是如何解决这些分布式问题的。 应用五:负载均衡 1、如何实现一个会话粘滞的负载均衡算法 2、维护映射关系表的弊端 3、借助哈希算法完美解决 应用六:数据分片 1、引子案列 2、难点处理方案 3、问题所在痛点 4、如何快读判断图片是否在图库中 1、对数据进行分片、然后采用多机处理 2、具体方法 3、需要多少台机器 1、散列表中的每个数据单元包含两个信息 2、使用MD5 3、一台机器可以存多少图片 4、如果对一亿张图片构建索引,需要大约十几台机器 5、实际上 应用七:唯一标识 1、分布式存储 2、扩容带来的问题及痛点 1、方法 2、扩容存在的问题 3、雪崩效应、压垮数据库 3、将那个数据放到那个机器上呢 1、所以我们需要一种方法 2、解决方案 3、一致性哈希算法 解答开篇 & 内容小结 1、解答开篇 2、内容小结 来源: https://www.cnblogs.com/luoahong/p/11330458.html

一步一步写算法(之线性结构的处理)

我只是一个虾纸丫 提交于 2020-04-03 14:33:46
原文: 一步一步写算法(之线性结构的处理) 【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 我们知道,在内存中的空间都是连续的。也就是说,0x00000001下面的地址必然是0x00000002。所以,空间上是不会出现地址的突变的。那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以是堆。数组有很多优势,它可以在一段连续空间内保存相同类型的数据,并且对这些数据进行管理。所以从这个意义上说,掌握了数组才能说明你数据结构入门了。 那么,在实际开发中,我们对线性结构应该注意些什么呢?我个人的观点: (1)数组的资源是有限的,必须确定资源的范围 (2)数组中资源的申请和释放必须一一对应,否则很容易造成资源泄漏的现象 (3)数组中的注意事项同样应用于堆分配的连续内存资源空间中 下面是自己设计的一个int分配的小程序,大家可以一起尝试一下: a)设计内存节点的数据形式 typedef struct _DATA_NODE { int* pData; char* pFlag; int num; }DATA_NODE; #define STATUS int #define TRUE 1 #define FALSE 0 b)创建内存节点 DATA_NODE* malloc_node(int number) { DATA_NODE*

一步一步写算法(之线性队列)

人走茶凉 提交于 2020-04-03 14:23:30
原文: 一步一步写算法(之线性队列) 【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 这里的线性结构实际上指的就是连续内存的意思,只不过使用“线性”这个词显得比较专业而已。前面一篇博客介绍了现象结构的处理方法,那么在这个基础之上我们是不是添加一些属性形成一种新的数据结构类型呢?答案是肯定的,队列便是其中的一种。 队列的性质很简单: (1)队列有头部和尾部 (2)队列从尾部压入数据 (3)队列从头部弹出数据 那么连续内存下的队列是怎么实现的呢? a)设计队列数据结构 typedef struct _QUEUE_NODE { int* pData; int length; int head ; int tail; int count; }QUEUE_NODE; b)申请队列内存 QUEUE_NODE* alloca_queue(int number) { QUEUE_NODE* pQueueNode; if( 0 == number) return NULL; pQueueNode = (QUEUE_NODE*)malloc(sizeof(QUEUE_NODE)); assert(NULL != pQueueNode); memset(pQueueNode, 0, sizeof(QUEUE_NODE)); pQueueNode-

腾讯开源国内首个视频质量评估算法DVQA

我们两清 提交于 2020-04-02 06:06:42
腾讯开源国内首个视频质量评估算法DVQA 近日,腾讯多媒体实验室设计的基于深度学习的全参考视频质量评估算法DVQA在Github上正式开源,该算法模型的性能目前在公开测试数据集上取得业界领先成绩。 开源地址: https://github.com/Tencent/DVQA ( 点击此处打开链接 ) 国内镜像地址: https://git.code.tencent.com/Tencent_Open_Source/DVQA (登录后才能访问公开项目) 腾讯工蜂源码系统为开源开发者提供完整、最新的腾讯开源项目国内镜像 视听时代,音视频应用越来越广泛:直播、短视频、视频节目、音视频通话……近期由于新冠疫情带来的在线协同办公、在线教育类产品的崛起,更带来了线上音视频需求的爆发,用户对音视频质量诉求也愈加强烈。 在整个视频链路中,大部分模块都可以精确度量,如采集、上传、预处理、转码、分发等。然而未知的部分却恰恰是最关键的部分,即用户的视频观看体验到底怎么样。目前行业内的视频质量评估方法分为两大类:客观质量评估与主观质量评估。前者计算视频的质量分数,又根据是否使用高清视频做参考、源视频是专业视频还是用户原创视频等进一步细分;后者主要依赖人眼观看并打分,能够直观反映观众对视频质量的感受。然而,这些方法仍存在耗时费力、成本较高、主观观感存在偏差等难题。 多媒体实验室提出的视频质量评估解决方案