数据结构与算法
lijunlinlijunlin
这个作者很懒,什么都没留下…
展开
-
堆排序算法 总结
最近面试,老是被问到堆排序算法。回答时老是感觉思路不清楚,现在总结一下,把思路弄清楚的。1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。好的那么堆得特性是什么呢?堆得定义:堆是满足下列性质的数列{r1, r2, …,rn}: 如下图最开始是一个小顶堆。当把97和13 交换后不是堆了,所以我们要调整根节点使之成为堆即筛选。(注意:是自堆顶到叶子的转载 2013-01-23 01:59:56 · 385 阅读 · 0 评论 -
Java模拟单向链表和双向链表的实现
下面演示的Java模拟的单向链表的实现[java] view plaincopypackage com.jadyer.sort; /** * 模拟单向链表 * @author 宏宇 * @editor Jan 23, 2012 7:55:21 PM * @see ===========================转载 2013-04-15 13:51:03 · 788 阅读 · 0 评论 -
HashMap,LinkedHashMap,TreeMap的区别
Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写Hash转载 2013-07-21 19:53:22 · 541 阅读 · 0 评论 -
集合框架源码分析二(抽象类篇)
一。AbstractCollectionJava代码 public abstract class AbstractCollection implements Collection { /** * 唯一构造方法 */ protected AbstractCollection() { } // Query Ope转载 2013-08-25 02:54:45 · 731 阅读 · 0 评论 -
HashMap,HashSet,LinkedHashSet,LinkedHashMap,ArrayList实现原理
HashMap的实现原理1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 2. HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用转载 2013-08-25 02:33:33 · 1387 阅读 · 0 评论 -
集合框架源码分析四(Collections类详细分析)
我认为Collections类主要是完成了两个主要功能1.提供了若干简单而又有用的算法,比如排序,二分查找,求最大最小值等等。2.提供对集合进行包装的静态方法。比如把指定的集合包装成线程安全的集合、包装成不可修改的集合、包装成类型安全的集合等。Java代码 package java.util; import java.io.Serializable; im转载 2013-08-25 02:59:42 · 1102 阅读 · 0 评论 -
集合框架源码分析六之堆结构的实现(PriorityQueue)
有关堆的描述请见我另外一篇博客http://zhouyunan2010.iteye.com/blog/1217462Java代码 /** * * 优先队列是用了一种叫做堆的高效的数据结构, * 堆是用二叉树来描述的,对任意元素n,索引从0开始,如果有子节点的话,则左子树为 * 2*n+1,右子树为2*(n+1)。 * 以堆实现的队列如果不为空的话,queue[转载 2013-08-25 03:01:29 · 617 阅读 · 0 评论 -
集合框架源码分析篇一(接口篇)
一。Iterable接口Java代码 public interface Iterable { /** * 实现此接口的所有集合都可以使用foreach循环 * 由于Collection接口扩展自Iterable接口, * 标准类库的任何集合都可以使用"for each"循环 * @return an Iterator.转载 2013-08-25 02:49:15 · 668 阅读 · 0 评论 -
集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
一。ArrayList,可自动扩充容量的动态数组Java代码 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable { private static final long serialV转载 2013-08-25 02:56:24 · 1234 阅读 · 0 评论 -
集合框架源码分析五之LinkedHashMap,LinkedHashSet
LinkedHashMap是为了解决遍历Hash表的无序问题,它内部维护了一个链表用于记录你插入元素(或你访问元素的顺序)的位置,遍历时直接遍历链表,元素的顺序即为你插入的顺序,但是Entry对象要多加两个成员变量before和after用于记录链表的前驱和后继。所以LinkedHashMap的的存储效率要低于HashMap,但是遍历效率要高于HashMap。java.util.LinkedH转载 2013-08-25 03:00:32 · 586 阅读 · 0 评论 -
HashMap的实现与优缺点
HashMap 是我们经常使用的一种数据结构。工作中会经常用到,面试也会总提到这个数据结构,找工作的时候,”HashTable 和HashMap的区别“被问到过没有? 本文会从原理,JDK源码,项目使用多个角度来分析HashMap。 1.HashMap是什么 JDK文档中如是说”基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使转载 2013-08-25 03:18:52 · 4470 阅读 · 0 评论 -
平衡二叉树
平衡二叉树又称AVL树。它或者是颗空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树节点的平衡因子BF定义为该节点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有节点的平衡因子只可能为-1,0,1.只要二叉树上有一个节点的平衡因子的绝对值大于1,那么这颗平衡二叉树就失去了平衡。假设我们已经有棵平衡二叉树,现在让我们来转载 2013-10-17 14:36:38 · 700 阅读 · 0 评论 -
【整理】HashMap的原理及遍历
【遍历方法一】[java] view plaincopyfor(Map.Entry entry : hashmap.entrySet()){ System.out.println("Key="+entry.getKey()+"---->value="+entry.getValue().toString()) } 【遍历方法二:用keySet遍历】转载 2014-05-26 23:44:42 · 535 阅读 · 0 评论 -
HashMap的遍历
package collection;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import java.util.Set;/** * 打印在数组中出原创 2014-05-26 23:45:12 · 681 阅读 · 0 评论 -
用JAVA语言,编写一个链表类(双向链表),实现插入,删除,查找操作
定义接口://Deque.javapackage dsa; //根据自己的程序位置不同public interface Deque { public int getSize();//返回队列中元素数目 public boolean isEmpty();//判断队列是否为空 public Object first() throws ExceptionQueueEmpty;//取转载 2013-04-15 13:40:11 · 3145 阅读 · 0 评论 -
java实现二叉树的常见操作
树型结构是最常见的非线性结构,其中二叉树最为常见。今天我主要就是用java来实现一下树的一些常见操作。 首先需要一个用来存储树节点值的javabean:view plainpublic class TreeBean { private int nodeValue; public int getNodeValue()转载 2013-04-15 13:52:31 · 565 阅读 · 0 评论 -
堆排序算法-建堆
堆排序是利用二叉树的存储结构,通过对数组n个元素求n-1次大根堆(或小根堆)来实现了排序的算法。对于我这种数据结构没学好的童鞋,问题就来了,经过网上查询,终于一知半解:1.首先大根堆是神马呢?概念如下:大根堆就是根节点关键字比其两个叶子节点关键字都大的二叉堆。也就是二叉树结构中,叶子节点都比它们的根节点小。2.其次为神马是求n-1次大根堆呢?在算法中,每求一次大根堆,都可以转载 2013-01-23 18:14:17 · 676 阅读 · 0 评论 -
递归算法详细分析-> C
C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计算里,递归并没有提供任何优越之处。在菲波那契数列中,它的效率更是低的非常恐怖。 这转载 2013-01-25 19:31:22 · 307 阅读 · 0 评论 -
Java实现二叉树的递归与非递归遍历
其中二叉树节点类/** 二叉树节点 */public class BTNode { private char key; private BTNode left, right; public BTNode(char key) { this(key, null, null); } public BTNode(char key, BTNod转载 2013-01-25 21:42:15 · 443 阅读 · 0 评论 -
递归算法 转载
前言说白了递归就象我们讲的那个故事:山上有座庙,庙里有个老和尚,老和尚在讲故事,它讲的故事是:山上有座庙,庙里有个老和尚,老和尚在讲故事,它讲的故事是:……也就是直接或间接地调用了其自身。就象上面的故事那样,故事中包含了故事本身。因为对自身进行调用,所以需对程序段进行包装,也就出现了函数。函数的利用是对数学上函数定义的推广,函数的正确运用有利于简化程序,也能使某些问题得到迅转载 2013-01-25 23:07:45 · 713 阅读 · 0 评论 -
递归算法示例
这个递归程序很简单,但是遇到复杂的递归算法可就不容易看懂了。以下这种方法能够帮助大家进行分析,但愿吧。 一.例子(用从C++描述): 行号 程序 0 p (int w) 1 {if( w>o) 2 { cout 3转载 2013-01-25 19:32:51 · 759 阅读 · 0 评论 -
如果要用Java实现算法,一定慎用递归
现象 :递归是我们很经典的一种算法实现,可以很好的描述一个算法的原理!对于算法的描述、表现和代码结构理解上,递归都是不错的选择!但是本文想说的是java实现一个递归算法的时候尽量不要用递归实现,而是转换成的非递归实现。最近在实现一个比较复杂算法的时候,尝试了一下,非递归实现相比递归实现速度上能提升1/3。以下面一个简单的例子来说:(注:为了描述简单,所以这里只用一个转载 2013-01-25 23:10:38 · 522 阅读 · 0 评论 -
Java程序员必知的8大排序
8种排序之间的关系: 1, 直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。(2)实例(3)用java实现 package com.njue; public cl转载 2013-01-30 20:54:52 · 570 阅读 · 0 评论 -
Java实现的几个常用排序算法详细解读
排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。废话不多说,下面逐一看看经典的排序算法:1. 选择排序选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择转载 2013-01-30 21:04:12 · 378 阅读 · 0 评论 -
常用正则表达式大全
一、正则表达式介绍、参考文档正则表达式参考文档:http://www.regexlab.com/zh/regref.htm 二、常用正则表达式大全正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了转载 2013-03-29 04:28:17 · 578 阅读 · 0 评论 -
Java栈与堆
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集转载 2013-04-04 18:10:09 · 431 阅读 · 0 评论 -
堆和栈的区别
在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。 首先,我们举一个例子: void f() { int* p=new int[5]; } 这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一转载 2013-04-04 18:11:20 · 396 阅读 · 0 评论 -
java中堆和栈的理解
Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动转载 2013-04-04 18:12:40 · 465 阅读 · 0 评论 -
java实现双向循环链表和单链表
参照Java SE uitil LinkedList实现了一下简单化的LinkedList/** To change this template, choose Tools | Templates* and open the template in the editor.*/package linkedlisttest;/**** @author Lindily转载 2013-04-15 13:50:13 · 1099 阅读 · 0 评论 -
Java Map遍历方式方式及性能测试
1. 阐述对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多。理由是:entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率。那么实际情况如何呢?为了解遍历性能的真实差距,包括在遍历key+value、遍历key、遍历v转载 2015-09-26 19:36:40 · 370 阅读 · 0 评论