随笔分类 - 数据结构与算法分析
1
韦斯 (Mark Allen Weiss) 《数据结构与算法分析》读书笔记,记录比较简短,可做参考。
摘要:冲突解决的策略 尽管散列函数的目标是使得冲突最少,但实际上冲突是无法避免的。因此,我们必须研究冲突解决策略。冲突解决技术可以分为两类:开散列方法( open hashing,也称为拉链法,separate chaining )和闭散列方法( closed hashing,也称为开地址方法,open
阅读全文
摘要:散列表 散列表是一个包含关键字的具有固定大小的数组,表的大小记为 tablesize 。每个关键字被映射到0到 tablesize 中的某个数,并被放到适当的单元中,这个映射称为散列函数。散列函数应尽可能地在单元之间均匀分配关键字。最后还需要解决关键字冲突的情况,即映射到同一个值。 通常需要均匀的分
阅读全文
摘要:散列函数 在以下的讨论中,我们假设处理的是值为整型的关键码,否则我们总可以建立一种关键码与正整数之间的一一对应关系,从而把该关键码的检索转化为对与其对应的正整数的检索;同时,进一步假定散列函数的值落在0到M-1之间。散列函数的选取原则是:运算尽可能简单;函数的值域必须在散列表的范围内;尽可能使得结点
阅读全文
摘要:0)引论 左堆的合并,插入,删除最小的时间复杂度为O(logN)。二项队列就是为了对这些结果进一步提高的一种数据结构。利用二项队列,这三种操作的最坏时间复杂度为O(logN),但是插入的平均时间复杂度为O(1)。 1)二项队列 二项队列不是一棵树,它是一个森林,由一组堆序的树组成的深林,叫做二项队列
阅读全文
摘要:简介 设计一种堆结构像二叉堆那样高效的支持合并操作而且只使用一个数组似乎很困难。原因在于,合并似乎需要把一个数组拷贝到另一个数组中去,对于相同大小的堆,这将花费O(N)。正因为如此,所有支持高效合并的高级数据结构都需要使用指针。 像二叉堆那样,左式堆也有结构性和堆序性。不仅如此,左式堆也是二叉树,它
阅读全文
摘要:d-堆 二叉堆因为实现简单,因此在需要优先队列的时候几乎总是使用二叉堆。d-堆是二叉堆的简单推广,它恰像一个二叉堆,只是所有的节点都有d个儿子(因此,二叉堆又叫2-堆)。下图表示的是一个3-堆。注意,d-堆要比二叉堆浅得多,它将Insert操作的运行时间改进为。然而,对于大的d,DeleteMin操
阅读全文
摘要:二叉堆简介: 优先队列是先进先出的模型 二叉堆是实现优先队列的一种常用的方式,以下简称堆 二叉堆是一颗完全填满的二叉树,完全二叉树的高为log(N) 我们可以用一个数组表示完全二叉树(二叉堆) 在这个数组中,对于任意i位置的元素,其左孩子在2i的位置上,其右孩子在2i+1位置上,其父节点在i/2位置
阅读全文
摘要:B树可以分成很多种, B-树(通常也只称为B树)是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2.根结点的儿子数为2到M个; 3.除根结点以外的非叶子结点的儿子数为M/2到M个; 4.每个结点存放至少M/2-1(取上整 5/2=2)和至多M-1个关键字;(至
阅读全文
摘要:本文为转载文章 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! 我们讨论过,树的搜索效率与树的深度有关。二叉搜索树的深度可能为n,这种情况下,每次搜索的复杂度为n的量级。AVL树通过动态平衡树的深度,单次搜索的复杂度为log(n)
阅读全文
摘要:每次检索某个节点,进行旋转,保证可能经常需要检索的节点深度不为logN, 平均检索M次的平均时间为MlogN 插入位置和最近不平衡结点成一字型, 对插入位置的父节点进行单旋转 插入位置和根节点距离为1 对根节点进行单旋转 插入位置和最近不平衡位置成之字型, 先对插入位置的父节点进行单旋转 在对祖父节
阅读全文
摘要:1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差的绝对值可能会超过1,称之为不平衡。 而在平衡二叉树中,任何结点的左右子树高度之差的绝对值会小于等于 1。 1,AVL树又称平衡二叉树,它首先是一颗二叉查找树,但在二叉查找树中,某个结点的左右子树高度之差
阅读全文
摘要:二叉查找树是一种有规律排列树中数据的树形结构 规则: 所有小于节点的数据都成为左子树,所有大于节点的数据都成为右子树。 1.contains方法 方法遍历使用了递归的形式 分为三步 1.根节点是否为空,为空返回空,不为空继续 2.判断这个数据比节点数据大小,大向左子树递归 3.小,向右子树递归 2.
阅读全文
摘要:二叉搜索树的深度与搜索效率 二叉搜索树也可称为二叉查找树,它的常用方法可以参考:二叉查找树 我们在树, 二叉树, 二叉搜索树中提到,一个有n个节点的二叉树,它的最小深度为log(n),最大深度为n。比如下面两个二叉树: 深度为n的二叉树 深度为log(n)的二叉树 这两个二叉树同时也是二叉搜索树(参
阅读全文
摘要:链表的两种底层结构 1.ArrayList实现单链表(其实就是一个顺序数组) 关于java实现ArrayList的方法:java实现ArrayList ArrayList其实就是一组长度可变的数组,当实例化了一个ArrayList,该数据也被实例化了,当向集合中添加对象时,数组的大小也随着改变,这样
阅读全文
摘要:队列是先进先出的结构,栈是先进后出的数据结构 队列的数组实现图示: 循环实现,头指针-1=尾指针,说明队列空 进队:2413,出队:2413 队列的应用 文件服务器 电话接线问题 并且队列在很多软件的功能中都有应用,比如线程的等待等;
阅读全文
摘要:栈是一个先进后出的结构,队列是先进先出的结构 栈有两种实现方式 1.链表实现 2.数组实现 栈的应用 1.平衡符号的检测,比如eclipse中{ }大括号是否成对出现 2.后缀表达式的算法(详情见书中内容,比较简单) 3.中缀表达式的算法,先转换成后缀表达式,然后在进行计算(略复杂,详情见书中内容)
阅读全文
摘要:相对于ArrayList的数组结构,linkedList是链表结构; 结构:LinkedList是一个双链表的结构,每一个节点上,都有指向前一个元素和后一个元素的指针存储着地址, 并且有两个头尾节点,用来标记开始和结束。 LinkedList代码实现并不复杂,重要的是理解增删的链接变化思想。 nod
阅读全文
摘要:这一节共阐述了四种实现ArrayList的方法,但是都是逐渐的接近第四种这样的完美代码 根于linkedlist可以查看:linkedlist实现 1.基本的ArrayList发方法都实现了,但是迭代器并不完美 2. 1号迭代器将本类和迭代器类分开放,迭代器不能访问本类内部的成员 2号迭代器虽然创建
阅读全文
摘要:1、iterator是有remove方法的,并且在使用iterator的过程中,不能自行调用collection的增删改方法 而可以利用iterator的remove方法来删除。 2、list就是一个表,ArrayList是一个单链表,LinkedList是一个双链表; 3、 4、使用Iterato
阅读全文
1

浙公网安备 33010602011771号