哈希表

MySQL索引 - 索引的类型

橙三吉。 提交于 2020-02-02 12:15:08
索引的类型 B-Tree索引 B-Tree 索引 通常意味着所有的值都是 按顺序存储 的,并且每一个叶子页到根的距离相同。 B-Tree 索引 能够 加快访问数据的速度 ,存储引擎 不再需要进行全表扫描 来获取需要的数据,取而代之的是 从索引的根节点开始搜索 。 B-Tree 索引 适用于全键值、键值范围或键前缀查找( 最左前缀原则 )。 哈希索引 哈希索引 基于哈希表实现,只有 精确匹配索引 所有列的查询才有效。 哈希索引 是Memory引擎表的默认索引类型,但Memory同时也支持B-Tree索引。 哈希索引 自身 只需存储对应的哈希值和行指针 ,而 不存储字段值 ,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。 哈希索引 数据并不是按照索引值顺序存储的,所以 无法用于排序 。 哈希索引 不支持部分索引列匹配查找 ,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如数据列(A,B)上建立索引,如果查询只有数据列A,则无法使用该索引。 哈希索引 不支持任何范围查询 ,如WHERE score > 60。 哈希索引 只支持等值比较查询 ,包括=、IN()、<=>(注意<>和<=>是不同的操作)。 介绍一个 使用场景 :如需要存储大量的URL,并需要根据URL进行搜索查找。如果使用B-Tree来存储URL,存储的内容就会非常大,因为URL本身很长。 创建表 1

哈希表查找不成功时的平均查找长度计算和查找成功时的ASL

断了今生、忘了曾经 提交于 2020-02-02 06:41:30
哈希表查找不成功时的平均查找长度计算和查找成功时的ASL 例如: 关键字集合 { 19, 01, 23, 14, 55, 68, 11, 82, 36 } 设定哈希函数 H(key) = key MOD 11 ( 表长=11 ) 查找成功次数: 1 1 2 1 3 6 2 5 1 查找不成功次数:10 9 8 7 6 5 4 3 2 1 1 查找成功时的平均查找长度:ASL=(1+1+2+1+3+6+2+5+1)/9=22/9 查找不成功时的平均查找长度:ASL=(10+9+8+7+6+5+4+3+2+1+1)/11=56/11 说明: 第n个位置不成功时的比较次数为,第n个位置到第1个没有数据位置的距离。 如:第0个位置到第1个没有数据位置(9)的距离为10! 来源: CSDN 作者: zhupengqq1 链接: https://blog.csdn.net/zhupengqq1/article/details/104130266

给定一个大小为 n 的数组,找到数组众数。

痴心易碎 提交于 2020-02-02 05:01:24
方法一: 哈希表法通过管理一个哈希表来记录数组每一个元素出现的次数,然后遍历哈希表即可求出众数。 int majorityElement ( vector < int > & nums ) { map < int , int > m_mapNums ; for ( int i = 0 ; i < nums . size ( ) ; i ++ ) { if ( m_mapNums . count ( nums [ i ] ) ) { m_mapNums [ nums [ i ] ] ++ ; } else { m_mapNums . insert ( pair < int , int > ( nums [ i ] , 1 ) ) ; } } int m_iOutPos = 0 ; int m_iOut = 0 ; for ( map < int , int > :: iterator iter = m_mapNums . begin ( ) ; iter != m_mapNums . end ( ) ; iter ++ ) { if ( m_iOutPos < iter - > second ) { m_iOutPos = iter - > second ; m_iOut = iter - > first ; } } return m_iOut ; } 方法二: Boyer

数据结构 - 布隆过滤器(Bloom Filter)

谁都会走 提交于 2020-02-01 22:45:50
思考 如果要经常判断1个元素是否存在,你会怎么做? 很容易想到使用哈希表(HashSet、HashMap),将元素作为key去查找 时间复杂度:O(1),但是空间利用率不高,需要占用比较多的内存资源 如果需要编写一个网络爬虫去爬10亿个网站数据,为了避免爬到重复的网站,如何判断某个网站是否爬过? 很显然,HashSet、HashMap并不是非常好的选择 是否存在时间复杂度低、占用内存较少的方案? 布隆过滤器(Boolm Filter) 1970年由布隆提出 它是一个空间效率高的概率型数据结构,可以用来告诉你:一个元素一定不存在或者可能存在 优缺点 优点:空间效率和查询时间都远远超过一般的算法 缺点:有一定的误判率、删除困难 它实质上是一个很长的二进制向量和一系列随机映射函数(Hash函数) 常见应用 网页黑名单系统、垃圾邮件过滤系统、爬虫的网站判重系统、解决缓存穿透问题 原理 假设布隆过滤器由20位二进制、3个哈希函数组成,每个元素经过哈希函数处理都能生成一个索引位置 添加元素:将每一个哈希函数生成的索引位置都设为1 查询元素是否存在 如果一个哈希函数生成的索引位置不为1,就代表不存在(100%准确) 如果一个哈希函数生成的索引位置都为1,就代表存在(存在一定的误判率) 添加、查询的时间复杂度都是:O(k),k是哈希函数的个数。 空间复杂度是:O(m),m是二进制位的个数 误判率

Java提高篇——equals()与hashCode()方法详解

末鹿安然 提交于 2020-02-01 13:16:32
阅读目录 equals()方法详解 hashcode() 方法详解 Hashset、Hashmap、Hashtable与hashcode()和Equals()的密切关系 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。 equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。 比如在String类中如下: public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) {

LeetCode Top Interview Questions 387. First Unique Character in a String (Java版; Easy)

此生再无相见时 提交于 2020-01-31 22:16:52
welcome to my blog LeetCode Top Interview Questions 387. First Unique Character in a String (Java版; Easy) 题目描述 Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1. Examples: s = "leetcode" return 0. s = "loveleetcode", return 2. Note: You may assume the string contain only lowercase letters. 第一次做;bit-map记录每个字符出现的次数, 位置信息在原始字符串中; 下面的那个做法在处理位置信息时愚蠢了… class Solution { public int firstUniqChar ( String s ) { if ( s == null || s . length ( ) == 0 ) return - 1 ; // int [ ] arr = new int [ 26 ] ; for ( int i = 0 ; i < s . length ( ) ; i +

Rust macro开发新手入门

北慕城南 提交于 2020-01-31 17:45:50
Rust语言最强大的一个特点就是可以创建和利用宏/Macro。不过创建Rust宏看起来挺复杂,常常令刚接触Rust的开发者心生畏惧。这片文章的目的就是帮助你理解Rust Macro的基本运作原理,学习如何创建自己的Rust宏。 相关链接: 在线学编程 1、什么是Rust的宏/Macro? 如果你尝试过Rust,应该已经用过Rust的宏了: println! 。这个宏可以在终端输出一行文本,并且支持变量的插值。 简单地说,Rust宏让你可以发明自己的语法,编写出可以自行展开的代码,也就是我们通常所说的 元编程 ,你甚至可以用Rust宏来创作自己的DSL。 Rust宏的基本运作机制就是:首先匹配宏规则中定义的模式,然后将匹配结果绑定到变量,最后展开变量替换后的代码。 不理解也没有关系,让我们继续看。 2、如果创建Rust宏/Macro? 可以使用Rust预置的 macro_rules! 宏来创建一个新的Rust宏。 下图展示了如何创建一个空白的Rust宏: hey! ,这个宏什么功能也没有,我们现在只关注它的结构: () => {} 看起来很神秘,因为它不是标准的rust语法,是macro_rules!这个宏自己发明的,用来表示一条宏规则, => 左边是匹配模式,右边是等待展开的代码: 左边的小括号部分是Rust宏的匹配器/Matcher,用来匹配模式并捕捉变量

散列表

霸气de小男生 提交于 2020-01-31 16:41:24
众所周知,散列表是一种十分重要的数据结构,接下来就从各个方面分析下跟散列表相关的问题。主要解决什么是散列表,散列冲突的解决方法, 以及各种方法的优缺点。 概览图: 什么是散列表? 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构,是数组的衍生体。 散列表的用途? 也就是说,散列表通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 如何设计散列函数? 散列函数的基本要求: 散列函数计算得到的散列值是一个非负整数; 如果 key1 = key2,那 hash(key1) == hash(key2); 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2); 函数需要足够简单,复杂的函数,在计算过程中需要消耗过多的cpu资源; 该函数计算结果 需要随机并且分布均匀; 我来解释一下这三点。 其中,第一点理解起来应该没有任何问题。因为数组下标是从 0 开始的,所以散列函数生成的散列值也要是非负整数。 第二点也很好理解。相同的 key

MongoDB的学习--索引类型和属性

时光怂恿深爱的人放手 提交于 2020-01-31 10:36:36
索引类型 MongDB的索引分为以下几种类型:单键索引、复合索引、多键索引、地理空间索引、全文本索引和哈希索引 单键索引(Single Field Indexes) 在一个键上创建的索引就是单键索引,单键索引是最常见的索引,如MongoDB默认创建的_id的索引就是单键索引。 例子: { "_id" : ObjectId(...), "name" : "Alice", "score" : 27 } 如果要在如上的文档中创建单键索引,语句如下: db.users.ensureIndex( { "score" : 1 } ) 其存储结构如下图: 如果想要在子文档的一个键上建立单键索引,其例子如下: { "_id": ObjectId(...), "name": "John Doe", "address": { "street": "Main", "zipcode": "53511", "state": "WI" } } 结构如上,其创建语句如下: db.users.ensureIndex( { "address.zipcode": 1 } ) 如果想要在整个子文档上建立单键索引,其例子如下: { _id: ObjectId(...), metro: { city: "New York", state: "NY" }, name: "Giant Factory" } 结构如上

哈希表

南楼画角 提交于 2020-01-31 10:36:06
模拟散列表 维护一个集合,支持如下几种操作: “I x”,插入一个数x; “Q x”,询问数x是否在集合中出现过; 现在要进行N次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数N,表示操作数量。 接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。 输出格式 对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。 每个结果占一行。 数据范围 1 ≤N≤ 105 − 109 ≤x≤ 109 输入样例: 5 I 1 I 2 I 3 Q 2 Q 5 输出样例: Yes No 代码1(拉链法): # include <iostream> # include <cstring> using namespace std ; const int N = 100003 ; int n ; int h [ N ] , e [ N ] , ne [ N ] , idx ; void insert ( int x ) { int t = ( x % N + N ) % N ; //将余数转化为正数(C++中负数的余数为负数) e [ idx ] = x ; ne [ idx ] = h [ t ] ; h [ t ] = idx ++ ; } bool find ( int x ) { int t = ( x %