04 2018 档案

摘要:1 线段树的定义 首先,线段树是一棵二叉树。它的特点是:每个结点表示的是一个线段,或者说是一个区间。事实上,一棵线段树的根结点表示的是“整体”区间,而它的左右子树也是一棵线段树,分别表示区间的左半边和右半边。树中的每个结点表示一个区间[a,b]。每一个叶子结点表示一个单位区间。对于每一个非叶结点所表 阅读全文
posted @ 2018-04-30 01:48 Booker808 阅读(287) 评论(0) 推荐(0)
摘要:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 如图: 阅读全文
posted @ 2018-04-22 22:22 Booker808 阅读(619) 评论(0) 推荐(0)
摘要:public class MyHashMap { private class Entry { int hash; K key; V value; Entry next; Entry(int hash, K key, V value, Entry next) { this.hash = hash; this.key = key; this.value = ... 阅读全文
posted @ 2018-04-22 12:32 Booker808 阅读(281) 评论(0) 推荐(0)
摘要:Java实现二叉树的前序、中序、后序、层序遍历(非递归方法) 实现Java中非递归实现二叉树的前序、中序、后序、层序遍历,在非递归实现中,借助了栈来帮助实现遍历。前序和中序比较类似,也简单一些,但是后序遍历稍微复杂一些,层序遍历中借助了一个队列来进行实现。 根据上面二叉树的形状来看,四种遍历后的结果 阅读全文
posted @ 2018-04-21 02:51 Booker808 阅读(399) 评论(2) 推荐(0)
摘要:问题描述 假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 11 元,问如何组合才能使硬币的数量最少? 问题分析 乍看之下,我们简单的运用一下心算就能解出需要 2 个 5 元和 1 个 1 元的解。当然这里只是列出了这个问题比较简单的情况。当硬币的币制或者种类变化,并且需要凑出的总价值 阅读全文
posted @ 2018-04-21 00:10 Booker808 阅读(546) 评论(0) 推荐(0)
摘要:一、堆的概念 堆是一棵顺序存储的完全二叉树。完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值。 其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆; 其中每个节点的值大于等于其左、右孩子的值,这样的堆称为大根堆; 二、算法过程 1.将数组构造成初始堆(若想升序则建立大 阅读全文
posted @ 2018-04-15 22:18 Booker808 阅读(451) 评论(0) 推荐(0)
摘要:深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点。总结起来可以这样说:每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。 我们从这里可以 阅读全文
posted @ 2018-04-14 02:53 Booker808 阅读(337) 评论(0) 推荐(0)
摘要:转载:http://www.cnblogs.com/skywang12345/ 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 基本思想 通过Dijk 阅读全文
posted @ 2018-04-14 02:52 Booker808 阅读(942) 评论(0) 推荐(0)
摘要:克鲁斯卡尔算法的核心思想是:在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到最后得到一颗最小生成树。 克鲁斯卡尔算法的执行步骤: 第一步:在带权连通图中,将边的权值排序(从小到大); 第二步:判断是否需要选择这条边(此时图中的边已按权值从小到大排好序) 阅读全文
posted @ 2018-04-14 02:51 Booker808 阅读(2938) 评论(0) 推荐(0)
摘要:关于图的最小生成树算法 普里姆算法 首先我们先初始化一张图: 设置两个数据结构来分别代表我们需要存储的数据: lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说明以i为终点的边的最小权值=0,也就是表示i点加入了mst数组 mst[i]:这个数组对应的下标(图顶点)的值 阅读全文
posted @ 2018-04-14 02:50 Booker808 阅读(2356) 评论(0) 推荐(0)
摘要:拓扑排序算法介绍 拓扑排序解决的是一系列相互依赖的事件的排序问题,比如Ant中有很多的Task,而某些Task依赖于另外的Task,编译之前需要清理空间,打包之前要先编译,但其它一些Task处理顺序可以调换(是无所谓前后,不是并行), 如何安排Task的执行顺序就可以用拓扑排序解决。熟悉Java的朋 阅读全文
posted @ 2018-04-14 02:49 Booker808 阅读(327) 评论(0) 推荐(0)
摘要:首先我们先说一下,源码里可以看出此类不仅仅用双向链表实现了队列数据结构的功能,还提供了链表数据结构的功能。 阅读全文
posted @ 2018-04-06 16:46 Booker808 阅读(113) 评论(0) 推荐(0)
摘要:公平锁和非公平锁 公平锁是指多个线程等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁 特点:等待锁的线程不会饿死,但整体效率相对低一些 非公平锁是指可以不按照顺序,可以抢占锁 特点:整体效率高,但有些线程会饿死或者说很早就在等待锁,但要等很久才会获得锁重入锁有这样一个构造函数,对公平性进行设置。 阅读全文
posted @ 2018-04-05 23:06 Booker808 阅读(217) 评论(0) 推荐(0)
摘要:该类是一个读写锁的改进,它的思想是读写锁中读不仅不阻塞读,同时也不应该阻塞写。 读不阻塞写的实现思路: 在读的时候如果发生了写,则应当重读而不是在读的时候直接阻塞写! 因为在读线程非常多而写线程比较少的情况下,写线程可能发生饥饿现象,也就是因为大量的读线程存在并且读线程都阻塞写线程, 因此写线程可能 阅读全文
posted @ 2018-04-05 22:30 Booker808 阅读(157) 评论(0) 推荐(0)
摘要:每个线程负责一个任务队列(一一对应),当一个线程提前完成一个队列,会去窃取其他队列里的任务来执行,效率高,但是会产生竞争,所以可以采取双端队列:被窃取的线程永远从双端队列头部获取任务,窃取线程永远从双端队列的尾部来窃取任务! 阅读全文
posted @ 2018-04-02 16:28 Booker808 阅读(315) 评论(0) 推荐(1)