
数据结构
大树叶
宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。
展开
-
再议:HashMap, treeMap 和 LinkedHashMap
一般情况下,1) 我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。2) 但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。3) 如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接原创 2016-05-10 16:04:21 · 590 阅读 · 0 评论 -
红黑树(RB-tree)比AVL树的优势在哪?
今天看了STL源码剖析中关于红黑树的原理和实现,看完复杂的节点插入、节点颜色变换后不禁想:这些功能经典的AVL树也能实现,为什么要提出红黑树?查了些资料,并且加上自己理解,感叹红黑树的巧妙。首先红黑树是不符合AVL树的平衡条件的,即每个节点的左子树和右子树的高度最多差1的二叉查找树。但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内转载 2017-08-07 23:55:02 · 1013 阅读 · 0 评论 -
二叉查找树,红黑树,AVL树,B~/B+树(B-tree),伸展树——优缺点及比较
二叉查找树(Binary Search Tree)很显然,二叉查找树的发现完全是因为静态查找结构在动态插入,删除结点所表现出来的无能为力(需要付出极大的代价)。BST 的操作代价分析: (1) 查找代价: 任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶子结点前进。因此查找中数据比较次数与树的形态密切相关。 当树中每个结点左右子树高度大致相同时,树高为logN。则平...原创 2017-10-08 00:15:23 · 1271 阅读 · 0 评论 -
Domain-Driven Design
下载地址 http://www.infoq.com/cn/minibooks/domain-driven-design-quickly判断是否是领域逻辑的原则:就是这个逻辑动作是否有明确的业务上的含义,或者说是否是业务相关的,而不仅仅是技术相关的。只有将技术实现手段从领域问题中剥离才能保证领域本身的精炼,保证程序员可以把精力集中到领域问题本身上来,而不会满脑子都是技术实现手段。按照转载 2017-10-29 00:57:42 · 802 阅读 · 0 评论 -
【推荐】二叉树的递归与非递归遍历实现
对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就 是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历 中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。一.前序遍历 前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。 1....原创 2018-02-28 23:49:03 · 317 阅读 · 0 评论 -
环形加油站问题
问题城市的环形路有n个加油站,第i个加油站的油量用gas[i]来表示,你有如下的一辆车:它的油缸是无限量的,初始是空的它从第i个加油站到第i+1个加油站消耗油量为cost[i]现在你可以从任意加油站开始,路过加油站可以不断的加油,问是否能够走完环形路。如果可以返回开始加油站的编号,如果不可以返回-1。此题目来自于leetcode:https://oj.leetcode.com/problems/g...转载 2018-03-01 01:10:36 · 1297 阅读 · 0 评论 -
skiplist 跳表
1、什么是SkipList当使用链表存放有序数据的时候,查找某个数据或者添加某个数据的复杂度是O(n),每次查找都需要顺序遍历。加快搜索的方法有哪些呢?想想数据库的设计思路,对,使用索引,利用空间换取时间。跳表基本上采用的就是这个思路。图1在最底层的链表中随机抽取一定是数量的节点作为索引,形成另一个链表。然后继续从新生成的链表中随机抽取点作为新的索引,继续形成另一个链表。将这个步骤继续多次。可以得...转载 2018-03-02 18:48:24 · 292 阅读 · 0 评论 -
邻接矩阵的定义和例子
根据图的定义可知,图的逻辑结构分为两部分:V和E的集合。因此,用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边或弧)的数据,称这个二维数组为邻接矩阵。邻接矩阵又分为有向图邻接矩阵和无向图邻接矩阵。在图的邻接矩阵表示法中:① 用邻接矩阵表示顶点间的相邻关系② 用一个顺序表来存储顶点信息图的矩阵设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵:【例】下图中...原创 2018-04-07 21:41:52 · 16505 阅读 · 0 评论 -
用BFS解决迷宫最短路径问题
迷宫问题中,有很大一部分可以用BFS来解。解决这类问题可以很大地提升能力与技巧,这篇文章是基于一个简单实例展开来讲的例题: 第一行两个整数n, m,为迷宫的长宽。 接下来n行,每行m个数为0或1中的一个。0表示这个格子可以通过,1表示不可以。假设你现在已经在迷宫坐标(1,1)的地方,即左上角,迷宫的出口在(n,m)。每次移动时只能向上下左右4个方向移动到另外一个可以通过的格子里,每次移动算一步。数...原创 2018-04-08 00:10:20 · 2762 阅读 · 0 评论 -
最小生成树
给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树.求最小生成树的算法(1) 克鲁斯卡尔算法图的存贮结构采用边集数组,且权值相等的边在数组中排列次序可以是任意的.该方法对于边相对比较多的不是很实用,浪费时间.(2) 普里姆算法图的存贮结构采用邻接矩阵.此方法是按各个顶点连通的步骤进行,需要用一个顶点集合,开始为空集,以后将以连通的顶点转载 2017-07-03 23:29:29 · 324 阅读 · 0 评论 -
JAVA SkipList 跳表 的原理和使用例子
跳表的原理与特点跳跃链表是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作需要O(log n)平均时间),并且对并发算法友好。基本上,跳跃列表是对有序的链表增加上附加的前进链接,增加是以随机化的方式进行的,所以在列表中的查找可以快速的跳过部分列表(因此得名)。所有操作都以对数随机化的时间进行。跳跃列表是按层建造的。底层是一个普通的有序链表。每个更高层都充当下面列表的"快...原创 2016-05-01 21:58:50 · 19698 阅读 · 0 评论 -
B-Tree 与B+Tree
1、什么是B-TreeB-tree又叫平衡多路查找树。一棵m阶的B-tree (m叉树)的特性如下:1) 树中每个结点至多有m个孩子;2) 除根结点和叶子结点外,其它每个结点至少有[m / 2]向上取整个孩子;3) 若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);4) 所有叶子结点都出现在同一层原创 2017-04-02 10:52:31 · 609 阅读 · 0 评论 -
TreeMap、HashMap、ConcurrentSkipListMap之性能比较
比较Java原生的 3种Map的效率。1. TreeMap2. HashMap3. ConcurrentSkipListMap结果:模拟150W以内海量数据的插入和查找,通过增加和查找两方面的性能测试,结果如下:Map类型插入查找(在100W数据量中)10W50W100W150W原创 2016-05-01 17:07:00 · 3085 阅读 · 0 评论 -
跳表(Skip List)的JAVA实现
http://www.acmerblog.com/skip-list-impl-java-5773.html转载 2016-05-02 00:27:27 · 794 阅读 · 0 评论 -
ConcurrentHashMap 内部实现分析
ConcurrentHashMapConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。ConcurrentHashM转载 2016-05-02 01:03:25 · 649 阅读 · 0 评论 -
深入分析ConcurrentHashMap
线程不安全的HashMap因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap,如以下代码final HashMap map = new HashMap(2);Thread t = new Thread(new Runnable() { @Override public void run()转载 2016-05-02 01:27:04 · 422 阅读 · 0 评论 -
完全二叉树 满二叉树
概念结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层。二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度。数据结构中,树的度是什么? 它是树内各结点的度的最大值.为何节点的度? 结点拥有的子树数称为结点的度。二叉树在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(r原创 2016-05-15 12:03:32 · 14760 阅读 · 0 评论 -
从B树、B+树、B*树谈到R 树
第一节、B树、B+树、B*树1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自转载 2016-05-08 20:17:10 · 522 阅读 · 0 评论 -
为什么Java中synchronized同步的对象不能是Integer等类型
为什么Java中synchronized同步的对象不能是Integer等类型?原因是Java的自动封箱和解箱操作在作怪。这里的i++实际上是i = new Integer(i+1),所以执行完i++后,i已经不是原来的对象了,同步块自然就无效了原创 2016-06-04 20:09:26 · 2804 阅读 · 0 评论 -
trie 树
Trie树(字典树)一、引入字典是干啥的?查找字的。字典树自然也是起查找作用的。查找的是啥?单词。看以下几个题:1、给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单词表中出现过。答:简单!map,短小精悍。好。下一个2、给出n个单词和m个询问,每次询问一个前缀,回答询问是多少个单词的前缀。答:map,把每个单词拆开。judge:n<...转载 2018-08-28 00:04:21 · 217 阅读 · 0 评论