hash函数

数组、链表、Hash的优缺点

£可爱£侵袭症+ 提交于 2019-11-26 16:57:20
上体育课的时候,老师说:你们站一队,每个人记住自己是第几个,我喊到几,那个人就举手,这就是数组。 老是说,你们每个人记住自己前面的人和后面的人,然后老师只知道第一人是谁。 然后你们各自由活动,老是要找某一个人,是不是每次都是从第一个开始往自己身后的人开始传达?这就是链表。 老师说: 大家1,2,3,4报数,凡是报1,为1队,凡是报2的为2队。。。。 这就是散列(哈希)。而这个4就相当于预定义好的桶的个数。。 程序中,存放指定的数据最常用的数据结构有两种:数组和链表。 数组和链表的区别: 1,数组是将元素在内存中连续存放。 链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。 2,数组必须事先定义固定的长度,不能适应数据动态的增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费; 链表动态地进行存储分配,可以适应数据动态地增减的情况。 3,(静态)数组从栈中分配空间,对于程序员方便快速,但是自由度小; 链表从堆中分配空间,自由度大但是申请管理比较麻烦。 数组和链表在存储数据方面到底谁好?根据数组和链表的特性,分两种情况讨论: 1,当进行数据查询时,数组可以直接通过下标迅速访问数组中的元素。 而链表则需要从第一个元素开始一直找到需要的元素位置, 显然,数组的查询效率会比链表的高。 2,当进行增加或删除元素时,在数组中增加一个元素

Java集合源码分析——ConcrretHashMap(JDK1.8)

耗尽温柔 提交于 2019-11-26 12:44:28
Map集合–ConcurrentHashMap 这篇文章只是我一个菜鸟对ConcurrentHashMap的总结,可能有遗漏甚至有错误的地方,如果有什么理解的不对的地方还烦请各位指出,或者有什么想法,欢迎交流。 我在尝试学习并分析ConcurrentHashMap的时候,在网上搜索的一些资料,但这些资料的质量参差不齐,很多人文章名字赫然写着“一文搞懂ConcurrentHashMap”、“深入浅出…”等,很多这种文章要么停留在总结层面,要么就是简简单单把源码图片贴出来,总之就是看了跟没看没啥区别,还不如自己看呢。咱没那个水平就别出来误人子弟行不行。 在学习的时候,结合了两篇文章,这两篇文章的质量还是很高的,一篇是: https://www.cnblogs.com/study-everyday/p/6430462.html 另一篇。。。由于时间有点久了,又找不着了,文章分析的很是到位,哪天我在历史记录中找到了,一定贴出来! 这应该是常用集合框架中最难的一个了。坐稳,发车!!! 众所周知HashMap是线程不安全的,多线程并发操作时可能出现get方法无限循环,从而导致CPU占满。 同时解决HashMap线程不安全的替代方案有三种: 1、使用Hashtable 2、使用Collections.synchronzedMap(Map<k,V> m)方法生成一个线程安全的HashMap 3

看懂Oracle执行计划

老子叫甜甜 提交于 2019-11-26 12:29:25
一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 二:怎样查看Oracle执行计划? 因为我一直用的PLSQL远程连接的公司数据库,所以这里以PLSQL为例: ①:配置执行计划需要显示的项: 工具 —> 首选项 —> 窗口类型 —> 计划窗口 —> 根据需要配置要显示在执行计划中的列 执行计划的常用列字段解释: 基数(Rows):Oracle估计的当前操作的返回结果集行数 字节(Bytes):执行该步骤后返回的字节数 耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入) 时间(Time):Oracle估计的当前操作所需的时间 ②:打开执行计划: 在SQL窗口执行完一条select语句后按 F5 即可查看刚刚执行的这条查询语句的执行计划 注:在PLSQL中使用SQL命令查看执行计划的话,某些SQL*PLUS命令PLSQL无法支持,比如SET AUTOTRACE ON 三:看懂Oracle执行计划 ①:执行顺序: 根据Operation缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行) 例:上图中 INDEX RANGE SCAN 和 INDEX UNIQUE SCAN 两个动作缩进最多,最上面的 INDEX RANGE SCAN 先执行;

Python字典实现

半腔热情 提交于 2019-11-26 12:10:41
这篇文章描述了在Python中字典是如何实现的。 字典通过键( key )来索引,它可以被看做是关联数组。我们在一个字典中添加3个键/值对: >>> d = {'a': 1, 'b': 2} >>> d['c'] = 3 >>> d {'a': 1, 'b': 2, 'c': 3} 可以这样访问字典值: >>> d['a'] 1 >>> d['b'] 2 >>> d['c'] 3 >>> d['d'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'd' 键'd'不存在,所以抛出了KeyError异常。 哈希表 Python字典是用哈希表( hash table )实现的。哈希表是一个数组,它的索引是对键运用哈希函数( hash function )求得的。哈希函数的作用是将键均匀地分布到数组中,一个好的哈希函数会将冲突(译者注:冲突指不同键经过哈希函数计算得到相同的索引,这样造成索引重复的冲突。)的数量降到最小。Python没有这类哈希函数,它最重要的哈希函数(用于字符串和整数)很常规: >>> map(hash, (0, 1, 2, 3)) [0, 1, 2, 3] >>> map(hash, ("namea", "nameb", "namec", "named"

【题解】Bzoj3916

耗尽温柔 提交于 2019-11-26 10:19:36
字符串 \(Hash\) . 笔者实在太菜了,到现在还没有熟练掌握 \(Hash\) ,就来这里写一篇学习笔记。 \(Description\) 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S. \(Input\) 第一行一个数N,表示U的长度. 第二行一个字符串U,保证U由大写字母组成 \(Output\) 输出一行,若S不存在,输出"NOT POSSIBLE".若S不唯一,输出"NOT UNIQUE".否则输出S. 字符串 \(Hash\) ,可以快速做到字符串匹配。比如,从一个字符串中选择两个子串进行匹配,还是要 \(Hash\) 的。 \(Hash\) 是一种随机算法。我们设计一个 \(Hash\) 函数: 设字符串 \(C=c_1c_2...c_n\) , \(K\) 为字符串的长度(前 \(K\) 个) 选择两个数 \(b,h\) ,满足 \(b<h,\) b \(与\) h$互质。 我们有: \(Hash(C,K)=Hash(C,K-1)*b+c_k\) 所以,我们的复杂度瓶颈就在处理 \(b\) 上了。 对上面的函数拆开来写,就是: 设 \(x=m-1\) , \(Hash(C)=(c_1*b^x+...+c_m*1) mod h\) 预处理 \(b\) 的次幂

海量数据处理学习

五迷三道 提交于 2019-11-26 07:37:48
海量数据处理介绍 所谓海量数据,其实就是数据量比较大处理起来不大方便。举个简单的例子,中国人口13亿,如果需要对这么多人进行出生时间,籍贯,家庭住址等进行存储查找。另外一个例子就是,搜索关键字的排名等。这些问题面临的最大问题就是数据量很大。 海量数据处理主要从时间和空间两个维度来考虑。 * 时间角度: 为了存储数据,必须能够很快的找到空闲空间进行存储;为了查找分析数据,必须能够很快的找到对应的存储空间。也就是说时间复杂度必须足够小。通常必须为 O ( a ∗ l o g N ) //--> 。 * 空间角度:数据量比较大的时候,分而治之,大而化小是唯一的选择之道。因为当数据量比较大时,是不可能将全部数据装载到内存里的,更多的情况是大而化小后,存储在硬盘存储器中。每次只处理一个小文件/小数据。各个击破。 海量数据处理方法 分而治之/Hash映射+Hash统计 + 堆/快速/归并排序 双层桶划分 Bloom filter/Bitmap Trie树/数据库/倒排索引 外排序(Merge sort) 分布式处理之hadoop/mapreduce 海量数据例子和应用 方法一、分而治之/hash映射 + hash统计 + 堆/快速/归并排序 海量日志数据,比如某天访问某网站最多次的IP地址 (1). 分而治之/Hash映射。内存的大小是有限的

simhash的py实现

流过昼夜 提交于 2019-11-26 05:26:51
前言: 这篇博客主要从python(3)代码的角度来讲本人是如何实现simhash的,不足之处还望大家不吝赐教。simhash的算法原理大家可以参考 简单易懂讲解simhash算法 。值得一提的是文中提到simhash对长文本更加有效,个人从算法原理角度思考过后感觉也是如此。 初始化 首先我们要明确我们需要的是什么,给定了一个大语料,我们希望得到的是每个词的编码以及对应的权重,那么我们可以将目标拆分为以下几个: 1.对文本进行分词,并根据需要进行停词处理。 2.对每个词进行hash编码(一般用32位的就够了)。 3.对每个词赋予权重,这里正好就能用idf的值作为其权重值,idf具体介绍可见 tf-idf进行关键词提取 说了这么多,还是用代码来看看具体是怎么做到的吧~ 分词 一上来就是最让人头疼的问题,如何进行分词,分词的相关理论也是种类繁多,能够成一个专题,这里大家有兴趣的可以自行去查阅相关资料,我在这里使用的是jieba分词,jieba是一个功能强大的分词工具,大家可以参考博客 好玩的分词–jieba模块的的基本用法 ,分词完毕后我将其保存为新的txt(test_ws.txt),之后我们载入的文本文件便是分词过后的文件了。 hash编码和idf值计算 # -*- coding:utf-8 -*- import numpy as np import codecs import

STL hash function的模板特化

落爺英雄遲暮 提交于 2019-11-25 23:42:52
哈希函数的作用是将一个值映射为一个哈希值,从而根据这个哈希值,在哈希表中对数据进行定位。 template <class _Val, class _Key, class _HashFcn, class _ExtractKey, class _EqualKey, class _Alloc = alloc> class hashtable; STL中定义的hashtable容器包含哈希函数模板参数_HashFcn。_HashFcn既然是一个类类型,又能提供函数的功能,因此是一种仿函数(functor); 仿函数是一个类,在类中重载()运算符,从而由仿函数类对象即可实现函数功能。 在SGI-STL中的stl_hash_fun.h中定义了若干仿函数类: #ifndef __SGI_STL_HASH_FUN_H #define __SGI_STL_HASH_FUN_H #include <stddef.h> __STL_BEGIN_NAMESPACE template <class _Key> struct hash { }; inline size_t __stl_hash_string(const char* __s) { unsigned long __h = 0; for ( ; *__s; ++__s) __h = 5*__h + *__s; return size_t(__h);

HashMap原理详解

痞子三分冷 提交于 2019-11-25 18:52:51
本文的源码基于jdk8版本,讲一下hashMap的核心基本和重难点知识 概述 一、构造函数 二、put操作 1. hash函数 2. 数组下标计算 3. 操作步骤 总结 三、扩容操作 resize jdk1.8的扩容操作 如何避免并发问题导致链表转移行程环 jdk1.7 扩容并发问题分析 五、红黑树 红黑树特性 左旋和右旋 红黑树和平衡二叉树对比 总结 概述 hashMap的数据结构是 数组+链表+红黑树 数组查找速度快 链表插入和删除速度比较快 链表什么时候变成变成红黑树 HashMap就是使用哈希表来存储的。哈希表为解决冲突,可以采用开放地址法和链地址法等来解决问题,Java中HashMap采用了链地址法。链地址法,简单来说,就是数组加链表的结合 节点数大于等于8,并且容量大于64才会把单向链表转换成红黑树 为了优化查找性能, 链表转变成红黑树, 以将 o(n)复杂度的查找效率提升至o(log n) // 1. 如果链表长度大于等于8 if (binCount >= TREEIFY_THRESHOLD - 1) { treeifyBin(tab, hash); break; } final void treeifyBin(Node<K,V>[] tab, int hash) { int n, index; Node<K,V> e; // 2. 如果容量小于64 进行扩容操作