哈希表

性能调优7:多表连接 - join

三世轮回 提交于 2019-12-06 11:41:05
原文: 性能调优7:多表连接 - join 在产品环境中,往往存在着大量的表连接情景,不管是inner join、outer join、cross join和full join(逻辑连接符号),在内部都会转化为物理连接(Physical Join),SQL Server共有三种物理连接:Nested Loop(嵌套循环),Merge Join(合并连接)和Hash Join(哈希连接)。这三个物理连接的处理方式不同,分别应用在不同的场景中。 在同一时刻,表连接只能是两表(或者是数据集,也就是表的一部分)之间的连接,通常按照表处于Join操作的位置来区分,把Join操作符前面的表叫做左表,把Join操作符后面的表叫做右表。如果有n个表连接,那么必须进行n-1次关联操作,上一次关联操作的结果作为下一次关联操作的一个数据集。On子句用于设置连接条件,可以决定连接的顺序。 一,嵌套循环 嵌套循环是最基本的Join算法,分为两个循环,内部循环和外部循环,内部循环嵌套在外部循环内部。任何一个连接语句,都包含两个表,内部循环对应内部表,外部循环对应外部表。在图形执行计划中,上面的输入表是外部表,下面的输入表是内部表。 在嵌套循环中,外部循环逐行处理外部表,内部循环针对每一个外部行到内部表中进行查找,以找出所有匹配外部行的数据行。外部循环每输出一行,内部表中所有行都会和外部行进行匹配

leetcode.1.两数之和

陌路散爱 提交于 2019-12-06 11:05:47
———————极其个人向的做题记录——————— 哈希表的应用问题。 思路:①将数组nums[i]存入哈希表    ②每次存入的时候查找(target-a[i])是否也在哈希表中且不为nums[i]本身 易错提醒:map.get(key)函数是需要key来查找value的,所以考虑到之后要通过(target-a[i])来查找数组对应的索引是否为i本身,在添加键值对的时候, 格式应为 "map.put(nums[i],i)” 代码: public int[] twoSum(int[] nums, int target) { HashMap<Integer, Integer> map=new HashMap<>(); int a[]= {0,0}; for(int i=0;i<nums.length;i++) { int x=target-nums[i]; if(map.containsKey(x)&&i!=map.get(x)) {//如果存在减数且不为被减数本身 a[0]=i; a[1]=map.get(x); break; }else { map.put(nums[i],i); } } return a; } 结论:遇到本质是快速查找或者查重的问题,可以考虑采用哈希表。 来源: https://www.cnblogs.com/hdrawery/p/11980455.html

【浅析】|白话布隆过滤器BloomFilter

无人久伴 提交于 2019-12-06 10:11:01
通过本文将了解到以下内容: 查找问题的一般思路 布隆过滤器的基本原理 布隆过滤器的典型应用 布隆过滤器的工程实现 场景说明: 本文阐述的场景均为普通单机服务器、并非分布式大数据平台,因为在大数据平台下问题就是另外一种考虑方式了,因此本文只描述贫穷落后一穷二白的场景,俨然有种60年代先辈们在戈壁攻克原子弹的感觉。 1.查找问题的一般思路 查找问题是出现频率极高的问题,来看一道面试题: 给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件所有共同的URL。 一般思路:面对一般的问题,根据不同的数据规模,转换为计算机问题之后就落地到实际的数据结构: 线性结构:数组、链表、 容器结构:集合、Map、HashTable 树形结构:AVL、RBTree、BTree 但是上述的结构都是将待查找数据直接存储,如果是大数据量,这样虽然保证了准确性但是空间消耗会非常大,实际是不可行的。 苛求条件下的思路: 把待查数据进行信息无缺失地压缩 这句话的意思就是:对于公民可以使用身份证来独立唯一表示此个体,而无需太多诸如性别、出生日期、出生地、履历等描述,这种转换就相当于在信息无缺失的情况下,使用更少的特征来表示。还有一个例子就是:文言文往往篇幅很短,翻译为白话文可能很长,所以文言文就可以认为是白话文的信息无缺失压缩。

java 当中的hashcode的作用

久未见 提交于 2019-12-06 08:34:24
以下是关于HashCode的官方文档定义: hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。 hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用hashCode方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 如果根据 equals(Object) 方法,两个对象是相等的, 那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 以下情况不是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调 用 hashCode 方法必定会生成不同的整数结果。 但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。 (这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。) 当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,

哈希 二叉树

故事扮演 提交于 2019-12-06 07:00:49
我们在散列表那节中讲过,散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。而二叉查找树在比较平衡的情况下,插入、删除、查找操作时间复杂度才是 O(logn),相对散列表,好像并没有什么优势,那我们为什么还要用二叉查找树呢? 我认为有下面几个原因: 第一,散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。 第二,散列表扩容耗时很多,而且当遇到散列冲突时,性能不稳定,尽管二叉查找树的性能不稳定,但是在工程中,我们最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。 第三,笼统地来说,尽管散列表的查找等操作的时间复杂度是常量级的,但因为哈希冲突的存在,这个常量不一定比 logn 小,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。 第四,散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩容、缩容等。平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。 最后,为了避免过多的散列冲突,散列表装载因子不能太大,特别是基于开放寻址法解决冲突的散列表,不然会浪费一定的存储空间。 综合这几点

散列表(哈希)

白昼怎懂夜的黑 提交于 2019-12-06 07:00:45
散列表 ( 哈希 ) 简介 简述 散列函数 冲突 开放地址法 链接法(也称链地址法) 链接法对比与开放地址法的优缺点 名词解释 我们来讲述散列表。 散列表是一种数据结构,它具有以下性质: 应用广泛 查找快速 等 举个例子。 你在超市工作,一位顾客来购买商品,你家超市刚刚好没有自动销售机,你得亲自去查找该商品的价格。如果我们是这样的话,那么顾客每买一个商品,都要找一下该商品并且知道它的价格。那么我们非常花费时间。如果我们能够找到这样一个人:能够记住所有商品的价格的人。那么我们在帮顾客结账的时候将会非常快速。 即使你是用一个小本本把你商店的东西都记上了,并且是按照一定的顺序记号的。即使使用二分查找,那么我们也会花费一定的时间。想必此时顾客已经不耐烦了。他们可能会说:“怎么这么久!!!”,然后你的商店可能会产生很多很多的怨气...... 我们从数据结构的方面去看这个问题,那么所有的商品就有了这样的一个特性: 商品的key 以及 商品的 卫星数据 。 如果我们按照一个特殊的函数去把相对应的 KEY 值转换成另一个东西,并且记录在小本子上,我们只需直接翻到这个本子相对应的部分,就可以找到了该商品的价格了,以及还有其他的信息。 ---->BACK<---- 散列函数 那么我们的问题来了,我们该怎样创建这个数据类型呢?首先了解一下,散列函数 散列函数是“将输入映射到数字”

哈希表等概率情况下查找成功和查找不成功的平均查找长度的计算

痴心易碎 提交于 2019-12-06 05:45:19
将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为: H(key) = (keyx3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。 (1) 请画出所构造的散列表。 (2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。 Ans: (1).首先明确一个概念装载因子,装载因子是指所有关键子填充哈希表后饱和的程度,它等于 关键字总数/哈希表的长度。 根据题意,我们可以确定哈希表的长度为 L = 7/0.7 = 10;因此此题需要构建的哈希表是下标为0~9的一维数组。根据散列函数可以得到如下散列函数值表。 H(Key) = (keyx3) MOD 7, 例如key=7时, H(7) = (7x3)%7 = 21%7=0,其他关键字同理。 Key 7 8 30 11 18 9 14 H(Key) 0 3 6 5 5 6 0 (表1) 采用线性探测再散列法处理冲突,所构造的散列表为: 地址 0 1 2 3 4 5 6 7 8 9 关键字 7 14 8 11 30 18 9 (表2) 下面对散列表的构造方式加以说明,注意表1中的关键字7和14,30和9, 11和18,这三组关键子的H(Key)值相同,这在构建散列表时就会产生冲突,因为他们的地址相同

求哈希表失败查找长度

一个人想着一个人 提交于 2019-12-06 05:45:07
下面看下2010年2010年全国硕士研究生入学统一考试计算机科学与技术学科联考计算机学科专业基础综合试题中一个考哈希表的题。 Question1: 将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中。散列表的存储空间是一个下标从0开始的一维数组,散列函数为: H(key) = (keyx3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。 (1) 请画出所构造的散列表。 (2) 分别计算等概率情况下查找成功和查找不成功的平均查找长度。 Ans: (1).首先明确一个概念装载因子,装载因子是指所有关键子填充哈希表后饱和的程度,它等于 关键字总数/哈希表的长度。 根据题意,我们可以确定哈希表的长度为 L = 7/0.7 = 10;因此此题需要构建的哈希表是下标为0~9的一维数组。根据散列函数可以得到如下散列函数值表。 H(Key) = (keyx3) MOD 7, 例如key=7时, H(7) = (7x3)%7 = 21%7=0,其他关键字同理。 Key 7 8 30 11 18 9 14 H(Key) 0 3 6 5 5 6 0 (表1) 采用线性探测再散列法处理冲突,所构造的散列表为: 地址 0 1 2 3 4 5 6 7 8 9 关键字 7 14 8 11 30 18 9 (表2) 下面对散列表的构造方式加以说明

哈希表解决字符串问题

柔情痞子 提交于 2019-12-06 05:40:21
题目5:无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 方法一: //思路:控制区间的所有元素没有重复,使用哈希表来判断。每次重复的时候清空 //哈希表 class Solution { public: int lengthOfLongestSubstring(string s) { int len = s.size(); int hashmap[256] = {0}; int flag = 0; int current = 0; int result = current; int i=0; for(i=0;i<len;i++) { if(hashmap[s[i]] != 0) { //这个子串有重复 current = i-flag; if (result < current) result = current; /

同构字符串

拜拜、爱过 提交于 2019-12-06 04:26:05
Leetcode上原题如下: 给定两个字符串 s 和 t,判断它们是否是同构的。 如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。 第一种思路:哈希表 建立两个字符串中字母的映射。由于题目要求两个字符不能映射到同一个字符上,因此,建立两个哈希表,前一个哈希表的键值对和后一个哈希表的键值对刚好相反。 public boolean isIsomorphic(String s, String t){ if(s.length() != t.length()){ return false; } Map<Character,Character> map = new HashMap<>(); Map<Character,Character> antiMap = new HashMap<>(); int len = s.length(); for(int i = 0; i < len; i++){ char c = s.charAt(i); char r = t.charAt(i); if(map.containsKey(c)){ char value = map.get(c); if(value != r){ return false; } }else{ if