哈希表

散列表、散列法、拉链法的一些概念

回眸只為那壹抹淺笑 提交于 2019-11-29 12:06:05
散列表、散列法、拉链法的一些概念介绍: 散列表 https://www.cnblogs.com/baxianhua/p/9244769.html 散列表也叫hash表 ,是根据关键码值而进行直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射也叫散列函数,存放记录的数组叫散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则成表M为Hash表,函数f(key)为哈希函数。 散列表有哪些特点? HashMap具有优秀的查找性能。根据key找到value,性能最好的算法!(没有之一)。无论数据多少,查找方法的性能始终如一!为了实现根据key告诉找到value,散列表提供了高性能查找算法。利用散列数组算法进行散列查找,性能很好。无论数据量有多少,都会在一个固定的时间,找回结果!甚至是在亿级别数据量上进行查找!凡是软件中需要查找根据key查找到value时,一定使用散列表。 使用散列表的注意事项: ①key-value成对数据添加到散列表 ②key不可以重复,value可以重复 ③key-value规定为一个条目(Entry) ④散列表中散列数组的大小称为容量 ⑤key-value数量称为size ⑥size/容量称为加载因子,要小于75%,如果大于75%,会自动扩容

JAVA语言中的引用类型

安稳与你 提交于 2019-11-29 11:43:39
Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存。C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存。这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题。一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果。开发人员有可能忘记显式的调用释放内存的函数而造成内存泄露。而自动的内存管理则是把管理内存的任务交给编程语言的运行环境来完成。开发人员并不需要关心内存的分配和回收的底层细节。Java平台通过垃圾回收器来进行自动的内存管理。 Java垃圾回收机制 Java的垃圾回收器要负责完成3件任务:分配内存、确保被引用的对象的内存不被错误回收以及回收不再被引用的对象的内存空间。垃圾回收是一个复杂而且耗时的操作。如果JVM花费过多的时间在垃圾回收上,则势必会影响应用的运行性能。一般情况下,当垃圾回收器在进行回收操作的时候,整个应用的执行是被暂时中止(stop-the-world)的。这是因为垃圾回收器需要更新应用中所有对象引用的实际内存地址。不同的硬件平台所能支持的垃圾回收方式也不同。比如在多CPU的平台上,就可以通过并行的方式来回收垃圾

js - 实现数组去重

一世执手 提交于 2019-11-29 10:26:11
方法一:创建一个新的临时数组来保存数组中已有的元素 Array.prototype.unique = function(){ let uniqueArr = []; for(let i = 0; i < this.length; i++){ //如果当前数组的第i个元素已经保存进了临时数组,那么跳过 if(uniqueArr.indexOf(this[i]) === -1){ uniqueArr.push(this[i]) } } return uniqueArr } 方法二:使用哈希表存储已有元素 Array.prototype.unique = function(){ let uniqueArr = []; let hash = []; //定义hash哈希表 for(let i = 0; i < this.length; i++){ //如果hash表中没有当前数组的第i个元素,则将它存入哈希表 if(!hash[this[i]]){ hash[this[i]] = true; uniqueArr.push(this[i]) } } return uniqueArr } 方法三:使用indexof判断数组元素第一次出现的位置是否为当前位置 Array.prototype.unique = function(){ let uniqueArr = []; for(let i =

Mysql索引

走远了吗. 提交于 2019-11-29 10:12:50
Mysql 索引 A 、索引的基本操作 1 、概念 1 )、查看索引 show index from 数据库表名 2 )、 alter table 数据库表 add index 索引名称 ( 数据库表字段名称 ) 2 、索引类型: 1 )、 PRIMARY KEY (主键索引) ALTER TABLE table_name ADD PRIMARY KEY ( column ) 2 )、 UNIQUE( 唯一索引 ) ALTER TABLE table_name ADD UNIQUE (column) 3 )、 INDEX( 普通索引 ) ALTER TABLE table_name ADD INDEX index_name ( column ) 4 )、 FULLTEXT( 全文索引 ) ALTER TABLE table_name ADD FULLTEXT ( column ) 5 )、多列索引 ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 ) 3 、操作 1). 普通索引。 这是最基本的索引,它没有任何限制。它有以下几种创建方式: ( 1 )创建索引: CREATE INDEX indexName ON tableName(tableColumns(length)); 如果是

java集合框架详解

纵然是瞬间 提交于 2019-11-29 09:40:37
一、数组和集合的比较 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下: 1 :数组能存放基本数据类型和对象,而集合类存放的都是对象的引用,而非对象本身! 2 :数组容易固定无法动态改变,集合类容量动态改变。 3 :数组无法判断其中实际存有多少元素, length 只告诉了数组的容量,而集合的 size() 可以确切知道元素的个数 4 :集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式 5 :集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率 二、 Java 集合 此图可用 Windows 系统自带画图工具查看比较清晰 Collection 和 Map ,是集合框架的根接口。 Collection 的子接口: Set: 接口 --- 实现类: HashSet 、 LinkedHashSet Set 的子接口 SortedSet 接口 --- 实现类: TreeSet List: 接口 --- 实现类: LinkedList,Vector,ArrayList List 集合 有序列表,允许存放重复的元素; 实现类: ArrayList :数组实现,查询快,增删慢,轻量级; ( 线程不安全 ) LinkedList :双向链表实现,增删快

MySQL 索引知识整理(创建高性能的索引)

可紊 提交于 2019-11-29 08:28:59
前言: 索引优化应该是对查询性能优化的最有效的手段了。索引能够轻易将查询性能提高几个数量级。 // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性; 然而即使是固态硬盘,索引的原则依然成立, 只是那些需要尽量避免的糟糕索引对固态硬盘的影响没有机械硬盘那么糟糕。 现在很多公司都将数据库的优化工作都依托于 DBA 去完成,在我看来,这些都应该是程序员必备的技能, 有经验和没经验的程序员在数据库使用起来也有很大的差异,这些差异取决开发人员对索引内部的数据结构认识, 对所有负责的业务熟悉程度,从而才能建立卓越的索引,达到性能最大化。 一、索引基础 索引在数据库中的作用,粗暴的原理介绍不做解释,太基础。 在 MySQL 中,索引可以包含一个或者多个列的值。 如果索引包含多个列,那么列的顺序十分重要,因为 MySQL 只能高效地使用索引最前缀列。 创建一个包含两个列的索引,和创建两个只包含一个列的索引大有不同。 二、索引的类型 MySQL 中有两种索引类型:BTree 和 Hash; 不同的存储引擎的索引工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。 即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。 MyISAM 使用前缀压缩技术使得索引更小,但 InnoDB 则按照原数据格式进行储存。 MyISAM 索引通过数据的物理位置引用被索引的行,而 InnoDB

写给 Java 程序员的 24 个MySQL面试题,拿走不谢!

核能气质少年 提交于 2019-11-29 08:09:48
一、为什么用自增列作为主键?   1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。   如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。   如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。   2、数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放   因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)   3、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页   4、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置   此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销   同时频繁的移动、分页操作造成了大量的碎片

redis slot 槽点

安稳与你 提交于 2019-11-29 05:53:14
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数, 这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大 致均等的将哈希槽映射到不同的节点。 Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。 Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。 使用哈希槽的好处就在于可以方便的添加或移除节点。 当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了; 当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了; 在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。 "用了哈希槽的概念,而没有用一致性哈希算法,不都是哈希么?这样做的原因是为什么呢?" Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活

Redis基础知识汇总

孤者浪人 提交于 2019-11-29 05:46:16
Redis基础知识汇总 1.什么是Redis Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value的非关系型数据库,并提供多种语言的API。 Redis是远程的 Redis是基于内存的 Redis是非关系型数据库 2.Redis的安装 2.1.Window安装Redis 选择需要版本下载安装包 官网下载地址 : http://redis.io/download github下载地址 : https://github.com/microsoftarchive/redis/tags 解压Redis安装包,当前目录打开cmd窗口,redis-server.exe redis.windows.conf 启动Redis redis-server.exe redis.windows.conf 如果需要Redis一直存在,执行 redis-server.exe --service-install redis.windows-service.conf 添加到服务列表 redis-server.exe --service-install redis.windows-service.conf 使用 redis-cli.exe -h localhost -p 6379 或者运行 redis-cli.exe 打开客户端 2.2.Linux安装Redis

HashTable和HashMap的区别详解

限于喜欢 提交于 2019-11-29 05:03:41
一、HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。 HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。 HashMap存数据的过程是: HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头。 HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。 了解了数据的存储,那么数据的读取也就很容易就明白了。 HashMap的存储结构,如下图所示: 图中