数据结构与算法
ljz2016
这个作者很懒,什么都没留下…
展开
-
jdk中栈的实现---Stack与Vector
栈只允许访问一个数据项:即最后插入的数据项。 只能对栈顶进行操作,后进先出(LIFO)。push操作:public E push(E item) { addElement(item); return item;}其中addElement(item)是父类vector的一个方法:public synchronized void addElement(E obj)原创 2017-08-23 14:43:20 · 1368 阅读 · 0 评论 -
基数排序
这个是以10为基数的排序,不需要比较数组每一项的大小,在最坏的情况下,时间复杂度和快排一样。缺点是占用空间多一倍。在数值不大的情况下,效率比快排高。public class BaseSort { public static void main(String[] args) { Random random=new Random(); int []a=new...原创 2018-08-24 14:22:32 · 173 阅读 · 0 评论 -
树
二叉树的实现:public class Node { int iData; double fData; Node leftChild; Node rightChild; public void displayNode(){ }}public class Tree { private Node root; pub...原创 2018-09-02 00:52:11 · 115 阅读 · 0 评论 -
红黑树-RBTree-TreeMap
红黑规则每一个节点不是红色就是黑色根总是黑色节点是红色,则子节点必须是黑色根节点到叶节点或者空子节点的每条路径,必须包含相同数目的黑色节点根节点到叶节点路径伤的黑色节点的数目称为黑色高度,所有根到叶节点路径上的黑色高度必须相同。...原创 2018-09-09 19:26:43 · 181 阅读 · 0 评论 -
哈夫曼编码-Java实现
哈夫曼编码主要用于数据压缩,用更少的位表示更多的数据。首先对原始数据进行统计,计算每个字符出现的次数,然后建立哈夫曼树。 哈夫曼树也叫最优二叉树(哈夫曼树)。解码时,对编码后的数据,从哈夫曼树的根出发,遇到一个叶子节点,则译出一个字符,重复此步骤,直到译出所有字符。建立哈夫曼树的标准是,总长最短,译码时,结果唯一。每个字符的编码不能是其它字符的前置。public class ...原创 2018-09-06 16:35:01 · 5955 阅读 · 2 评论 -
2-3-4树
2-3-4树指拥有最多4个子节点3个数据项的多叉树。对非叶节点,有3种可能的情况:有一个数据项的节点,总有2个子节点有两个数据项的节点,总有3个子节点有三个数据项的节点,总有4个子节点2-3-4树不允许一个节点只有一个子节点,要么没有(那就是叶节点),要么有2个及以上。二叉树的规则是关键字比节点大的子节点,是右子节点,比父节点小的,是左子节点。2-3-4树的规则相似,但是加...原创 2018-09-27 14:31:00 · 523 阅读 · 0 评论 -
图
图是最常用的结构之一。从数学意义上来说,树是图的一种,但是图的应用方式与树不同。图由顶点和边组成。如果两个顶点被同一条边连接,就称这两个顶点是邻接的。路径是边的序列。如果至少有一条路径可以连接所有的顶点,那么这个图被称作连通的。有向图是指图中没有方向,可以从任意一边到另外一边。带权图是指边被赋予权值,权值是一个数字,可以代表顶点之间的距离。如果用一条线来连接所有的顶点,有2种搜索方...原创 2018-10-15 14:02:51 · 143 阅读 · 0 评论 -
哈希表与哈希值
哈希表是一种数据结构,它可以提供快速的插入和查找操作。不管哈希表中有多少数据,插入和删除时间都是接近常量的时间:即O(1)。缺点是:它是基于数组的,数组创建后难以扩展,哈希表被基本填满时,性能下降严重,而且不能够顺序遍历数据。由于哈希表是基于数组的,所以就要把关键字转化成数组下标。哈希函数负责把大范围的数字(由关键字计算得出)转换成小范围的数字。这个小范围的数字对应着数组下标。转化时会碰到...原创 2018-09-30 16:30:05 · 5991 阅读 · 0 评论 -
堆
堆(不是jvm中的对内存)是优先级队列的一种数据结构。它是一种树,插入和删除的时间复杂度都是O(logN)。堆(降序的优先级队列)有以下特点:它是完全二叉树。除了树最后一层节点不需要是满的,其它每一层从左到右都是满的通常用数组实现堆中每一个节点都满足堆的条件,也就是说每一个节点的关键字都大于(或等于)这个节点的子节点的关键字。堆是弱序的,只要求父节点比子节点大就行,左右子节点是无序...原创 2018-10-10 14:45:40 · 138 阅读 · 0 评论 -
HashMap 详解
类层次图:hashmap实现了Map接口,提供了所有可选的map操作,允许Null值和null的key,基本和Hashtable差不多。区别是它线程不安全以及允许null。Hashmap不保证顺序,它的插入和删除都是常量时间的(在哈希值散列分布的情况下)。遍历需要的时间和哈希表的容量以及当前k-v的数量成正比。如果遍历的需求比较高,那么不要给哈希表设置太大的初始容量,因为那样装填因子太低。...原创 2018-11-02 17:10:32 · 278 阅读 · 0 评论 -
背包问题
假设有砝码:11,8,7,6,5kg各一个,背包只能装m kg,如果要刚好装满,则应该放入哪几个? 代码:public class Knapsack { public int[] weights = {11, 8, 7, 6, 5}; public List<Integer> list = new ArrayList<>(); int b...原创 2018-08-20 14:40:47 · 111 阅读 · 0 评论 -
汉诺塔
展示移动过程: public static void main(String[] args) { doTowers(3,'A','B','C'); } public static void doTowers(int topN,char from,char inter,char to){ if (topN==1) ...原创 2018-08-20 12:01:52 · 285 阅读 · 0 评论 -
链表
单链表:节点内容下一个节点的引用一个单链表实例:public class LikeNode { public int iData; public double dData; public LikeNode next; public LikeNode(int iData, double dData) { this.iData = i...原创 2018-08-15 14:28:37 · 109 阅读 · 0 评论 -
对一致性Hash算法,Java代码实现的深入研究
数据结构的选取 一致性Hash算法最先要考虑的一个问题是:构造出一个长度为232的整数环,根据节点名称的Hash值将服务器节点放置在这个Hash环上。 那么,整数环应该使用何种数据结构,才能使得运行时的时间复杂度最低?首先说明一点,关于时间复杂度,常见的时间复杂度与时间效率的关系有如下的经验规则: O(1) < O(log2N) < O(N) < O(N * log2N) < O(N2) <转载 2017-08-27 21:49:50 · 160 阅读 · 0 评论 -
jdk中队列的实现--阻塞队列和无阻塞队列
队列有先进先出FIFO和后进先出LIFO两种模式 队列一般都采用链表实现 无阻塞队列:class QueueElement<T>{//队列节点 QueueElement<T> next=null; QueueElement<T> prev=null; T obj=null; QueueElement(T var1){ this.obj=var1;原创 2017-08-28 12:10:13 · 528 阅读 · 0 评论 -
hash key
作者:张炎泼(XP),白山云科技合伙人兼研发副总裁,绰号XP。 http://geek.csdn.net/news/detail/235456 张炎泼先生于2016年加入白山云科技,主要负责对象存储研发、数据跨机房分布和修复问题解决等工作。以实现100PB级数据存储为目标,其带领团队完成全网分布存储系统的设计、实现与部署工作,将数据“冷”“热”分离,使冷数据成本压缩至1.2倍冗余度。张炎泼先生2转载 2017-09-07 13:48:21 · 1611 阅读 · 0 评论 -
分治算法---最大子数组
class MaxRange{ int start; int end; int sum; public MaxRange(int max, int maxLeftIndex, int maxRightIndex) { this.start=maxLeftIndex; this.end=maxRightIndex; this原创 2017-11-07 18:43:44 · 335 阅读 · 0 评论 -
最大子数组--线性非递归实现
public MaxRange MaxRangeSonArray(int[] array){ int maxStart=0,maxEnd=0; int sumMax=array[0]; for (int i=1;i<array.length;i++){ int sum=sumMax; for (int k=原创 2017-11-08 13:21:24 · 539 阅读 · 2 评论 -
分治算法--矩阵乘法
public class Matrix { private double[][] a; private double[][] b; private double[][] c; public Matrix(int aRows,int aCols,int bRows,int bCols){ if (aCols!=bRows){ th原创 2017-11-09 13:12:19 · 1633 阅读 · 0 评论 -
时间复杂度与排序算法
时间复杂度 有序数组 无序数组 增 n/2+log2nlog_2 n 1 删 n/2+log2nlog_2 n N 改 log2nlog_2 n N/2 查 log2nlog_2 n N/2 插入 n/2+log2nlog_2 n N/2在查找比较频繁的情况下,可以考虑使用有序数组,其它情况一律使用无序数组。数组共有的缺点是插原创 2017-08-23 13:50:15 · 484 阅读 · 1 评论 -
解析算术表达式
下面是用栈结构解析算术表达式并计算的方法,只适用于操作数是个位数的(如果需要处理多位数,则修改后缀表达式的存储方式即可)。由中缀表达式获得后缀表达式public class StackX { private int maxSize; private char[] stackArray; private int top; public StackX(int ...原创 2018-08-10 13:46:45 · 839 阅读 · 0 评论 -
ArrayList
elementData是arraylist的容器,所以arraylist是基于数组的操作。transient Object[] elementData;add添加一个元素前,先检查数组容量,如果数组为空,先初始化。发现容量不够时,需要对数组扩容。public boolean add(E e) { ensureCapacityInternal(size + 1); /...原创 2018-11-12 11:08:24 · 108 阅读 · 0 评论