红黑树

容器之知识点总结

大城市里の小女人 提交于 2019-11-28 02:00:40
1.List,Set与Map List(有序可重复): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象 Set(无序不重复): 不允许重复的集合。不会有多个元素引用相同的对象。 Map(无序不重复): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复。 2.ArrayList与LinkedList 1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 2. 底层数据结构: Arraylist 底层使用的是 Object 数组 ; LinkedList 底层使用的是 双向链表 数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别!) 3. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话( add(int index, E element) )时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位

malloc和free

耗尽温柔 提交于 2019-11-28 01:35:47
1.系统使用红黑树管理空闲堆空间,malloc是申请了堆一块内存的使用权,拿到了这个钥匙,然后红黑树该块的空闲标记被去除。 2.free后,红黑树重新标记该块内存为空闲,其他程序就可以申请到此块内存。虽然free后,先前的p还存放这块内存的地址,但不能再访问了,因为已经没有了这块内存的使用权,   故free后最好令p=NULL,即让p指向NULL,避免重新误访问已经释放的内存。 来源: https://www.cnblogs.com/aiden-zhang/p/11386029.html

索引:如何在海量数据中快速查找某个数据?

隐身守侯 提交于 2019-11-27 22:17:48
转自: https://blog.csdn.net/every__day/article/details/90763607 《数据结构与算法之美》 前面讲过MySQL数据库索引实现原理,底层是依赖B+树这种数据结构来实现的。那类似Redisp 这要的Key-Value数据库中的索引,又是怎么实现的呢?底层依赖的又是什么数据结构呢? 为什么需要索引? 在实际的软件开发中,业务纷繁复杂,功能千变万化,但是,万变不离其宗。如果抛开业务和功能的外壳,其实它们的本质都可以抽象为“对数据的存储和计算”。对应到数据结构和算法中,那“存储”需要的就是数据结构,“计算”需要的就是算法。 对于存储的需求,功能上无外乎增删改查。这其实并不复杂。但是,一旦存储的数据多了,那性能就成了这些系统要关注的重点,特别是在一些跟存储相关的基础系统(比如MySQL数据库、分布式文件系统等)、中间件(比如消息中间件RocketMQ等)中。 “如何节省存储空间、如何提高数据增删改查的执行效率”,这个问题就成了设计的重点。而这些系统的实现,都离不开一个东西,那就是索引。不夸张的说,索引设计的好坏,直接决定了这些系统是否优秀。 索引这个概念,非常好理解。你可以类比书籍的目录来理解。如果没有目录,我们想要查找某个知识点的时候,就要一页一页的翻。通过目录,我们就可以快速定位相关的知识点的页数,查找的速度也会有质的提高。

红黑树(一) 原理和算法介绍

杀马特。学长 韩版系。学妹 提交于 2019-11-27 22:05:32
一、简介 红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构。 红黑树的特性: (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 (3)每个为空的叶子节点(NIL或NULL)是黑色。 (4)如果一个节点是红色的,则它的子节点必须是黑色的。 (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 注: 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。 红黑树示意图如下: 二、红黑树的应用 红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。 例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。 三、红黑树的时间复杂度和相关证明 红黑树的时间复杂度为: O(lgn) 定理:一棵含有n个节点的红黑树的高度至多为2log(n+1) 下面通过“数学归纳法”对红黑树的时间复杂度进行证明。 证明: "一棵含有n个节点的红黑树的高度至多为2log(n+1)" 的逆否命题是 "高度为h的红黑树,它的包含的内节点个数至少为 2h/2-1个"。 我们只需要证明逆否命题,即可证明原命题为真;即只需证明 "高度为h的红黑树,它的包含的内节点个数至少为 2h/2-1个

HashMap面试总结

不羁岁月 提交于 2019-11-27 21:37:57
作者:孤独烟 出处: http://rjzheng.cnblogs.com/ 修改部分内容 (1) HashMap的实现原理 此题可以分为下面几个小问题来问 • 看过HashMap源码吗,知道原理吗? • 为什么用数组+链表? • hash冲突你还知道哪些解决办法? • 用LinkedList代替数组结构可以么? 看过HashMap源码吗,知道原理吗? HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体。 只是在JDK1.8中,链表长度大于8的时候,链表会转成红黑树。 为什么用数组+链表? 数组是用来确定桶的位置,利用元素的key的hash值对数组长度取模得到. 链表是用来解决hash冲突问题,当出现hash值一样的情形,就在数组上的对应位置形成一条链表。 ps: 这里的hash值并不是指hashcode,而是将hashcode高低十六位异或过的。至于为什么要这么做,继续往下看。 hash冲突你还知道哪些解决办法? 比较出名的有四种 (1)开放定址法 (2)链地址法 (3)再哈希法 (4)公共溢出区域法 HashMap中使用的是链地址法。 用LinkedList代替数组结构可以么? 当然是可以的,稍微说明一下,此题的意思是,源码中是这样的

L2-005. 集合相似度 STL set用法

不羁的心 提交于 2019-11-27 18:57:39
题解:又学到了c++,STL的用法了,在实验室用了两个多小时学习set,stl真的很强大,从用过的map等等体会到了,又get到了set。尽管自己很菜,还是分享一下咯,马上要参加天梯赛了,还是多想学一些东西,感谢网上博主写的博客,受益匪浅。 set概述 和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。 在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。 再稍微说一下迭代器的实现。迭代器是一个对象,vector的迭代器是封装了数组下标;list、map、set的迭代器是封装了元素节点的指针。 还有一点,从数学层面,set的一个集合,好比一个袋子里面装了好多个小球。但是红黑树是一种特殊的二叉搜索树,set中的元素根据其值的大小在红黑树中有特定的位置,是不可移动的。所以,1是search操作效率会很高O(log n)

STL容器Set的使用

放肆的年华 提交于 2019-11-27 18:57:14
首先了解一下set,我们所知道的set是STL中的一个容器,但是set实质上也是有不同的版本,我们最根本的划分就是根据其底层实现分别是红黑树和hash表分为两种,首先这两种结构最本质的区别就是有序和无序,红黑树的存储是有序的而hash表是无序存储,但它并不影响set的最主要的用法就是查找,而从查找角度来说hash表是更优于红黑树,从时间复杂度进行分析,红黑树的时间复杂度为O(logN),而hash表的时间复杂度为O(1)。所以说hash表构建的set更高效。所以在对时间要求比较严格的情况下,可以优先采用hash表构建的set,即unordered_set。 首先学习set的所有接口和使用方法,接口分为默认的成员函数,迭代器,大小和容量,增删查改和一些其他函数。 默认的成员函数 即构造,析构,拷贝构造,赋值运算符等函数,使用方法没有特殊的要求。 迭代器 正向迭代器的使用还是常规意义上的使用方法,但是方向迭代器存在一些问题,按照我们规定反向迭代器从最后一个元素开始,结束应该是第一个元素的前一个,但是 从图上可以看出在调用了反向迭代器之后并没有从最后一个元素开始,而是从正向迭代器的end()的位置开始的,打开头文件可以发现反向迭代器直接调用了正向迭代器,所以在使用时注意。这可能是编译器的差异,但是正确来说反向迭代器应该从最后一个元素开始。 大小和容量 有三个函数,分别是empty()

红黑树【转载】

女生的网名这么多〃 提交于 2019-11-27 12:16:39
红黑树是比较常见的数据结构之一,在Linux内核中的完全公平调度器、高精度计时器、多种语言的函数库(如,Java的TreeMap)等都有使用。 在学习红黑树之前,先来熟悉一下二叉查找树。 二叉查找树(Binary Search Tree) 二叉查找树,它有一个根节点,且每个节点下最多有只能有两个子节点,左子节点的值小于其父节点,右子节点的值大于其父节点。 插入节点 从根节点向下查找,当新插入节点大于比较的节点时,新节点插入到比较节点的右侧,当小于比较的节点时,插入到比较节点的左侧,一直向下比较大小,找到要插入元素的位置并插入元素。 如图: 依次插入节点[100,50,200,80,300,10] 伪代码(来源Java TreeMap,有省略和修改): void put(K key, V value) { if (root == null) { root = new Node<>(key, value, null); return; } Node<K,V> t = root; int cmp; // 比较结果 Node<K,V> parent; Comparable<? super K> k = (Comparable<? super K>) key; do { parent = t; cmp = k.compareTo(t.key); if (cmp < 0) t = t.left

高并发服务器epoll接口、epoll Reactor(反应堆)模型详解

核能气质少年 提交于 2019-11-27 12:14:50
epoll接口是为解决Linux内核处理大量文件描述符而提出的方案。该接口属于Linux下多路I/O复用接口中select/poll的增强。其经常应用于Linux下高并发服务型程序,特别是在大量并发连接中只有少部分连接处于活跃下的情况 (通常是这种情况),在该情况下能显著的提高程序的CPU利用率。 epoll采用的是事件驱动,并且设计的十分高效。在用户空间获取事件时,不需要去遍历被监听描述符集合中所有的文件描述符,而是遍历那些被内核I/O事件异步唤醒之后加入到就绪队列并返回到用户空间的描述符集合。 epoll提供了两种触发模式,水平触发(LT)和边沿触发(ET)。当然,涉及到I/O操作也必然会有阻塞和非阻塞两种方案。目前效率相对较高的是 epoll+ET+非阻塞I/O 模型,在具体情况下应该合理选用当前情形中最优的搭配方案。 接下来的讲解顺序为: (1) epoll接口的一般使用 (2) epoll接口 + 非阻塞 (3) epoll接口 + 非阻塞 + 边沿触发 (4) epoll反应堆模型 (重点,Libevent库的核心思想) 一、epoll接口的基本思想概述 epoll的设计: (1)epoll在Linux内核中构建了一个文件系统,该文件系统采用红黑树来构建,红黑树在增加和删除上面的效率极高,因此是epoll高效的原因之一。有兴趣可以百度红黑树了解

数据库知识点总结

醉酒当歌 提交于 2019-11-27 07:56:11
当年肥工的DB课讲的其实还挺好的...就用当时的笔记叭 (所以当年为什么不整理呢?还是懒叭 关系数据库的一些概念 完整性: 防止DB中存在不符合规定的数据(eg:性别只能是男或女) 实体完整性:primary key中的属性取值必须唯一且不能为空 参照完整性:若F是R的外码(foreign key),K是S的主码(primary key),F连接K。那么对于R中的每个元祖,R.F必须是 在S.K中出现过的值 或者 NULL 用户定义的完整性:用户自己在具体的DB中指定的约束(定义:NOT NULL / UNIQUE / CHECK) 触发器 :用于实现用户定义的完整性 CREATE TRIGGER ON ... AFTER ... 存储过程: 用SQL语句实现一些用户定义的业务逻辑 关系模型 (略) SQL (略) 索引 B+Tree B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层。 B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。 在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是 key i 和 key i+1 ,且不为 null,则该指针指向节点的所有 key