
数据结构
文章平均质量分 64
雪人奥特曼Q
这个作者很懒,什么都没留下…
展开
-
数据结构和算法之美 —— 哈希算法
数据结构和算法之美 - 21哈希算法的定义:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。常用哈希算法:比如 MD5、SHA 等哈希算法几点要求:从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法); 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同; 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小; 哈希算法的执行效率要尽量高效,针对较长的文本原创 2021-05-11 20:11:16 · 214 阅读 · 0 评论 -
数据结构和算法之美 —— 散列表
数据结构和算法之美 - 18一、散列思想:散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”。散列表 :用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。二、散列函数:key 表示元素的键值,hash(key) 的值表示经过散列函数计算得到的散列值(数组的小标)散列函数的基本要求:散列函数计算得到的散列值是一个非负整数; 如果 key1 = key2,那 hash(k原创 2021-05-11 14:56:24 · 104 阅读 · 0 评论 -
数据结构与算法之美 —— 跳表
数据结构与算法之美 - 17二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗?实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做跳表。目录一、跳表(对链表建立多级索引)概念:时间复杂度:空间复杂度:插入删除操作:跳表索引动态更新:为什么 Redis 要用跳表来实现有序集合,而不是红黑树?(提供区间查询的优势)一、跳表(对链表建立多级索引)概念:对于一个原创 2021-05-07 18:15:26 · 155 阅读 · 0 评论 -
ConcurrentHashMap 分析
目录早期 ConcurrentHashMap:Java 8 和之后的版本的ConcurrentHashMap:Java基础-10早期 ConcurrentHashMap:其实现是基于:分离锁,也就是将内部进行分段(Segment),里面则是 HashEntry 的数组,和 HashMap 类似,哈希相同的条目也是以链表形式存放。HashEntry 内部使用 volatile(禁用缓存) 的 value 字段来保证可见性,也利用了不可变对象的机制以改进利用 Unsafe 提供的底层能力原创 2021-03-23 23:59:05 · 168 阅读 · 0 评论 -
HashMap 树化的原因
为什么 HashMap 要树化呢?本质上这是个安全问题。因为在元素放置过程中,如果一个对象哈希冲突,都被放置到同一个桶里,则会形成一个链表,我们知道链表查询是线性的,会严重影响存取的性能。而在现实世界,构造哈希冲突的数据并不是非常复杂的事情,恶意代码就可以利用这些数据大量与服务器端交互,导致服务器端 CPU 大量占用,这就构成了哈希碰撞拒绝服务攻击,国内一线互联网公司就发生过类似攻击事件。...原创 2021-03-23 23:42:11 · 403 阅读 · 0 评论 -
数据结构 —— 数组,栈,链表,队列
时间复杂度:非多项式复杂度,随着n的增长,时间复杂度激增 最好时间复杂度,最坏时间复杂度,平均时间复杂度空间复杂度:空间复杂度是指除了原本的数据存储空间外,算法运行还需要额外的存储空间数组:线性表,利用连续内存存放相同类型数据。依据该原理可以根据脚标计算出数据位置,连续内存可以利用cpu缓存的预读 插入删除,引起大量的数据迁移,效率低。对于无需数组可以通过交换位置来避免插叙和删除的的数据迁移,从而提高效率 ArrayList和数组的区别?(动态扩容,存储内容,封装了基本...原创 2021-03-18 19:51:55 · 173 阅读 · 0 评论 -
Vector、ArrayList、LinkedList 有何区别?
三者都是实现集合框架中的 List,也就是所谓的有序集合。Vector 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。 ArrayList 是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与 Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容原创 2021-03-09 11:55:46 · 88 阅读 · 0 评论 -
数据结构——Map接口及其实现类
Map集合利用“key-value”的方式进行存储。Map接口的主要实现类有:HashMap,HashTable,TreeMapMap接口提供了一些公共方法:public interface Map<K,V> { //返回Map中的key--value的数目 int size(); //如果Map不包含任何key--value,则返回 true boolean isEmpty(); //如果Map中包含指定key的映射,则返回true.原创 2020-05-25 23:36:54 · 925 阅读 · 0 评论 -
数据结构与算法之美笔记 - 队列
数据结构与算法之美 - 09一、队列的概念队列,是一种操作受限的线性表数据结构,先进先出。队列的应用:Java concurrent 并发包利用 ArrayBlockingQueue 来实现公平锁等。 线程池请求排队 队列可以应用在任何有限资源池中,用于排队请求,比如数据库连接池等。队列可以用数组来实现,也可以用链表来实现,用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。二、队列的实现方式队列的数组实现:三、阻塞队列平衡生产和消费的速度;...原创 2021-01-11 22:15:11 · 165 阅读 · 0 评论 -
数据结构与算法之美笔记 —— 栈
栈是一种“操作受限”的线性表,只允许在一端插入和删除数据,后进先出。数据结构与算法之美-08使用数组实现一个栈栈的应用:1、栈在函数调用中的应用2、栈在表达式求值中的应用3、栈在括号匹配中的应用4、浏览器的前进、后退功能...原创 2021-01-07 21:34:47 · 206 阅读 · 0 评论 -
数据结构与算法之美笔记 —— 链表
数据结构与算法之美-06一、链表和数组的区别数组需要一块连续的内存空间来存储,对内存的要求比较高。如果我们申请一个 100MB 大小的数组,当内存中没有连续的、足够大的存储空间时,即便内存的剩余总可用空间大于 100MB,仍然会申请失败。链表不需要一块连续的内存空间,它通过“指针”将一组零散的内存块串联起来使用,所以如果我们申请的是 100MB 大小的链表,根本不会有问题。与数组一样,链表也支持数据的查找、插入和删除操作链表的优点:插入或者删除一个数据,我们并不需要为了保持内存的连续性而原创 2021-01-06 21:13:15 · 148 阅读 · 0 评论 -
数据结构与算法之美笔记 —— 数组
目录数组的随机访问原理:数组的插入删除:容器ArrayList能否完全替代数组?问题:数据结构与算法之美 - 05数组(Array)是一种线性表(数据间是简单的前后关系)数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。数组的随机访问原理:数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)(并不是数组的查找时间复杂度)根据下标查找元素的原理:一个长度为 10 的 int 类型的数组 int[] a = new int[10]。在图中,计算机给数组原创 2021-01-06 20:56:09 · 586 阅读 · 0 评论 -
数据结构和算法之美笔记 —— 复杂度分析
一、时间复杂度大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。1、假设每行代码执行的时间都一样,为 unit_time(一个单位时间)第 2、3 行代码分别需要 1 个 unit_time 的执行时间 第 4、5 行都运行了 n 遍,所以需要 2n*unit_time 的执行时间,所以这段代码总的执行时间就是 (2n+2)*unit_time原创 2021-01-05 21:01:41 · 877 阅读 · 0 评论 -
数据结构和算法之美笔记 —— 概述
数据结构与算法之美-02(siqi Mobile)20 个最常用的、最基础数据结构与算法:10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。 ...原创 2021-01-05 20:08:05 · 147 阅读 · 0 评论 -
Java对象 —— 怎么实现对于List<Object>的去重
一个存放对象的List怎么进行去重:1、对于集合中的对象进行去重2、按照对象的某个指定的属性进行去重原创 2020-11-27 17:07:18 · 667 阅读 · 2 评论 -
面试题-Java基础(二)- 容器
1、Java容器的结构答案2、collection和collections的区别?collection:是一个集合接口,是顶级集合接口。提供对集合对象基本操作的通用接口方法:size(),isEmpty(),clear(),add(),addAll()。 collections:是一个集合类的工具类,提供了一些静态方法,对集合进行排序,搜索以及线程安全等操作。3、List,set,M...原创 2020-05-18 23:01:42 · 184 阅读 · 0 评论 -
数据结构——Java的容器
1、Java的容器Java的容器的两个根接口Collection和Map派生出来的,Collection派生出来了三个字接口,list,set和Queue。因此Java集合类大致可以分成list,set,queue和Map四大接口体系。list:有序可重复的集合,通过索引获取具体元素 set:无需不可重复的集合,只可以通过元素本身进行访问 queue:先进先出的队列集合 m...原创 2020-04-23 23:34:07 · 311 阅读 · 0 评论 -
ArrayList 和 Array的差异
1、支持随机存储原创 2020-05-20 00:09:57 · 197 阅读 · 0 评论 -
数据结构 —— 二叉查找树
二叉查找树:某节点的左子树节点值仅包含小于该节点值 某节点的右子树节点值仅包含大于该节点值 左右子树每个也必须是二叉查找树根据以上定义可能出现二叉树有:从数学角度上来讲右子树,显然不平衡,插叙效率不高。1、红黑树是一个自平衡(不是绝对的平衡)的二叉查找树。定义:每个节点都有红色或黑色 树的根始终是黑色的 (黑土地孕育黑树根) 没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点,并没有说不能出现连续的黑色节点) 从节点(包括根)到其任何后代NULL节点(叶子结点.原创 2020-12-09 22:27:48 · 130 阅读 · 0 评论 -
索引_存储结构
目录不同数据库使用的索引存储结构聚簇索引 和 非聚簇索引MongoDB 和Mysql 使用的索引 的 存储结构B-Tree 和 B+Tree相关介绍MySql 采用的是 B+Tree(真正的data都存放在最底层的叶子节点上)的存储形式:Mysql 是一种关系型数据库,区间访问是常见的一种情况,而 B-树并不支持区间访问(可参见上图),而B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。其次B+树的查询效率更加稳定,..原创 2020-07-09 00:25:13 · 3331 阅读 · 0 评论 -
Hash算法解决哈希冲突的四种方法
1、开放地址法2、原创 2020-05-28 00:23:35 · 614 阅读 · 0 评论 -
Comparable和Comparator的区别 与 相关应用
Comparable 是排序接口:Comparator 是比较器接口:原创 2020-05-20 00:17:19 · 306 阅读 · 0 评论