
数据结构与算法
文章平均质量分 89
奋斗的鱼
这个作者很懒,什么都没留下…
展开
-
从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)与树的深度相关,那么降低树的深度自转载 2014-10-21 12:19:45 · 507 阅读 · 0 评论 -
二叉树常见面试题
树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关的题目基本都可以用递归思想解决,当然有些题目非递归解法也应该掌握,如非递归遍历节点等等。本文努力对二叉树相关题目做一个较全的整理总结,希望对找工作的同学有所帮助。转载 2015-08-30 17:29:03 · 615 阅读 · 0 评论 -
扩展数据结构--跳表(SkipList)
昨天在面试的时候被问到跳表这个数据结构,一头雾水,回来后赶紧查了查,现在总结一下。跳表(SkipList)这种数据结构实现的功能与红黑树,AVL树都差不太多,说白了就是一种基于排序的索引结构,它的统计效率与红黑树差不多,但是它的原理,实现难度以及编程难度要比红黑树简单。另外它还有一个平衡的树形索引机构没有的好处,就是在并发环境下其表现很好。。。1、跳表的核心思想跳表是平衡树的一种替代的原创 2015-07-29 11:59:02 · 849 阅读 · 0 评论 -
二叉树的java实现
下面是实现的具体代码,输入是工程目录下input.txt,文件,输入时“#”表示节点为空。[java] view plaincopypackage com.algorithm.tree; import java.io.File; import java.io.FileNotFoundException; import转载 2015-08-30 21:05:51 · 377 阅读 · 0 评论 -
深入解析HashMap、HashTable
集合类之番外篇:深入解析HashMap、HashTableJava集合类是个非常重要的知识点,HashMap、HashTable、ConcurrentHashMap等算是集合类中的重点,可谓“重中之重”,首先来看个问题,如面试官问你:HashMap和HashTable有什么区别,一个比较简单的回答是:1、HashMap是非线程安全的,HashTable是线程安全的。2、Ha转载 2015-07-24 09:12:52 · 538 阅读 · 0 评论 -
java 图的拓扑排序(利用Vector存储)
Stack类:Java代码 package com.javaeye.rsrt; /** * 栈,遵循先进后出的原则,用来保存元素 * * @author nishiting * */ public class Stack { private int[] st; private i转载 2015-09-08 20:44:54 · 433 阅读 · 0 评论 -
数据结构--图的相关操作实现
存储结构要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值。常用的图的存储结构主要有以下二种:邻接矩阵邻接表邻接矩阵我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法。我们假设A是这个二维数组,那么A中的一个元素ai原创 2015-09-04 19:13:11 · 811 阅读 · 0 评论 -
图拓扑排序的两种方法实现
方法一:(1)在有向图中选一个没有前驱(入度为0)的点输出。(2)从图中删除该顶点和所有以它为尾的弧。重复以上步骤,直至全部顶点均已输出,或者当前图中不存在五前驱的顶点为止。在实现中,我们可以用一个队列存入所有入度为0的顶点。然后依次删除这些顶点,和其对应的边,如果对应边删除后其终点的入度减为0者也将其存入队列中,如此循环下去,直到队列为空。最后比较列表原创 2015-09-10 11:13:45 · 2530 阅读 · 0 评论 -
红黑树
定义红黑树主要像是对2-3查找树进行编码,尤其是对2-3查找树中的3-nodes节点添加额外的信息。红黑树中将节点之间的链接分为两种不同类型,红色链接,他用来链接两个2-nodes节点来表示一个3-nodes节点。黑色链接用来链接普通的2-3节点。特别的,使用红色链接的两个2-nodes来表示一个3-nodes节点,并且向左倾斜,即一个2-node是另一个2-node的左子节点。这种做法的转载 2015-09-06 20:49:57 · 267 阅读 · 0 评论 -
两个有序数组中找第N个数
给定两个有序的数组,长度分别为m和n,求这两个数组中的第K个元素。 问题分析: 1. 把 A 平均分为前后两个部分,前部分有 x 个元素,后部分有 n-x 个元素(由于 A 是有序的,所以后一部分的所有元素都大于前一部分)。A[x] 为 A 的后一部分中的第一个元素。 2. 同理把 B 也平均分成前后两个部分,前部分有 y 个元素,后部分有 m-y转载 2015-09-11 16:12:03 · 770 阅读 · 0 评论 -
平衡查找树之2-3树
定义和二叉树不一样,2-3树运行每个节点保存1个或者两个的值。对于普通的2节点(2-node),他保存1个key和左右两个自己点。对应3节点(3-node),保存两个Key,2-3查找树的定义如下:1. 要么为空,要么:2. 对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key有效,有节点也是一个2-3节转载 2015-09-06 19:18:18 · 363 阅读 · 0 评论 -
寻找字符串中最长回文——Manacher算法及其Java实现
题目:给一个字符串,找出最长的回文的长度(或求这个回文)。分析:寻找字符串中的回文,有特定的算法来解决,也是本文的主题:Manacher算法,其时间复杂度为O(n)。首先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了。然后,我们需要一个辅助数组rad[],用rad[i]表示转载 2015-09-28 16:26:32 · 517 阅读 · 0 评论 -
求二叉树两节点的最小父节点(有父节点指针)
给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。描述你程序的最坏时间复杂度,并实现具体函数,函数输入输出请参考如下的函数原型:C++函数原型:1234567strucy TreeNode{原创 2015-09-13 21:20:06 · 2254 阅读 · 1 评论 -
如何判断一个数是不是2的n次幂
题目:给定一个整数num,判断这个整数是否是2的N次方。比如,2,4,8是2的那次方,6,10不是2的N次方。请看下面的程序:public static bool Check1(int num){ int i = 1; while (true) { if (i > num) return fals转载 2015-10-20 16:56:31 · 5289 阅读 · 0 评论 -
树结构--Trie树
一:概念 下面我们有and,as,at,cn,com这些关键词,那么如何构建trie树呢?从上面的图中,我们或多或少的可以发现一些好玩的特性。 第一:根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 第二:从根节点到某一节点,路径上经过的字符连接起来,就是该节点对应的字符串。 第三:每个单词的公共前缀作转载 2015-08-01 15:59:24 · 323 阅读 · 0 评论 -
字符串反转(java实现)
问题:给一个字符串,比如 “I love china”, 把字符反转后变成 “china love I”思路:先把字符串从第一个字符与最后一个字符对换,第二个字符和倒数第二个字符对换,这样,我们就把每一个单词位置互换了。但是我们要求单词里面字符的顺序是不能变的,所以,我们要把每一个单词里面的字符从头到尾对换一下。这样就可以得到我们想要的字符串了。实现:因为这原创 2015-07-30 20:06:46 · 520 阅读 · 0 评论 -
栈和队列的java实现
栈单链表实现:没有长度限制,并且出栈和入栈速度都很快[java] view plaincopypublic class LinkedList { private class Data{ private Object obj; private Data next = null;转载 2015-08-12 16:36:48 · 382 阅读 · 0 评论 -
LSM树 VS B+树
LSM树是HBase里非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。1 B+树相信大家对B+树已经非常的熟悉,比如Oracle的普通索引就是采用B+树的方式,下面是一个B+树的例子:根节点和枝节点很简单,分别记录每个叶子节点的最小值,并用一个指针指向叶子节点。叶子节点里每个键值都指向真正的数据块(如Oracle里的RowID),每个叶子节点都转载 2014-10-21 13:04:22 · 572 阅读 · 0 评论 -
哈希表(HashMap)分析及实现(JAVA)
探讨Hash表中的一些原理/概念,及根据这些原理/概念,自己设计一个用来存放/查找数据的Hash表,并且与JDK中的HashMap类进行比较。我们分一下七个步骤来进行。 一。 Hash表概念二 . Hash构造函数的方法,及适用范围三. Hash处理冲突方法,各自特征四. Hash查找过程五. 实现一个使用Hash存数据的场景--Hash查找算法,插入算法六. JDK中转载 2014-12-02 09:24:26 · 349 阅读 · 0 评论 -
哈希表
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。 对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树转载 2015-02-10 15:12:09 · 400 阅读 · 0 评论 -
程序员必知的8大排序(一)-------插入排序,希尔排序(java实现)
前几天,看到一篇前辈的博文“程序员必知的8大排序”,不禁的手痒起来,重新翻开严蔚敏老师的《数据结构》复习了一遍,然后一一的用java去实现,其中有不足之处,还望各位道友指正出来。 先来看看8种排序之间的关系: 1, 直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序转载 2015-07-11 17:22:07 · 507 阅读 · 0 评论 -
程序员必知的8大排序(三)-------简单选择排序,堆排序(java实现)
5.简单选择排序(1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。(2)实例:(3)用java实现[plain] view plaincopypublic class selectS转载 2015-07-12 11:03:53 · 530 阅读 · 0 评论 -
程序员必知的8大排序(二)-------冒泡排序,快速排序(java实现)
5.冒泡排序(1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。(2)实例:(3)用java实现[plain] view plaincopypublic cl转载 2015-07-12 10:21:13 · 440 阅读 · 0 评论 -
数据结构复习--java实现单链表基本操作
单链表的基本操作包括建立单链表、查找运算(按序查找和按值查找)、插入运算(前插和后插)和删除运算。下面给出具体的java实现程序:package com.zpp.test;//首先创建一个节点类public class Node { private Node next; //指针域 private int data;//数据域 public Nod原创 2015-08-09 21:01:58 · 887 阅读 · 0 评论 -
程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
7、归并排序(1)归并排序是一个分治算法(Divide and Conquer)的一个典型实例,把一个数组分为两个大小相近(最多差一个)的子数组,分别把子数组都排好序之后通过归并(Merge)手法合成一个大的排好序的数组,归并的过程依然用扑克来解释,想象一下桌子上有两堆排好序(从小到大)的牌,每一次从两堆里面各抽取一张,比较一下两张的大小,如果两张一样大,都取出放到目标数组,否则取出较小的转载 2015-07-13 19:36:54 · 432 阅读 · 0 评论 -
跳表
为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前转载 2015-07-29 17:46:00 · 344 阅读 · 0 评论 -
字符串全排列算法理解与java实现
字符串全排列算法问题描述:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba解题思路(这部分参考http://www.cnblogs.com/cxjchen/p/3932949.html):如果能生成n-1个元素的全排列,就能生成n个元素的全排列。对于只有一个元素的集合,可以原创 2015-08-13 19:51:16 · 1927 阅读 · 0 评论 -
32位和64位系统区别及常用数据类型所占字节数
一)64位系统和32位有什么区别? 1、64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存2、64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统,64bit软件的基础上的。 什么是64位处理器?之所以叫做“64位处理器”,是因为电脑内部都是实行2进制运算,处理器(C转载 2015-08-11 19:57:42 · 1043 阅读 · 1 评论 -
常见链表面试题总结
1. 从无序链表中删除重复元素 来源 Cracking the Code Interview (2nd Edition) Ch2 Q1.【解答】:题目已经明确说明是无序列表,对这类面试题,一般最差的复杂度是 O(NlogN),也就是需要一次排序过程,所以给出的答案最好要优于O(NlogN)。方法一:除去重复元素,首先想到利用hash。将List迭代一遍,每拿出一个元素,原创 2015-08-10 11:04:04 · 608 阅读 · 0 评论 -
KMP算法初探
关于字符串的算法,很早就知道KMP算法,但是一直没有理解,正好这个假期没多少事,可以好好琢磨一下这个算法。下面结合一道题目来说明KMP算法要解决的问题。【题目】 给定两个字符串str和match,长度分别为N和M。实现一个算法,如果字符串str中含有字串match,则返回match在str中的开始位置,不含有则返回-1。 【举例】 str=“acbc”,match=“bc”。返回2原创 2015-10-01 11:58:12 · 463 阅读 · 0 评论