红黑树

查询set、dict、dict.keys()的速度对比

混江龙づ霸主 提交于 2020-03-31 03:20:37
查找效率:set>dict>list 单次查询中: list set dict O(n) set做了去重, 本质应该一颗红黑树 (猜测,STL就是红黑树), 复杂度 O(logn); dict类似对key进行了hash,然后再对hash生成一个红黑树进行查找, 其查找复杂其实是O(logn),并不是所谓的O(1)。 O(1)只是理想的实现, 实际上很多hash的实现是进行了离散化的。 dict比set多了一步hash的 过程,so 它比set慢,不过差别不大。 那么为什么dict.keys()查询速度比另外dict,set慢很多呢?这就要对比list、dict、set三种的数据结构了。 [1]dict.keys()实际上是list(keys),是dict的所有key组成的list。查找一个元素是否在list中是以list的下标为索引遍历list. [2]而查询是否在dict中,是将key以hash值的形式直接找到key对应的索引,根据索引可直接访问value。对量大的dict查询,自然是后者快很多。 [3]而set和dict的存储原理基本是一样的,唯一不同的是,set没有value,只有key。对查询key是否在dict或sset内,效果基本上是一样的。 由此,可以得出,如果存储的数据会被反复查询,且量大,那么, 尽量不要用list,尽量用dict,如果元素不重复,用set更好。

Java集合类——Set、List、Map、Queue接口

旧街凉风 提交于 2020-03-29 20:23:42
目录 Java 集合类的基本概念 Java 集合类的层次关系 Java 集合类的应用场景 一. Java集合类的基本概念 在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定且不可变,如果我们需要保存一个动态增长的数据(其数量不确定),Java集合类可以很好实现。 集合类又称为容器类。所有的集合类都位于 java.util 包下,为了处理多线程环境下的并发安全问题,在 java.util.concurrent 包下提供了一些多线程支持的集合类。 Java集合类可分为两大类: 1)Collection : 1.1)List必须保持元素特定的顺序 1.2)Set不能有重复元素 1.3)Queue保持一个队列(先进先出)的顺序 2)Map : 保存的是一组 “键值对” 对象 (key-value对) 【虚线箭头表示实现关系,实线箭头表示继承关系】 二. Java集合类的层次关系 1. Iterable<T> 接口 java.lang 下的 Interface Iterable<T> 迭代器接口,是Collecton接口的父接口,包括 default void forEach() 方法 Iterator<T> iterator() 方法 【Iterator<T> 是java.util 下的接口】 实现这个Iterable接口的对象允许使用foreach进行遍历

校招准备-数据结构与算法

落爺英雄遲暮 提交于 2020-03-28 06:29:54
校招中最基础的一环,笔试与白板撸算法 CS中最基本的能力,这方面的准备十分必要,但是准备过程必定十分痛苦 虽常言道水滴石穿,但是多少小河小溪在石穿之前干涸! ----------------------------------- 每天2-3道算法题,完不成就晚上加班 ----------------------------------- 一次总计花一个小时时间学习: 1.找到对应知识点,梳理一遍,弄清楚难点 2.刷15-20分钟小题,来检测自己这块的掌握情况 3.刷20-30分钟对应的算法题 ---------------------------------------------- 结合算法导论,啊哈算法,王道数据结构等书籍; 数据结构(结合c,java与python语言) 1-线性表:链表的各种操作( 双链表的插入,删除 手写 );java中的应用; (6.7 链表,牛客做题) 关于删除链表节点:先解决当前节点后面的,再解决前面的 栈:定义,基本操作(初始化,判断为空,进栈,出栈,读栈顶元素,),顺序栈和链栈;应用 1-队列:定义,基本操作(初始化,判断为空,入队,出队,),顺序存储和链式存储,双端队列;应用 数组与矩阵:数组的各种基本操作,矩阵的压缩存储 1-字符串:字符串的基本操作与实现 堆:定义与基本操作,应用 1-树:二叉树的定义,基本性质,顺序存储,链式存储

为什么数据库用b+树不用b树和红黑树

偶尔善良 提交于 2020-03-27 02:54:40
前几天面试被问到了,没答好,记录一下: 首先说红黑树为什么不行: 1.红黑树必须存在内存里的,数据库表太大了,存不进去。 2.即使你找到了把红黑树存进硬盘的方法,红黑树查找一个节点最多要查logN层,每一层都是一个内存页(虽然你只是想找一个节点,但硬盘必须一次读一个页。。),那么一共logN次IO,伤不起阿! 所以我们必须考虑减少树的层数来减少IO次数从而加快查询、修改数据库效率,b和b+树都符合这样的性质,它们每个节点的孩子都很多(几十~几千),所以整个树的高度可以压的很低。 比如100000000数据,每个节点有1000个孩子,那么log 1000(100000000)<3,3层就足够存了! 先讲下b树和b+树的区别: b树的所有节点都是数据节点,但b+树只有叶子节点是数据节点,非叶子(内部)节点只起导向作用,不存储实际数据。 b+树的所有数据节点都在最下层(叶子节点层),相邻节点有链表相连。 注意磁盘读数据读一个字节和读10个字节和读一页时间相差不大的(因为磁盘查找时间大多数都花在寻道上,旋转基本不费时) 再说b树为什么不如b+树: 1.b树的内部节点都是存储实际数据的,比如一个节点是一个页4096字节,其中每条数据128字节,那么一个节点只能存32个数据项,那么对应的孩子节点数最多为33个,这显然不够用。而b+树内部节点只作为导向作用,只存一个整数就可以,4096/4

疯狂游戏 一面3.26

坚强是说给别人听的谎言 提交于 2020-03-26 21:10:40
1.自我介绍 2.对做疯狂游戏感兴趣吗 3.C++中有两个类A,B,B继承A类,A类有一个虚方法f(),B类也有一个方法f(),可以A *a=new B吗,反过来可以吗? 4.用A类指针调用f()方法,用的是A的还是B的?这是什么特性? 5.可以调用A的f()方法吗?怎么调用? 6.虚函数实现原理。 7.析构函数的作用,什么情况下必须定义。 8.拷贝构造函数的作用。 9.指针和引用的区别。 10.堆和栈的区别。 11.vector和map的区别。 12.一堆对象,每个对象有一个时间(是有序的),每次修改后要求重新排序,怎么样才是最优的?(首先答了插入排序,后来说红黑树) 13.红黑树的插入,查找的复杂度。 14.排序算法有哪些?(这种情况下当仁不让把希尔排序拉出来) 15.TCP和UDP区别 16.有没有一种机制,可以保证udp可靠传输?(见过,不会) 17.给你一堆资源和一些线程,怎么样保证不发生死锁。 18.有没有一种简单的方法。 19.后面聊天了,问了公司技术,面试官问我想不想做前端(狗头保命) 来源: https://www.cnblogs.com/Carits/p/12576944.html

ConcurrentHashMap(1.8) 相关整理

天涯浪子 提交于 2020-03-26 15:03:22
1. ConcurrentHashMap 1.1 HaspMap(JDK 1.8) JDK 1.8 HashMap JDK 1.8 对 HashMap 进行了修改, 最大的不同就是利用了红黑树,其由数组+链表+红黑树组成 。 JDK 1.7 中,查找元素时,根据 hash 值能够快速定位到数组的具体下标,但之后需要顺着链表依次比较才能查找到需要的元素,时间复杂度取决于链表的长度,为 O(N) 。 为了降低这部分的开销,在 JDK 1.8 中,当链表中的元素超过 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN) 。 JDK 1.8 使用 Node(1.7 为 Entry) 作为链表的数据结点,仍然包含 key,value,hash 和 next 四个属性。 红黑树的情况使用的是 TreeNode。 根据数组元素中,第一个结点数据类型是 Node 还是 TreeNode 可以判断该位置下是链表还是红黑树。 核心成员变量于 1.7 类似,增加了核心变量,如下表。 属性 说明 TREEIFY_THRESHOLD 用于判断是否需要将链表转换为红黑树的阈值,默认为 8。 put 方法过程 public V put(K key, V value) { return putVal(hash(key), key, value, false, true);

day03 【List、Set、数据结构、Collections】

。_饼干妹妹 提交于 2020-03-26 01:56:35
day03 【List、Set、数据结构、Collections】 主要内容 数据结构 List集合 Set集合 Collections 教学目标 [ ] 能够说出List集合特点 [ ] 能够说出常见的数据结构 [ ] 能够说出数组结构特点 [ ] 能够说出栈结构特点 [ ] 能够说出队列结构特点 [ ] 能够说出单向链表结构特点 [ ] 能够说出Set集合的特点 [ ] 能够说出哈希表的特点 [ ] 使用HashSet集合存储自定义元素 [ ] 能够说出可变参数的格式 [ ] 能够使用集合工具类 [ ] 能够使用Comparator比较器进行排序 第一章 数据结构 2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。 现实世界的存储,我们使用的工具和建模。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。 我们java是面向对象的语言,就好似自动档轿车,C语言好似手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A点 开到 B点

说说红黑树——不谈操作,只讲理解

旧巷老猫 提交于 2020-03-24 05:21:41
一、前言   这几天想学一学红黑树这种数据结构,于是上网找了很多篇博客,初看吓了一跳,红黑树竟然如此复杂。连续看了几篇博客后,算是对红黑树有了一些了解,但是它的原理却并不是特别理解。网上的博客,千篇一律的都是在叙述红黑树的操作,如何插入节点、删除节点,旋转、变色等,只关注如何正确构建一棵红黑树,但是却很少提及为什么这么做。这篇博客我就来记录一些我所知道的红黑树中比较重要的东西,以及谈一谈我的理解。   我不会描述红黑树的具体实现,因为阅读红黑树具体实现的过程中,我发现这真的不是很重要,没有太大的意义(这绝对不是自我安慰⊙﹏⊙∥),真正重要的是红黑树的思想。如果想要了解红黑树的具体实现,建议阅读这篇文章: https://mp.weixin.qq.com/s/hGHJonK999TAVJakPDNAkg 二、正文   2.1 二叉搜索树和平衡二叉树   在谈二叉红黑树之前,先来说一说二叉搜索树以及平衡二叉树,因为平衡二叉树是为了弥补二叉搜索树而发明出来的,而红黑树又是为了弥补平衡二叉树。   (1)二叉搜索树   二叉搜索树比较简单,它是一棵二叉树,而且满足这样一个性质: 对于树上的每一个节点,它左子树上的节点的值都比它小,而右子树上的节点的值都比它大 。如下,就是一棵二叉搜索树:   当我们需要往一棵二叉搜索树中插入节点时,只需要从根节点开始,依次比较,若比根节点小,则向左走

TreeMap实现原理

冷暖自知 提交于 2020-03-23 19:57:56
3 月,跳不动了?>>> 在用TreeMap之前我们要对TreeMap有个整体的认识。 1、TreeMap介绍 TreeMap是一个通过红黑树实现有序的key-value集合。 TreeMap继承AbstractMap,也即实现了Map,它是一个Map集合 TreeMap实现了NavigableMap接口,它支持一系列的导航方法, TreeMap实现了Cloneable接口,它可以被克隆 TreeMap introduction:A Red-Black tree based NavigableMap implementation. The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used. This implementation provides guaranteed log(n) time cost for the containsKey, get, put and remove operations. Algorithms are adaptations of those in Cormen, Leiserson, and

TreeMap实现原理

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-23 19:42:56
3 月,跳不动了?>>> 在用TreeMap之前我们要对TreeMap有个整体的认识。 1、TreeMap介绍 TreeMap是一个通过红黑树实现有序的key-value集合。 TreeMap继承AbstractMap,也即实现了Map,它是一个Map集合 TreeMap实现了NavigableMap接口,它支持一系列的导航方法, TreeMap实现了Cloneable接口,它可以被克隆 TreeMap introduction:A Red-Black tree based NavigableMap implementation. The map is sorted according to the natural ordering of its keys, or by a Comparator provided at map creation time, depending on which constructor is used. This implementation provides guaranteed log(n) time cost for the containsKey, get, put and remove operations. Algorithms are adaptations of those in Cormen, Leiserson, and