hash函数

java知识系列之集合理论篇

杀马特。学长 韩版系。学妹 提交于 2019-12-26 04:55:56
本文主要综合介绍java集合中比较重要的一些概念和实现。如下图 基础部分 Collection List :接口实例存储的是 有序的 , 可以重复 的元素。 ArrayList - 底层使用数组 - 读取速度快,增删速度慢 - 不是线程安全的,只能在单线程环境下,多线程环境下可以考虑用collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发CopyOnWriteArrayList类。 - 当容量不够时,当前容量*1.5+1 LinkedList 底层使用双向链表数据结构 读取速度慢,增删快 线程不安全 implements List, Deque。实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素。同时它还实现Deque接口,即能将LinkedList当作双端队列使用。自然也可以被当作"栈来使用" Vector 底层使用数组 读取速度快,增删慢 线程安全,效率低 容量不够时,默认扩展一倍 Stack Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出 小结 java提供的List就是一个"线性表接口",ArrayList(基于数组的线性表)、LinkedList(基于链的线性表)是线性表的两种典型实现 Queue代表了队列

数组去重方法

随声附和 提交于 2019-12-26 01:15:08
// 定义函数,去掉数组中的重复元素 返回一个新的数组,没有重复项 一;用关联数组的方式: function ee(arr){ for(var i = 0,result = [],hash=[];i < arr.length;i++){ // 如果hash中以arr当前元素作为key的元素是undefined if(hash[arr[i]] === undefined){ // 为hash添加新元素,key值为arr当前元素,value值赋值为 true hash[arr[i]] = true; // 将arr中当前元素,追加到result末尾 result.push(arr[i]); } } console.log(result); } ee([1,1,2,3,2]); 二;用indexOf方式: function ff(arr){ for(var i = 0,result = [];i < arr.length;i++){ //在result里找arr里的元素 等于-1 就是没找到 就将arr中当前元素,追加到result末尾 if(result.indexOf(arr[i]) == -1){ result.push(arr[i]); } } console.log(result); } ff([1,1,2,3,2]); 三;双层循环 function dd(arr){ //

Java8 HashMap源码分析

与世无争的帅哥 提交于 2019-12-25 05:42:14
java.util.HashMap 是最常用的java容器类之一, 它是一个线程不安全的容器. 本文对JDK1.8.0中的HashMap实现源码进行分析. HashMap 使用位运算巧妙的进行散列并使用链地址法处理冲突. 自JDK1.8后, 若表中某个位置元素数超过阈值 则会将其自动转换为红黑树来提高检索效率. HashMap 中的迭代器同样采用 fail-fast 机制, 即若迭代过程中容器发生结构性改变, 则会终止迭代. HashMap 主要有三个视图接口 keySet() , values() , entrySet() . 它们都是基于迭代器实现的, 并不实际存储数据. 哈希表 自JDK1.8.0开始HashMap使用静态内部类 Node 来存储键值对结构, 不再使用 Map.Entry : static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; Node(int hash, K key, V value, Node<K,V> next) {...} public final K getKey() { return key; } public final V getValue() { return value; }

python内置函数

☆樱花仙子☆ 提交于 2019-12-25 03:27:30
内置函数 截止到python版本3.6.2,现在python一共为我们提供了 68个内置函数 。 1.1作用域相关 locals :函数会以字典的类型返回当前位置的全部局部变量。 globals:函数以字典的类型返回全部全局变量。 1 a = 1 2 b = 2 3 print(locals()) 4 print(globals()) 5 # 这两个一样,因为是在全局执行的。 6 7 8 q = 666 9 def wrapper(argv): 10 a = 3 11 print(locals()) # {a:3,argv:2} 注意传的参数,相当于在该函数下面赋值,为局部变量 12 def inner(argv1): 13 b = 4 14 c = 5 15 print(locals()) # {b:4 c:5,argv1:6} 16 inner(6) 17 18 wrapper(2) 19 print(globals()) # 全局变量:{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002704A5A87B8>, '__spec__': None, '_

Java,该学什么?

被刻印的时光 ゝ 提交于 2019-12-24 04:29:44
本人大学学的是生物技术专业,毕业后入坑Java。 最近有人问我是如何转行的,需要学一些什么。我在网上看到一篇帖子,觉得写得很全。如果是我来写,可能还写不了这么全的。在此分享给网友。 2019秋招几个月累积的知识点,东西太多,懒得重整理做索引,尽量用(*)和 加粗 标注出高频知识点, 都是面试问过的或笔试考过的 Java基础知识(*) https://blog.csdn.net/qq_16633405/article/details/79211002 Spring Boot 启动 流程(*) https://juejin.im/post/5b679fbc5188251aad213110#heading-0 Spring 一些面试题(*) https://www.ctolib.com/topics-35589.html 匿名内部类编译class(*) https://blog.csdn.net/lazyer_dog/article/details/50669473 为什么集合类没有实现Cloneable和Serializable接口? https://www.nowcoder.com/questionTerminal/2a4902f67d5b49b6b4c05f9d7e422caf 自动装箱原理 https://www.jianshu.com/p/0ce2279c5691

Hash算法

人走茶凉 提交于 2019-12-24 00:56:04
  Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的 消息摘要 的函数。   HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系 基本概念    * 若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为 散列函数 (Hash function),按这个思想建立的表为 散列表 。   * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。   *

自己改编的布隆选择器。。

瘦欲@ 提交于 2019-12-23 18:56:36
布隆过滤器的原理就不介绍了,到网上搜搜会找到的。这里说一下最佳的选取参数。P是需要的误差率,n是读取的数据条数。 系统首先要计算需要的内存大小m bits: 再由m,n得到hash function的个数: 如果误差率在万分之一,n是一亿条,则需要19亿比特内存,13个hash函数。下面是我参考别人的布隆过滤器,修改的。。进攻参考。。 public class BloomFilter { // BitArray 初始分配2^29个bit private static int DEFAULT_SIZE = 1 << 30; //不同哈希函数的种子,一般应取质数 private static int[] seeds = new int[] { 5, 7, 11, 13, 31, 37, 61 }; private BitArray bits = new BitArray(DEFAULT_SIZE); //哈希函数对象 private SimpleHash[] func = new SimpleHash[seeds.Length]; public BloomFilter() { for (int i = 0; i < seeds.Length; i++) { func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]); } } ///

java 8 Hashmap深入解析 —— put get 方法源码

主宰稳场 提交于 2019-12-23 18:30:53
本文为原创博文,转载请注明出处,侵权必究! 每个java程序员都知道,HashMap是java中最重要的集合类之一,也是找工作面试中非常常见的考点,因为HashMap的实现本身确实蕴含了很多精妙的代码设计。   对于普通的程序员,可能仅仅能说出HashMap线程不安全,允许key、value为null,以及不要求线程安全时,效率上比HashTable要快一些。稍微好一些的,会对具体实现有过大概了解,能说出HashMap由数组+链表+RBT实现,并了解HashMap的扩容机制。但如果你真的有一个刨根问题的热情,那么你肯定会想知道具体是如何一步步实现的。HashMap的源码一共2000多行,很难在这里每一句都说明,但这篇文章会让你透彻的理解到我们平时常用的几个操作下,HashMap是如何工作的。   要先提一下的是,我看过很多讲解HashMap原理的文章,有一些讲的非常好,但这些文章习惯于把源代码和逻辑分析分开,导致出现了大段的文字讲解代码,阅读起来有些吃力和枯燥。所以我想尝试另一种风格,将更多的内容写进注释里,可能看起来有些啰嗦,但对于一些新手的理解,应该会有好的效果。 HashMap结构   首先是了解HashMap的几个核心成员变量(以下均为jdk源码): 1   transient Node<K,V>[] table;        //HashMap的哈希桶数组

Top K问题的两种解决思路

眉间皱痕 提交于 2019-12-23 17:57:07
海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些。 先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。建堆时间复杂度是O(mlogm),算法的时间复杂度为O(nmlogm)(n为10亿,m为10000)。 优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件中。这样处理就可以分别在每个文件的10^6个数据中找出最大的10000个数,合并到一起在再找出最终的结果。 以上就是面试时简单提到的内容,下面整理一下这方面的问题: top K问题 在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。例如,在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载最高的前10首歌等。 针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到的最小堆),即先将数据集按照Hash方法分解成多个小数据集

一些常用的字符串hash函数

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-23 12:13:47
General Hash Function Source Code: unsigned int RSHash(const std::string& str) { unsigned int b = 378551; unsigned int a = 63689; unsigned int hash = 0; for(std::size_t i = 0; i < str.length(); i++) { hash = hash * a + str[i]; a = a * b; } return hash; } /* End Of RS Hash Function */ unsigned int JSHash(const std::string& str) { unsigned int hash = 1315423911; for(std::size_t i = 0; i < str.length(); i++) { hash ^= ((hash << 5) + str[i] + (hash >> 2)); } return hash; } /* End Of JS Hash Function */ unsigned int PJWHash(const std::string& str) { unsigned int BitsInUnsignedInt = (unsigned int)