next

HashMap源码分析

三世轮回 提交于 2020-10-28 04:22:59
一、简介 HashMap是基于哈希表实现的,因其实现了Serializable和Cloneable接口所以支持序列化和被克隆,其每一个元素都是一个唯一且允许key和value为null的key-value键值对,其内部通过单链表和红黑树(1.8中加入)解决冲突问题,容量不足(超过了阀值)时,会自动增长。其是非线程安全的,适用于单线程环境,多线程环境下可采用concurrent并发包下的concurrentHashMap。 数据结构如下: 二、源码分析 1. 成员变量 //默认初始容量(16),必须是2的幂。 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //最大容量(必须是2的幂且小于2的30次方,传入容量过大将被这个值替换) static final int MAXIMUM_CAPACITY = 1 << 30; //默认装载因子(0.75),当实际元素所占容量占分配容量比例达到装载因子即75%时就要扩容了。填充比越大利用的空间很多,同时查找的效率也越低,因为链表的长度很大(1.8版本使用了红黑树后会改进些)。当我们关注内存时填充比可以稍大,当我们关注查找性能时填充比可以稍小些。 static final float _LOAD_FACTOR = 0.75f; //一个桶(bucket)即链表的树化阈值

强化学习Q-learning的理解与python实现

爷,独闯天下 提交于 2020-10-28 00:17:19
Q-learning介绍 在介绍Q-learning这一基础的强化学习方法之前,首先要知道Q值代表什么。Q值翻译成中文是状态动作价值的意思,通俗一点来讲就是假设有个无所不知的上帝(先验),在凡人(智能体)当前处于某一状态s时,他可以从一定范围的动作(如a、b、c)中选择一个执行,而上帝会根据凡人的选择给出一个分数(因为上帝无所不知,所以知道凡人在选择了动作a之后会发生的所有事情)。比如凡人选择了a,上帝会给出80分,选择b的话上帝会给70分,选择c的话上帝会给60分,那么凡人在当前状态下肯定会选择分数最高的a选项。综上,只要智能体知道了所有的Q值,他就能做出当前状态下最优的选择。在强化学习中是通过Q-learning这一方法来计算Q值的。 Q-learning是采用Q表格的方式存储Q值,一开始假设所有的Q值为零,然后不断地根据每次选择所对应的reward与下一状态的所有Q值来更新Q表格。Q-learning是off-policy的更新方式,更新learn()时无需获取下一步实际做出的动作next_action,并假设下一步动作是取最大Q值的动作。 Q-learning的更新公式为: 上述公式解释如下,假设t1时刻的状态是s1,想更新的是此时做出动作a1时的Q值,Q(a1|s1)。我们知道当执行a1后,智能体会获得一个reward(r1),同时所处的状态也会变为s2

About Thermal Models

心已入冬 提交于 2020-10-27 18:27:24
Among SPICE models, there are what are called thermal models and thermal dynamic models, which are used to perform simulations relating to heat. We first describe thermal models. We hope the reader will acquire a conceptual image of the general nature of thermal models. What is Thermal Model? A thermal model is a model of an electrical circuit that corresponds to transient thermal resistances, for use in calculations of the thermal circuit associated with the electrical circuit. Thermal resistances are represented by R, and thermal capacities by C. The interchange of thermal circuits and

为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

青春壹個敷衍的年華 提交于 2020-10-27 16:47:21
B-树由来 定义:B-树是一类树,包括B-树、B+树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。B-树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般被用在文件系统及数据库中。 先来看看为什么会出现B-树这类数据结构。 传统用来搜索的平衡二叉树有很多,如 AVL 树,红黑树等。这些树在一般情况下查询性能非常好,但当数据非常大的时候它们就无能为力了。原因当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约为 50 ns,而磁盘在 10 ms 左右。速度相差了近 5 个数量级,磁盘读取时间远远超过了数据在内存中比较的时间。这说明程序大部分时间会阻塞在磁盘 IO 上。那么我们如何提高程序性能?减少磁盘 IO 次数,像 AVL 树,红黑树这类平衡二叉树从设计上无法“迎合”磁盘。 关于磁盘可参考 浅谈计算机中的存储模型(四)磁盘 上图是一颗简单的平衡二叉树,平衡二叉树是通过旋转来保持平衡的,而旋转是对整棵树的操作,若部分加载到内存中则无法完成旋转操作。其次平衡二叉树的高度相对较大为 log n(底数为2),这样逻辑上很近的节点实际可能非常远,无法很好的利用磁盘预读(局部性原理),所以这类平衡二叉树在数据库和文件系统上的选择就被 pass 了。

[翻译]——Zabbix: Partitioning MySQL / MariaDB database Tables in 5 min

拟墨画扇 提交于 2020-10-27 16:16:23
前言:本文是对这篇博客Zabbix: Partitioning MySQL / MariaDB database Tables in 5 min的翻译,翻译如有不当的地方,敬请谅解,请尊重原创和翻译劳动成果,转载的时候请注明出处。谢谢! 英文地址:https://bestmonitoringtools.com/zabbix-partitioning-tables-on-mysql-database 在本教程中,我们将逐步学习如何使用分区脚本(partitioning script)在MySQL或MariaDB服务器上对Zabbix数据库(history和trends表)进行分区。 Zabbix从主机采集数据并将其存储在history和trends表中,Zabbix的history表中保存原始数据(Zabbix采集的每一个值),trends表中存储每小时内的合并数据,那些数据的平均值、最小值、最大值。 Zabbix的housekeeping进程负责删除trends表和history表中的旧数据。使用delete语句从数据库删除旧数据可能对数据库性能产生负面的性能影响。因此,我们中许多人都收到过令人讨厌的警报 “ Zabbix housekeeper processes more than 75% busy ” 这个问题能够通过数据库分区方案轻松的解决

002-Java Web学习之IDEA中Maven的相关操作(一)

别来无恙 提交于 2020-10-27 15:58:53
1、启动IDEA,我使用的IDEA是2019.3.3版 2、创建一个Maven Web项目 将Create from archetype选中,作用是可以使用Maven的模板,也可以不选中。 在下面选中org.apache.maven.archetypes:maven-archetype-webapp 使用该模板建立一个简单的Java web应用。 GroupId一般是自己公司域名的倒序,ArtifactId是项目名称,Version是版本号,填写后,由于我已经设置过了IDEA的工作目录,所以上面会自动填充相关信息,自己可以进行修改: 点击Next后,在新窗口中配置自己的Maven 在最上面选择我们刚才自己安装的Maven目录,配置文件和本地仓库 点击Finish完成创建。 3、自动导入包 项目启动后,在出现的窗口的右下角,有一个弹窗,点击里面的Enable Auto-Import,自动导入所需jar包 4、等待项目自动构建,当下面信息中出现BUILD SUCCESS,证明构建成功 5、观察Maven仓库中出现的内容 来源: oschina 链接: https://my.oschina.net/u/4263893/blog/4691276

在C#中重复字符的最佳方法

南笙酒味 提交于 2020-10-27 14:07:05
问题: What it's the best way to generate a string of \\t 's in C# 在C#中生成 \\t 字符串的最佳方法是什么 I am learning C# and experimenting with different ways of saying the same thing. 我正在学习C#,并尝试用不同的方式说同一件事。 Tabs(uint t) is a function that returns a string with t amount of \\t 's Tabs(uint t) 是一个函数,该函数返回 t 等于 \\t 的 string For example Tabs(3) returns "\\t\\t\\t" 例如 Tabs(3) 返回 "\\t\\t\\t" Which of these three ways of implementing Tabs(uint numTabs) is best? 这三种实现 Tabs(uint numTabs) 方式中哪一种最好? Of course that depends on what "best" means. 当然,这取决于“最佳”的含义。 The LINQ version is only two lines, which is nice.

深入理解Java编程性能调优——深入浅出HashMap的设计与优化

Deadly 提交于 2020-10-27 08:24:19
HashMap 作为我们日常使用最频繁的容器之一,相信你一定不陌生了。今天我们就从HashMap 的底层实现讲起,深度了解下它的设计与优化。 常用的数据结构 我在 05 讲分享 List 集合类的时候,讲过 ArrayList 是基于数组的数据结构实现的,LinkedList 是基于链表的数据结构实现的,而我今天要讲的 HashMap 是基于哈希表的数据结构实现的。我们不妨一起来温习下常用的数据结构,这样也有助于你更好地理解后面地内容。 数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为 O(1),但在数组中间以及头部插入数据时,需要复制移动后面的元素。 链表 :一种在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素)组成,结点可以在运行时动态生成。每个结点都包含“存储数据单元的数据域”和“存储下一个结点地址的指针域”这两个部分。 由于链表不用必须按顺序存储,所以链表在插入的时候可以达到 O(1) 的复杂度,但查找一个结点或者访问特定编号的结点需要 O(n) 的时间。 哈希表 :根据关键码值(Key value)直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组就叫做哈希表。 树 :由 n(n≥1

Web瞎捣鼓——JavaScript终章

廉价感情. 提交于 2020-10-27 03:26:09
Web的大杂烩马上就要告一段落,我也想弄点好东西出来,不然就成了只会复制没有思考的废物了。“Web瞎捣鼓”系列还会继续,只是不搞这种几千字的不知所云的东西,尽量弄点硬核的东西出来。这不是终章,而是新的起点。别揍我,这篇还会继续的有点虚头巴脑! 新特性 1、先上场和变量有关,前一篇已经写了let和const命令,就不再赘言。这里要提到的是数组和对象的 解构赋值 ,就是按照一定的模式从数组和对象中提取值对变量进行赋值。它可以是不完全解构,只要模式匹配就能正确解构,可以使用reset参数来进行模式匹配。 let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [ , , third] = ["foo", "bar", "baz"]; third // "baz" let [head, ...tail] = [1, 2, 3, 4]; head // 1 tail // [2, 3, 4] let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; foo // "aaa" bar // "bbb" 解构赋值允许默认值,解构目标匹配位置必须严格等于undefined,默认值才会有效。 let [x = 1] = [undefined]; x // 1 let [y =

面试常考代码

寵の児 提交于 2020-10-27 01:51:10
快排 #include<iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <stack> #include <map> #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <stack> #include <map> #include <queue> #include <cmath> #include <list> using namespace std; typedef long long LL; typedef unsigned long long ull; #define sc1(a) scanf("%lld",&a) #define pf1(a) printf("%lld\n",a) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const LL INF= 1e18; const ull base = 2333 ; const int maxn=1e2+ 55 ; const int maxm=1e2+ 50 ; const int maxv=1e6+ 5 ;