哈希表

集合介绍

不羁岁月 提交于 2020-01-11 09:49:08
1 1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据结构是数组,查询快,增删慢 9 线程安全,效率低 10 LinkedList 11 底层数据结构是链表,查询慢,增删快 12 线程不安全,效率高 13 Set(无序,唯一) 14 HashSet 15 底层数据结构是哈希表。 16 哈希表依赖两个方法:hashCode()和equals() 17 执行顺序: 18 首先判断hashCode()值是否相同 19 是:继续执行equals(),看其返回值 20 是true:说明元素重复,不添加 21 是false:就直接添加到集合 22 否:就直接添加到集合 23 最终: 24 自动生成hashCode()和equals()即可 25 26 LinkedHashSet 27 底层数据结构由链表和哈希表组成。 28 由链表保证元素有序。 29 由哈希表保证元素唯一。 30 TreeSet 31 底层数据结构是红黑树。(是一种自平衡的二叉树) 32 如何保证元素唯一性呢? 33 根据比较的返回值是否是0来决定 34 如何保证元素的排序呢? 35 两种方式 36 自然排序(元素具备比较性) 37 让元素所属的类实现Comparable接口 38

设计一个Cache系统 【双向链表+哈希表】

孤人 提交于 2020-01-11 06:15:26
今天去面试,面试官让我设计一个cache系统,要求保证最近使用的数据不能被移除出cache,也就是每次添加一个cache项的时候,把最旧的cache项移除出去。 我只记得操作系统里貌似有个差不多的cache算法,记不起名字来,更别提数据结构了。一开始我执着于用一种数据结构来实现,可是每说出一种,都被面试官指出这种方式的不足。最后终于开窍了,想出了 哈希表+双向链表 的方法。当时也不知道到底对不对,感觉这种实现还过的去吧,查询和增加cache项复杂度都是O(1)。 回来后一查,原来就是LRU(Least Recent Used)算法。好到事实上就是采用了哈希表+双向链表的组合拳法。文末附上一篇别人写的博文。 另外,我发现Java1.4中有一个 LinkedHashMap ,就是哈希表+双链表,有一个removeEldestEntry方法,里面没有实现,override这个方法后很容易实现FIFO的Cache,对其它几个方法也override后想必实现LRU也不难。 http://blog.sina.com.cn/s/blog_567842410100nf1g.html Cache(高速缓存), 一个在计算机中几乎随时接触的概念。CPU中Cache能极大提高存取数据和指令的时间,让整个存储器(Cache+内存)既有Cache的高速度,又能有内存的大容量

LeetCode 1 两数之和(哈希map)

你离开我真会死。 提交于 2020-01-10 13:13:14
1.给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 ****暴力解法:**** vector < int > twoSum ( vector < int > & nums , int target ) { int len = nums . size ( ) ; //vector的容器大小是size() vector < int > result ; //用来存放最后的结果 for ( int i = 0 ; i < len ; i ++ ) //遍历数组,固定一个位置找另一个位置 { int k = target - nums [ i ] ; for ( int j = i + 1 ; j < len ; j ++ ) { if ( nums [ j ] == k ) { result . push_back ( i ) ; result . push_back ( j ) ; } } } return result ; } 暴力法思路很简单,就是固定一个位置i,然后在数组中查找target-nums[i]的位置,找到返回即可 时间复杂度是O(n^2); **哈希解法:** 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说

JAVA基础-集合-10.HashMap介绍

我只是一个虾纸丫 提交于 2020-01-09 23:29:44
1、 HashMap介绍 HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。 HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。 HashMap 的实例有两个参数影响其性能:“ 初始容量 ” 和 “ 加载因子 ”。容量 是哈希表中桶的数量,初始容量 只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。 通常, 默认加载因子是 0.75 , 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。 HashMap的构造函数 HashMap共有

Redis-概述&常用命令

前提是你 提交于 2020-01-08 20:36:38
【Redis】 完全开源免费的数据库,key-value型数据库,遵守BSD协议 Redis三个特点: Redis支持数据的持久化,可以将内存中数据保存进磁盘,重启的时候可以再次加载 Redis不仅仅支持key-value,同时还支持list,set,zset,hash等数据类型存储 Redis支持数据的备份,master-slave模式的数据备份 Redis的优势: 性能极高:读速:110000次/s;写的速度:81000次/s(秒) 丰富的数据类型:string,list,set,zset,hash 原子性:Redis的所有操作都是原子性的 Redis的安装与使用 安装Redis: sudo apt-get install redis-server 启动Redis: redis-server 第一次启动:显示:The server is now ready to access connections on port 6379 服务没有停止情况下:显示:Creating Server TCP listening socket *:6379:bind: Address already in use 执行Redis代码: 新启一个命令窗 本地上直接执行: redis-cli :执行命令 远程执行:redis-cli-h host -p port -a password redis

Map的底层实现原理

走远了吗. 提交于 2020-01-08 09:58:28
一,前言 1.1,概述 ​ 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射(K-V)。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接口。 Collection 中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 Map 中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键(K)可以找对所对应的值(V)。 Collection 中的集合称为单列集合, Map 中的集合称为双列集合。 需要注意的是, Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。 ​ 通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。 HashMap<K,V> :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 LinkedHashMap<K,V> :HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法

深度解密Go语言之map

自作多情 提交于 2020-01-08 08:51:52
目录 什么是 map 为什么要用 map map 的底层如何实现 map 内存模型 创建 map 哈希函数 key 定位过程 map 的两种 get 操作 如何进行扩容 map 的遍历 map 的赋值 map 的删除 map 进阶 可以边遍历边删除吗 key 可以是 float 型吗? 总结 参考资料 这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。 我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门书籍了解。本文的内容比较深入,但是由于我画了各种图,我相信很容易看懂。 什么是 map 维基百科里这样定义 map: In computer science, an associative array, map, symbol table, or dictionary is an abstract data type composed of a collection of (key, value) pairs, such that each possible key appears at most once in the collection. 简单说明一下:在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组 <key, value>

1、两数之和

别说谁变了你拦得住时间么 提交于 2020-01-08 00:59:03
题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 答案: 1)暴力破解,遍历每个元素 x ,并查找后面是否存在一个值与 t a r g e t − x 相等的目标元素。缺点:时间复杂度高 1 class Solution { 2 public int[] twoSum(int[] nums, int target) { 3 for (int i = 0; i < nums.length; i++) { 4 for (int j = i + 1; j < nums.length; j++) { 5 if (nums[j] == target - nums[i]) { 6 return new int[] { i, j }; 7 } 8 } 9 } 10 throw new IllegalArgumentException("No two sum solution"); 11 } 12 } View Code 2)通过循环遍历两次哈希表,第一次添加全部元素

算法初步——哈希表A1041.Be Unique

寵の児 提交于 2020-01-07 16:55:30
#include <bits/stdc++.h> #include<math.h> #include <string> using namespace std; const int MAX_LEN = 10005; int main(){ int n; cin>>n; int temp[MAX_LEN]; for(int i=0;i<MAX_LEN;++i){ temp[i] = 0; } int result[n]; for(int i=0;i<n;++i){ //cin>>temp[i]; int t; cin>>t; temp[t]++; result[i] = t; } int i; for(i =0;i<n;++i){ if(temp[result[i]] == 1){ cout<<result[i]; break; } } if(i == n){ cout<<"None"; } system("pause"); return 0; } 来源: https://www.cnblogs.com/JasonPeng1/p/12162305.html

算法初步——哈希表B1043输出PATest

那年仲夏 提交于 2020-01-07 14:52:06
#include <bits/stdc++.h> #include<math.h> #include <string> using namespace std; const int MAX_LEN = 10005; char str[MAX_LEN]; int hashTable[30] = {0}; int main(){ cin>>str; int len = strlen(str); int count = 0; //map<char,int> result; for(int i =0;i<len;++i){ if(str[i] == 'P' || str[i] == 'A' || str[i] == 'T' || str[i] == 'e' || str[i] == 's' || str[i] == 't'){ count++; } } map<char,int> result; //vector<char> result[count]; for(int i =0;i<len;++i){ if(str[i] == 'P' || str[i] == 'A' || str[i] == 'T' || str[i] == 'e' || str[i] == 's' || str[i] == 't'){ result[str[i]]++; } } map<char,int>: