哈希表

阶段总结(三)——为什么有了散列表我们还需要二叉树

南笙酒味 提交于 2020-03-04 05:17:40
二叉查找树最大的特点就是,支持动态数据集合的快速插入、删除、查找操作。 散列表也是支持这些操作的,而且散列表的这些操作比二叉查找树更高效,时间复杂度是 O(1)。 既然散列表如此高效,那么散列表是不是可以完全替代二叉树呢。 或者说有没有什么地方用散列表是做不了的,必须用二叉树呢? 散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。 而二叉查找树在比较平衡的情况下,插入、删除、查找操作时间复杂度才是 O(logn)。 但是为什么我们不能完全用散列表去替代二叉树呢? 一 散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。 而对于二叉查找树来说,我们只需要中序遍历,就可以在 O(n) 的时间复杂度内,输出有序的数据序列。 二 散列表扩容耗时很多,而且当遇到散列冲突时,性能不稳定。 尽管二叉查找树的性能也不稳定,但是在工程中,最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。 三 尽管散列表的查找等操作的时间复杂度是常量级的,但因为哈希冲突的存在,这个常量不一定比 logn 小,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。 四 散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩容、缩容等。

redis

允我心安 提交于 2020-03-03 16:47:32
概述: redis是一款开源的高性能键值对非关系数据库 支持的键值类型:   1.字符串类型 String   2.哈希类型 hash   3.列表类型 list   4.集合类型 set   5.有序集合类型 sortedset 应用场景:    缓存(数据查询,短连接,新闻内容,商品内容等等)   聊天室的在线好友列表   应用排行榜   网站访问统计   数据过期处理   分布式集群架构中的session分离 下载安装:    推荐使用中文网的资源,下载快: https://www.redis.net.cn/    解压可直接使用 来源: https://www.cnblogs.com/jasonjson/p/12402763.html

NOIP需要掌握的内容(大致

旧街凉风 提交于 2020-03-02 11:41:13
1、 排序算法(快排、选择、冒泡、堆排序、 二叉排序树 、桶排序) 2、 DFS/BFS 剪枝 哈希表 3、树 ① 遍历 ② 二叉树 ③二叉排序树(查找、生成、删除) ④堆(二叉堆、左偏树、堆排序) ⑤Trie树 4、图(图论建模) ① 最小生成树 ② 最短路径 ③计算图的传递闭包 ④ 连通分量(其中要掌握并查集技术) 强连通分量tarjin ⑤ 拓扑排序 、关键路径 ⑥哈密尔顿环 ⑦ 欧拉回路 (USACO 3.3 题1 Fence) ⑧ Bell-man Ford、SPFA(能解决负权回路) (USACO 3.2 题6 Butter) ⑨二分图(匈牙利算法)(USACO 4.2 题2 stall) 5、动态规划(背包问题只是其中一种) ① 线性动规 ② 区间动规 ③ 树形动规 ④图形动规 6、 分治 (掌握了动规分治就好学了) 7、 贪心 8、 位运算 (可以用来进行优化) 来源: https://www.cnblogs.com/GldHkkowo/p/8710834.html

HashTable源码解析

回眸只為那壹抹淺笑 提交于 2020-03-02 10:32:00
Hashtable 简介 和HashMap一样,Hashtable 也是一个 散列表 ,它存储的内容是 键值对(key-value)映射 。 Hashtable 继承于Dictionary ,实现了Map、Cloneable、java.io.Serializable接口。 Hashtable 的函数都是 同步的 ,这意味着它是线程安全的。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。 此类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。 为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。 Hashtable 的实例有两个参数影响其性能: 初始容量 和 加载因子 。容量 是哈希表中桶 的数量,初始容量 就是哈希表创建时的容量。 注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。 加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。 关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。 通常, 默认加载因子是 0.75 , 这是在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销, 但同时也增加了查找某个条目的时间

169-求众数

烈酒焚心 提交于 2020-03-02 08:10:28
思路一:数组按序排列,中间的数肯定是出现次数大于n/2的数 仔细推理一下就可以得出规律 思路二:哈希表 (map) 哈希表相关知识点解释:哈希表简单来说就是建立key到value的映射。 就题而言就是数组的数值(key )与数值在数组中出现的次数(value)的映射 C++中用map<int,int>即可简单建立一个哈希表。 1 class Solution { 2 public: 3 int majorityElement(vector<int>& nums) { 4 map<int,int> m; 5 for(int i=0;i<nums.size();i++) 6 { 7 m[nums[i]]=0; //初始化 8 } 9 for(int i=0;i<nums.size();i++) 10 { 11 m[nums[i]]++; 12 if(m[nums[i]]>nums.size()/2) 13 { 14 return nums[i]; 15 } 16 } 17 return -1; 18 19 20 } 21 }; View Code 来源: https://www.cnblogs.com/nxnslc-blog/p/12393714.html

集合

不问归期 提交于 2020-03-01 20:08:17
1.为什么单向链表查询效率较低? 因为单向链表中的每个元素在空间的存储位置上没有规律,也没有顺序,那么在查找某个元素的时候必须从头节点挨着往后找,直到找到为止。 2.为什么单向链表的增到效率较高? 因为链表每个元素存储的空间是是没有顺序的,删除或者添加某个元素,只需要让指针重新指向即可。不需要其他元素位移。 關於collection集合中的方法 boolean add(object element);向集合中添加元素 void clear();清空集合 boolean contains(object o);判断集合中是否包含某个元素 boolean isEmpty();判断集合中是否有元素 Iteratoriterator();获取集合所依赖的迭代器对象 boolean romove(object o);删除集合中某个元素 int size();获取集合中元素的个数 object[]toArray();将集合转换为数组 contains方法底层调用的是equals方法,如果equals返回true就是包含。 关于Map集合中常用的方法 void clear() ;清空Map Map boolean containsKey (object key) ;判断Map中是否包含这样的key. boolean containsvalue (object value)

Java编程的逻辑 (55) - 容器类总结

放肆的年华 提交于 2020-03-01 18:57:52
从38节到54节,我们介绍了多种容器类,本节进行简要总结,我们主要从三个角度进行总结: 用法和特点 数据结构和算法 设计思维和模式 用法和特点 我们在52节展示过一张图,其中包含了容器类主要的接口和类,我们还是用这个图总结一下: 容器类有两个根接口,分别是Collection和Map,Collection表示单个元素的集合,Map表示键值对的集合。 Collection表示的数据集合有基本的增、删、查、遍历等方法,但没有定义元素间的顺序或位置,也没有规定是否有重复元素。 List是Collection的子接口,表示有顺序或位置的数据集合,增加了根据索引位置进行操作的方法。它有两个主要的实现类,ArrayList和LinkedList,ArrayList基于数组实现,LinkedList基于链表实现,ArrayList的随机访问效率很高,但从中间插入和删除元素需要移动元素,效率比较低,LinkedList则正好相反,随机访问效率比较低,但增删元素只需要调整邻近节点的链接。 Set也是Collection的子接口,它没有增加新的方法,但保证不含重复元素。它有两个主要的实现类,HashSet和TreeSet,HashSet基于哈希表实现,要求键重写hashCode方法,效率更高,但元素间没有顺序,TreeSet基于排序二叉树实现,元素按比较有序,元素需要实现Comparable接口

Java中equals和hascode之间的关系

懵懂的女人 提交于 2020-03-01 16:16:26
在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题。比如说:Java 的 equals() 和 hashCode() 是远房亲戚吗?像这类灵魂拷问的主题,非常值得深入地研究一下。 另外,我想要告诉大家的是,研究的过程非常的有趣,就好像在迷宫里探宝一样,起初有些不知所措,但经过一番用心的摸索后,不但会找到宝藏,还会有一种茅塞顿开的感觉,非常棒。 对于绝大多数的初级程序员或者说不重视“内功”的老鸟来说,往往停留在“知其然不知其所以然”的层面上——会用,但要说底层的原理,可就只能挠挠头双手一摊一张问号脸了。 很长一段时间内,我,沉默王二也一直处于这种层面上。但我决定改变了,因为“内功”就好像是在打地基,只有把地基打好了,才能盖起经得住考验的高楼大厦。借此机会,我就和大家一起,对“equals() 和 hashCode()”进行一次深入地研究。 equals() 和 hashCode() 是 Java 的超级祖先类 Object 定义的两个重要的方法: public boolean equals (Object obj) public int hashCode () 讲道理,单从方法的定义上来看, equals() 和 hashCode() 这两个方法之间没有任何亲戚关系,远房都够不上资格。但往深处扒拉,它们之间还真的是有千丝万缕的关系。到底是什么关系呢

Redis中hash的理解

自作多情 提交于 2020-03-01 13:08:39
Hash 常用命令: 序号 命令及描述 1 HDEL key field2 [field2] 删除一个或多个哈希表字段 2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。 3 HGET key field 获取存储在哈希表中指定字段的值。 4 HGETALL key 获取在哈希表中指定 key 的所有字段和值 5 HINCRBY key field increment 为哈希表 key 中的指定字段的整数值加上增量 increment 。 6 HINCRBYFLOAT key field increment 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 7 HKEYS key 获取所有哈希表中的字段 8 HLEN key 获取哈希表中字段的数量 9 HMGET key field1 [field2] 获取所有给定字段的值 10 HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。 11 HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。 12 HSETNX key field value 只有在字段 field 不存在时,设置哈希表字段的值。 13 HVALS

Redis数据结构——字典

∥☆過路亽.° 提交于 2020-03-01 04:09:29
除了用来表示数据库之外,字典也是哈希键的底层实现 typedef struct dictEntry { void *key; //键 union { //值 void *val; uint64_t u64; int64_t s64; double d; } v; struct dictEntry *next; //指向下个哈希表节点,形成链表 } dictEntry; typedef struct dictType { unsigned int (*hashFunction)(const void *key); void *(*keyDup)(void *privdata, const void *key); void *(*valDup)(void *privdata, const void *obj); int (*keyCompare)(void *privdata, const void *key1, const void *key2); void (*keyDestructor)(void *privdata, void *key); void (*valDestructor)(void *privdata, void *obj); } dictType; /* This is our hash table structure. Every dictionary has