哈希查找

哈希算法及其拓展

六月ゝ 毕业季﹏ 提交于 2019-12-02 12:14:32
本篇是iOS逆向开发的递进篇-关于哈希算法、数字签名及对称加密等,下面我们着重讲解此内容,希望对大家有所帮助!!! 一、哈希 1.1 基本内容 哈希表也称为散列表(Hash table),是根据关键码值(key,value),直接进行访问的数据结构。通过把关键码映射到表中的一个位置来进行访问记录,用来加快查找速度。映射函数也称之为散列函数,存放记录数组称为散列表。 假设没有内存限制,直接可以将键作为数组的索引,那么所有的查找仅仅需要一次即可完成。但是这种理想的情况也不会一直出现,因为牵扯到内存问题。从另一个角度来说,如果没有时间来限制,我们也可以使用无序数组并进行顺序查找,这样也会使用较少的内存。 使用哈希查找算法分为两个步骤: 使用Hash函数将被要查找的键转化为数组中的一个索引。理想情况下,不同的键都可以转为不同的索引值。但这仅仅是理想情况下,在实际的开发运算中,我们还是要处理两个或者多个键值散列到同个索引值的情况。 要处理碰撞冲突的过程。 目前本人博客关于讲述哈希思想查找元素的博客有: https://www.cnblogs.com/guohai-stronger/p/11506990.html ,还会持续更新此类算法思想有关的题目。 1.2 哈希函数的两种解决碰撞的方式 1.2.1 拉链法(separate chaining) 拉链法简单说就是链表+数组

HashMap、HashTable差异详解

风流意气都作罢 提交于 2019-12-02 05:19:22
  HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。 代码版本   JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 10.0.1。 1. 时间   HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。从时间的维度上来看,HashMap要比HashTable出现得晚一些。 2. 作者   以下是HashTable的作者: /* * 以下代码及注释来自java.util.HashTable * @author Arthur van Hoff * @author Josh Bloch * @author Neal Gafter */   以下是HashMap的作者: /* * 以下代码及注释来自java.util.HashMap * @author Doug Lea * @author Arthur van Hoff * @author Josh Bloch * @author Neal Gafter */   可以看到HashMap的作者多了大神Doug Lea。不了解Doug Lea的,可以看 这里 。 3. 对外的接口(API)   HashMap和HashTable都是基于哈希表来实现键值映射的工具类。讨论他们的不同

局部敏感哈希LSH(Locality-Sensitive Hashing)——海量数据相似性查找技术

旧巷老猫 提交于 2019-12-01 17:16:22
一、 前言     最近在工作中需要对海量数据进行相似性查找,即对微博全量用户进行关注相似度计算,计算得到每个用户关注相似度最高的TOP-N个用户,首先想到的是利用简单的协同过滤,先定义相似性度量(cos,Pearson,Jaccard),然后利用通过两两计算相似度,计算top-n进行筛选,这种方法的时间复杂度为 \(O(n^2)\) (对于每个用户,都和其他任意一个用户进行了比较)但是在实际应用中,对于亿级的用户量,这个时间复杂度是无法忍受的。同时,对于高维稀疏数据,计算相似度同样很耗时,即 \(O(n^2)\) 的系数无法省略。这时,我们便需要一些近似算法,牺牲一些精度来提高计算效率,在这里简要介绍一下MinHashing,LSH,以及Simhash。 二、 MinHashing     Jaccard系数是常见的衡量两个向量(或集合)相似度的度量: \[ J(A,B)=\frac {\left | A\cap B \right |}{\left | A\cup B \right |} \]     为方便表示,我们令A和B的交集的元素数量设为 \(x\) ,A和B的非交集元素数量设为 \(y\) ,则Jaccard相似度即为 \()\frac x {(x+y)}\) 。 所谓的MinHsah,即进行如下的操作: 对A、B的 \(n\) 个维度,做一个随机排列(即对索引 \(

重新认识Java 8的HashMap

瘦欲@ 提交于 2019-12-01 11:46:32
【转自】 美团技术博客 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类的特点做一些说明: (1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。 (2) Hashtable:Hashtable是遗留类,很多映射的常用功能与HashMap类似

SGI-STL简记(八)-哈希关联容器(hash、hash_set、hash_map、hash_multiset、hash_multimap)

て烟熏妆下的殇ゞ 提交于 2019-12-01 02:04:48
stl_hash_fun.h : hash:模板函数对象类类型,一般作为hash_set、hash_map、hash_multiset、hash_multimap容器的默认哈希函数,目前提供了多个特化版本,并重载实现operator(),参数类型有char、unsigned char、char*、int等 内置可转化为整型的数据类型的版本;除const char*和char*使用了__stl_hash_string计算哈希值,其余的则直接返回参数value值作为哈希值;哈希值返回值类型为size_t; __stl_hash_string:遍历各个字符串元素,累积遍历计算哈希值,计算方式为h=0;h=5*h+*s,*s为遍历字符串相应元素,h即为最后的哈希值,类型为unsigned long; 对于其他的hash模板实例实现,如basic_string<_CharT,_Traits,_Alloc>、crope、wrope或者是用户自定义的hash模板函数对象实现; stl_hashtable.h : _Hashtable_node:哈希表节点模板类; 数据成员: _M_next:指向下一个哈希表节点的指针; _M_val:保存当前哈希表节点的值(哈希值); _Hashtable_iterator/_Hashtable_const_iterator:哈希表迭代器模板类,模板参数_Val

夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

牧云@^-^@ 提交于 2019-11-30 19:04:41
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文参考 https://www.cnblogs.com/chenssy/p/3495238.html 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影! java中集合大家族的成员实在是太丰富了,有常用的ArrayList、HashMap、HashSet,也有不常用的Stack、Queue,有线程安全的Vector、HashTable,也有线程不安全的LinkedList、TreeMap等等! 上面的图展示了整个集合大家族的成员以及他们之间的关系。下面就上面的各个接口、基类做一些简单的介绍(主要介绍各个集合的特点。区别)。 下面几张图更清晰地介绍了结合类接口间的关系: Collections和Collection。 Arrays和Collections。 Collection的子接口 map的实现类 Collection接口 Collection接口是最基本的集合接口,它不提供直接的实现,Java

哈希索引和Btree索引的比较

…衆ロ難τιáo~ 提交于 2019-11-30 11:24:08
索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。 我们在mysql中常用两种索引算法BTree和Hash,两种算法检索方式不一样,对查询的作用也不一样。 一、BTree BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量,例如: select * from user where name like ‘jack%’; select * from user where name like ‘jac%k%’; 如果一通配符开头,或者没有使用常量,则不会使用索引,例如: select * from user where name like ‘%jack’; select * from user where name like simply_name; 二、Hash Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。

Java集合必会14问(精选面试题整理)

一世执手 提交于 2019-11-30 01:07:29
前言.... 前言:把这段时间复习的关于集合类的东西整理出来,特别是HashMap相关的一些东西,之前都没有很注意1.7 ->> 1.8的变化问题,但后来发现这其实变化挺大的,而且很多整理的面试资料都没有更新(包括我之前整理的...) 1)说说常见的集合有哪些吧? 答:Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等 2)HashMap与HashTable的区别? 答: HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的; HashMap允许K/V都为null;后者K/V都不允许为null; HashMap继承自AbstractMap类;而Hashtable继承自Dictionary类; 3)HashMap的put方法的具体流程? 图引用自:https://blog.csdn.net/u011240877/article

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不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销   同时频繁的移动、分页操作造成了大量的碎片