哈希表

170. 两数之和 III - 数据结构设计

只谈情不闲聊 提交于 2020-01-03 05:06:11
ID: 170 TITLE: 两数之和 III - 数据结构设计 TAG: Java,Python 方法一: 这是第一题两数之和的后续问题之一,两数之和要求一个返回列表中两个数字的索引,这两个数字的和等于目标值。 我们可以从两数之和中汲取灵感,把所有的输入数字保存在一个列表中。 两数之和的一个解决方法是双指针法,指针从两个方向迭代,互相逼近。 但是,双指针法的前提条件之一是输入列表有序。 现在有几个问题: 函数 add(number) 在列表中插入新数字时,是否应该保证列表有序。 或者在调回 find(value) 时按需进行排序? 我们将在后面的算法部分讨论上述两个问题。 算法: 先给出双指针在有序列表中找到两数之和的算法。 初始化两个指针 low 和 high 分别指向列表的头尾。 从两个方向同时进行迭代,要么找到两数之和的解,要么两个指针相遇。 在每个步骤中,我们将根据不同的条件移动指针: 如果当前指针指向元素的和小于目标值,则应该增加总和来满足目标值,即将 low 指针向前移动获得更大的值。 如果当前指针指向元素的和大于目标值,则应该减少总和来满足目标值,即将 high 向 low 靠近来减少总和。 如果当前指针指向元素的和等于目标值,则直接返回结果。 如果两个指针相交,说明当前列表不存在组合成目标值的两个数。 class TwoSum ( object ) : def _

260. 只出现一次的数字 III

六眼飞鱼酱① 提交于 2020-01-02 23:54:24
ID: 260 TITLE: 只出现一次的数字 III TAG: Java,Python 概述 使用哈希表可以在 O ( N ) \mathcal{O}(N) O ( N ) 的时间复杂度和 O ( N ) \mathcal{O}(N) O ( N ) 的空间复杂度中解决该问题。 这个问题在常数的空间复杂度中解决有点困难,但可以借助两个位掩码来实现。 方法一:哈希表 建立一个值到频率的映射关系的哈希表,返回频率为 1 的数字。 算法: from collections import Counter class Solution : def singleNumber ( self , nums : int ) - > List [ int ] : hashmap = Counter ( nums ) return [ x for x in hashmap if hashmap [ x ] == 1 ] class Solution { public int [ ] singleNumber ( int [ ] nums ) { Map < Integer , Integer > hashmap = new HashMap ( ) ; for ( int n : nums ) hashmap . put ( n , hashmap . getOrDefault ( n , 0 ) +

LeetCode(76): 最小覆盖子串

一世执手 提交于 2020-01-01 23:33:52
Hard! 题目描述: 给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 "" 。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 解题思路: 这道题的要求是要在O(n)的时间度里实现找到这个最小窗口字串,那么暴力搜索Brute Force肯定是不能用的,我们可以考虑 哈希表 ,其中key是T中的字符, value 是该字符出现的 次数 。 - 我们最开始先扫描一遍T,把对应的字符及其出现的次数存到哈希表中。 - 然后开始遍历S,遇到T中的字符,就把对应的哈希表中的value减一,直到包含了T中的所有的字符,纪录一个字串并更新最小字串值。 - 将子窗口的左边界向右移,略掉不在T中的字符,如果某个在T中的字符出现的次数大于哈希表中的value,则也可以跳过该字符。 C++解法一: 1 class Solution { 2 public: 3 string minWindow(string S, string T) { 4 if (T.size() > S.size()) return ""; 5 string res = ""; 6 int left = 0, count = 0,

集合

别来无恙 提交于 2020-01-01 13:07:44
什么是集合 集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list) 和哈希表(hash table)的支持。大多数集合类实现了相同的接口。 集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建Object类的对 象的集合。在C#中,Object类是所有数据类型的基类 常用的集合类 动态数组(Array List) 它代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。 哈希表(Hasht able) 它使用键来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。 什么是哈希表 它使用键来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。 Hashtable类常用的属性 Count获取 Hashtable中包含的键值对个数。 IsFixedSize获取一个值,表示 Hashtable是否具有固定大小。

HashMap、lru、散列表

北战南征 提交于 2020-01-01 10:21:05
HashMap HashMap的数据结构:HashMap实际上是一个数组和链表(“链表散列”)的数据结构。底层就是一个数组结构,数组中的每一项又是一个链表。 hashCode是一个对象的标识,Java中对象的hashCode是一个int类型值。通过hashCode来算出指定数组的索引可以快速定位到要找的对象在数组中的位置,之后再遍历链表找到对应值,理想情况下时间复杂度为O(1),并且不同对象可以拥有相同的hashCode(hash碰撞)。发生碰撞后会把相同hashcode的对象放到同一个链表里,但是在数组大小不变的情况下,存放键值对越多,查找的时间效率也会降低 扩容可以解决该问题,而负载因子决定了什么时候扩容,负载因子是已存键值对的数量和总的数组长度的比值。默认情况下负载因子为0.75,我们可在初始化HashMap的时候自己修改。阀值 = 当前数组长度✖负载因子 hashmap中默认负载因子为0.75,长度默认是16,默认情况下第一次扩容判断阀值是16 ✖ 0.75 = 12;所以第一次存键值对的时候,在存到第13个键值对时就需要扩容了,变成16X2=32。 put流程 对key hash,二次hash,hash扰乱函数,减少hash碰撞 int hash(Object key) { int h = key.hashCode(); return (h ^ (h >>> 16)) &

java 复习之哈希表

梦想与她 提交于 2020-01-01 04:51:07
1.哈希定义 哈希表通过记录关键字为自变量的函数(称为哈希函数)得到访记录的存储地址查找,所以在哈希表中进行查找操作时,须用同一哈希函数计算得到待查询记录的存储地址,然后到相应的存储单元去获得相关信息再判定查找是否成功。 根据设计哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限连限的地址集(区间)上,并以关键字在地址集中的“像”为记录在表中的存储位置,这种表称为哈希表,这一映射过程为哈希造表或散列,所得的存储位置称为哈希地址或散列地址。 冲突定义:对于某个哈希函数H(K)和两个关键字K1和K2,如果K1<>K2,而H(K1)=H(K2),则称为冲突。具有相同哈希函数值的关键字对该哈希函数来说称为同义词。 一般情况,冲突只能尽可能减少而不能完全避免,因为哈希函数是从关键字集合到地址集合映像。通常关键集合比较大,它的元素包含所有可能的关键字,而地址集合的元素仅为哈希表中的地址值。 对于哈希表,主要考虑两个问题:一是如何构造哈希函数,二是如何解决冲突。 2.哈希构造函数 Hash构造即为关键字与哈希地址映射关系建立。 构造哈希函数的原则是:①函数本身便于计算;②计算出来的地址分布均匀,即对任一关键字k,f(k) 对应不同地址的概率相等,目的是尽可能减少冲突。 哈希函数的构造方法很多,常用的有 直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法 等。 3

Redis常见面试题

房东的猫 提交于 2019-12-31 23:44:52
1、什么是Redis?   Redis 是一个基于内存的高性能key-value数据库,不过在系统中一般充当高速缓存的角色。 2、为什么Redis需要把所有数据放到内存中?    访问内存的速度远高于访问硬盘的速度,如果不将数据放在内存中,磁盘I/O速度将严重影响Redis的性能。在内存越来越便宜的今天,Redis将会越来越受欢迎。 3、对Redis的访问为什么是单进程单线程的   Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。Redis的开发者认为Redis的性能瓶颈不在CPU,而是网络等因素。所以采取单线程的方式是最快的。单线程能够有效避免CPU切换的开销,另外I/O多路复用技术也有效的提升了访问速度。 4、Reids的特点(Redis的好处) 访问速度快。原因归结为三个方面:一是数据存储在内存中;二是对数据的访问是单线程操作,避免了不必要的IO开销;三是底层的数据结构合理,类似于hashMap,存取的时间复杂度为O(1)。 拥有丰富数据类型。支持string,list,hash ,set,sorted set五种类型 支持事务。拥有与传统数据库不同的独特的事务特性。在Redis中,一个事务中所有命令操作具有原子性 可以持久化缓存数据。拥有AOF和RDB两种持久化方式,保证系统重启数据不丢失 拥有成熟的可扩展,高可用的分布式解决方案。像Redis

图解数据结构(04) -- 哈希表

左心房为你撑大大i 提交于 2019-12-30 23:08:15
哈希表 1、什么是哈希表 2、哈希函数 哈希函数的实现 3、哈希表的读写操作 写操作(put) 读操作(get) 扩容(resize) 4、总结 1、什么是哈希表 哈希表(hash table),这种数据结构提供了键(Key)和值 (Value)的映射关系;只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近于O(1) 2、哈希函数 散列表在本质上也是一个数组,可是数组只能根据下标,像a[0]、a[1]、a[2]、a[3]、a[4]这样来访问,而散列表的Key则是以字符串类型为主的,例如以学生的学号作为Key,输入002123,查询到李四;或者以单词为Key,输入by,查询到数字46……所以需要一个“中转站”,通过某种方式, 把Key和数组下标进行转换,这个中转站就叫作哈希函数。 哈希函数的实现 以Java的常用集合HashMap为例,来讲解哈希函数在Java中的实现: 在Java及大多数面向对象的语言中,每一个对象都有属于自己的hashcode,这个hashcode是区分不同对象的重要标识,无论对象自身的类型是什么,它们的 hashcode都是一个整型变量。 既然都是整型变量,想要转化成数组的下标简单的转化方式就是按照数组长度进行 取模运算 index = HashCode (Key) % Array.length 通过哈希函数*

HashMap源码

给你一囗甜甜゛ 提交于 2019-12-30 03:07:25
HashMap源码 转载自 https://blog.csdn.net/mar_ljh/article/details/80929093 /* * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.util; import sun.misc.SharedSecrets; import java.io.IOException; import java.io.InvalidObjectException; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; /** *

博客作业05—查找

孤者浪人 提交于 2019-12-30 00:52:52
一:学习总结 1查找结构思维导图 2、查找学习体会 查找这一章,主要介绍的是如何在某种数据结构中找出给定条件的元素。 不同的数据结构中需要不同的算法,我们学习了线性表,数表,和哈希表 的查找。并且学会了在相同数据结构下减少时间复杂度的方法和思想。 二:PTA实验作业 题目1:是否是二叉搜索树 1设计思路 bool IsBST( BinTree T ) { 若T是空树则是二叉搜索树; 中序遍历该树得到的新节点的值一定要大于前一个值,否则不是; 返回真; } 一开始只考虑了左右子树都是二叉搜索树的情况, 但有可能不是这种情况 题目2:二叉搜索树中的最近公共祖先 1设计思路 int LCA( Tree T, int u, int v )//寻找u,v的共同祖先 { 若树为空或者u或v不在该树中 ERROR; 若u或者v就是根节点的值 return T->Key; 若u或者v在同一棵子树上 return T->Key; 若u大于T->key 最近共同祖先在左子树上; 若u大于T->key 最近共同祖先在右子树上; } int find(Tree T,int u)//查看u是否在树中 { 若树为空:则返回0;//不在 查找该树: 若找到等值的key,则u在该树中; 否则不在; } 2代码截图 部分正确:没有考虑到当前节点就是树的公共祖先 和关键字不在书中的情况。 部分正确:无error的输出