hash函数

并发容器之ConcurrentHashMap

[亡魂溺海] 提交于 2019-11-27 19:02:01
  JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开 始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashtable、 Collections.synchronizedXxx()同步容器等相比,util.concurrent中引入的并发容器主要解决了两个问题: 1)根据具体场景进行设计,尽量避免synchronized,提供并发性。 2)定义了一些并发安全的复合操作,并且保证并发环境下的迭代操作不会出错。   util.concurrent中容器在迭代时,可以不封装在synchronized中,可以保证不抛异常,但是未必每次看到的都是"最新的、当前的"数据。   下面是对并发容器的简单介绍:   ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap())),众所周知,HashMap是根据散列值分段存储的,同步Map在同步的时候锁住了所有的段

布隆过滤器简述及应用

谁都会走 提交于 2019-11-27 18:56:23
一、布隆过滤器 1、维基百科   布隆过滤器( Bloom Filt er)是1970年由布隆提出的。   实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于 检索一个元素是否在一个集合中 。    优点 是不需要存储 key,节省空间,空间效率和查询时间都远远超过一般的算法, 缺点 是有一定的误识别率和删除困难。 2、原理概念   如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。    链表、树、散列表(哈希表) 等等数据结构都是这种思路,但是随着集合中元素的增加,需要的存储空间越来越大;同时检索速度也越来越慢,检索时间复杂度分别是O(n)、O(log n)、O(1)。   布隆过滤器的原理是,当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组(Bit array)中的 K 个点,把它们置为 1 。检索时,只要看看这些点是不是都是1就知道元素是否在集合中;如果这些点有任何一个 0,则被检元素一定不在;如果都是1,则被检元素很可能在(之所以说“ 可能 ”是误差的存在)。 3、自我理解   直观的说,Bloom 算法类似于一个 HashSet(通过哈希算法得出元素的哈希地址,通过对比哈希地址就可以确定两个对象是否为同一个地址),用来判断某个元素(key)是否在某个集合中。   和一般的 HashSet

【译】PHP 内核 — 字符串管理

女生的网名这么多〃 提交于 2019-11-27 16:11:56
【译】PHP 内核 — 字符串管理 (Strings management: zend_string 译文) 原文地址: http://www.phpinternalsbook.com/php7/internal_types/strings/zend_strings.html 原文仓库: https://github.com/phpinternalsbook/PHP-Internals-Book 原文作者: phpinternalsbook 译文出自: https://github.com/suhanyujie 本文永久链接: 译者: suhanyujie 翻译不当之处,还请指出,谢谢! 字符串管理:zend_string 任何程序都需要管理字符串。在这里,我们将详细介绍一个适合 PHP 需要的定制解决方案: zend_string 。每次 PHP 需要处理字符串时,都会使用 zend_string 结构体。这个结构体是 C 语言的 char * 类型包装后的结果。 它增加了内存管理功能,这样的话,同一个字符串可以在多个地方共享,而不需要复制它。另外,有些字符串是 “interned” 的,它们被持久化的分配内存并由内存管理器进行特殊管理的,这样可以实现在多个请求之间进行复用。那些字符串在后续会被 Zend 内存管理器 持久化分配。 结构体和访问宏 这里简单地展示 zend

字符串Hash入门(转载)

回眸只為那壹抹淺笑 提交于 2019-11-27 15:07:19
字符串Hash入门 Hash方法 自然溢出方法 Hash公式 单Hash方法 Hash公式 举例 双Hash方法 Hash公式 获取子串的Hash 例子 公式 字符串Hash的应用 题型一 描述 解法 题型二 描述 解法 题型三 描述 解法 题型四 描述 解法 Hash素数的选取 字符串Hash入门 字符串Hash可以通俗的理解为,把一个字符串转换为一个整数。 如果我们通过某种方法,将字符串转换为一个整数,就可以便的确定某个字符串是否重复出现过,这是最简单的字符串Hash应用情景了。 当然也不难想到,如果有不同的两个字符串同时Hash到一个整数,这样就比较麻烦了。我们希望这个映射是一个单射,所以问题就是如何构造这个Hash函数,使得他们成为一个单射。不用担心,接下来的内容正要讲解。 Hash方法 给定一个字符串S=s1s2s3..snS=s1s2s3..sn,对字母x,我们规定idx(x)=x−′a′+1idx(x)=x−′a′+1。 (当然也可以直接用sisi的ASCIIASCII值) 自然溢出方法 Hash公式 unsigned long long Hash[n] hash[i]=hash[i−1]∗p+id(s[i])hash[i]=hash[i−1]∗p+id(s[i]) 利用unsigned long long的范围自然溢出,相当于自动对264−1264−1取模

构造数组的MaxTree

南楼画角 提交于 2019-11-27 14:40:08
【说明】:   本文是左程云老师所著的《程序员面试代码指南》第一章中“ 构造数组的MaxTree ”这一题目的C++复现。   本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。   感谢左程云老师的支持。 【题目】:   定义二叉树节点如下: class Node { public: Node(int data) { value = data; left = NULL; right = NULL; } public: int value; Node *left; Node *right; }; View Code   一个数组的 MaxTree 定义如下:   数组必须没有重复元素;   MaxTree 是一棵二叉树,数组的每一个值对应一个二叉树节点;   包括 MaxTree 树在内且在其中一的每一棵子树上,值最大的节点都是树的头。   给定一个没有重复元素的数组 arr,写出生成这个数组的 MaxTree 的函数,要求如果数组长度为 N,则时间复杂度为 O(N),额外空间复杂度为 O(N)。 【思路】:   利用栈找到每个数左右两边第一个比它大的数,并且用hash_map保存。(估计这样说大家都不明白,大家可以看原书,或者分析代码喽) 【编译环境】:   CentOS6.7(x86_64)   gcc 4.4.7 【实现】:  

分布式算法

陌路散爱 提交于 2019-11-27 09:54:30
分布式算法 转自: https://blog.51cto.com/alanwu/1431397 在分布式存储中面临的一个重要问题是如何在多个存储节点上分布数据。了解GFS之类文件系统的同学都知道可以采用元数据服务器(MS)的方式决定数据块在存储节点上的分布映射。采用元数据服务器方式可以很好的将数据和元数据分离,访问文件系统命令空间的时候,可以直接从元数据服务器上获取文件的映射信息。基于MS的分布式存储架构如下图所示: 基于元数据服务器的方式是分布式存储的经典架构,虽然看起来很完美,但是还是存在如下两大主要问题: 1,可扩展性受限于元数据服务器的能力。所有的元数据信息都集中在元数据服务器上面,所以,当Client想要获取元数据时就需要访问该服务器。因此,整体的带载能力(Client的个数)就受限于元数据服务器的能力。元数据服务器就是整个分布式系统的潜在瓶颈点。特别当Client访问小文件时,会产生大量的元数据信息,此时元数据服务器就会成为系统性能瓶颈。 2,元数据服务器是分布式系统中的单点故障点。一旦元数据服务器发生故障,整个分布式存储系统将无法正常工作,因此,元数据服务器的可靠性尤为重要。 总结起来,基于元数据服务器的分布式存储架构最大的问题在于可扩展能力和可靠性。而且这些问题的核心点都在于元数据服务器上。对此也有很多的系统优化手段,例如,针对元数据服务器影响系统可扩展性能力的问题

BloomFilter(布隆过滤器)

妖精的绣舞 提交于 2019-11-27 08:16:00
原文链接 : http://blog.csdn.net/qq_38646470/article/details/79431659 1.概念: 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是 1 就知道可以集合中有没有它了。这就是布隆过滤器的基本思想。 它的优点 是空间效率和查询时间都远远超过一般的算法, 缺点 是有一定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,但是实际上该元素并不在集合中)和删除困难,但是没有识别错误的情形(即假反例False negatives,如果某个元素确实没有在该集合中,那么Bloom Filter 是不会报告该元素存在于集合中的,所以不会漏报)。 2.实现原理: 直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位

浅析java中的hashMap

回眸只為那壹抹淺笑 提交于 2019-11-27 07:51:59
HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类。虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 HashSet 本身就采用 HashMap 来实现的。 ===== 通过 HashMap、HashSet 的源代码分析其 Hash 存储机制 ===== 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量。 HashMap 的存储实现 当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: HashMap<String , Double> map = new HashMap<String , Double>(); map.put("语文" , 80.0); map.put("语文" , 80.0); map.put("语文", 80.2); map.put("数学", 89.0); map.put("英语", 78.2); map.put(null , 78.5); map.put("null" , 78.6);

洛谷 P1540 机器翻译 (模拟+hash+queue)

只愿长相守 提交于 2019-11-27 04:58:12
题目链接: 点击这里 队列模拟题,但是STL的queue没有查找函数,便用hash数组标记,AC感谢数据量小: # include <iostream> # include <algorithm> # include <string> # include <cstdio> # include <cstring> # include <cmath> # include <stack> # include <queue> using namespace std ; typedef long long ll ; const int MOD = 10000007 ; const int INF = 0x3f3f3f3f ; const double PI = acos ( - 1.0 ) ; const int maxn = 1010 ; int hash [ maxn ] ; int main ( ) { queue < int > Q ; int m , n , temp ; scanf ( "%d%d" , & m , & n ) ; int cnt = 0 ; for ( int i = 0 ; i < n ; i ++ ) { scanf ( "%d" , & temp ) ; if ( hash [ temp ] ) //如果temp在内存中,什么也不操作 continue ;

BAT面试必问HashMap源码分析

99封情书 提交于 2019-11-27 03:49:13
HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间。 底层数据结构分析 JDK1.8之前 JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列 。 HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。 所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞。 JDK 1.8 HashMap 的 hash 方法源码: JDK 1.8 的 hash方法 相比于 JDK 1.7 hash 方法更加简化,但是原理不变。 1