多路查找树(2-3 树、2-3-4 树、B 树、B+ 树)

本文参考自《大话数据结构》 计算机中数据的存储 一般而言,我们都是在内存中处理数据,但假如我们要操作的数据集非常大,内存无法处理了,在这种情况下对数据的处理需要不断地从硬盘等存储设备中调入或调出内存页面。 对外存设备的读写,效率并不乐观。为了降低对外存设备的访问次数,我们需要新的数据结构来处理这个问 ... »

用 Java 实现的八种常用排序算法

八种排序算法可以按照如图分类 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的。 1. 冒泡排序 冒泡排序是一种简单的交换排序算法,以升序排序为例,其核心思想是: 从第一个元素开始,比较相邻的两个元素。如果第一个比第二个大,则进行交换。 轮 ... »

斐波那契数列 - 递归和递归优化

斐波那契数列,即兔子问题;算法笔试题可能会出现; function fun($n){ if($n==1||$n==2){ return 1; } return fun($n-1) + fun($n-2); } 性能问题: 1,自身嵌套太深,可能会引起堆栈溢出; 函数调用会使用栈来保存临时变量。每调用 ... »

排序二叉树和平衡二叉树

概述 对于一组元素 [7, 3, 10, 12, 5, 1, 9] 可以有很多种存储方式,但无论使用哪种数据结构,都或多或少有缺陷。比如使用线性结构存储,排序方便,但查找效率低。二叉排序树的特点就是能在保证元素有序的同时,提高查找的效率。 二叉排序树的定义 二叉排序树,也叫二叉查找树,二叉搜索树,英 ... »

二叉树的创建与遍历(递归实现)

在树的基本概念和术语总结一文中介绍了二叉树的基本结构。 在不知道怎样用递归?按步骤来!一文中介绍了如何使用递归。 二叉树的结构是递归的,所以创建、遍历也可以通过递归实现。 下面是一颗二叉树: 结点的定义: public class Node { Integer value; Node leftChi ... »

hashMap探析

本篇文章包括: 数据结构 各个参数 为什么数组的长度是2的整数次方 为什么要将装载因子定义为0.75 为什么链表转红黑树的阈值为8 hash碰撞 put方法 resize方法 jdk7中数组扩容产生环的问题。 1.底层数据结构? 红黑树 是一种接近二叉平衡树的数据结构,有5个性质: 性质1:每个节点 ... »

面试中很值得聊的二叉树遍历方法——Morris遍历

Morri遍历 通过利用空闲指针的方式,来节省空间。时间复杂度O(N),额外空间复杂度O(1)。普通的非递归和递归方法的额外空间和树的高度有关,递归的过程涉及到系统压栈,非递归需要自己申请栈空间,都具有O(N)的额外空间复杂度。 Morri遍历的原则: 1. 假设当前节点为cur, 2. 如果cur ... »

冒泡排序|插入排序

冒泡排序|插入排序 标签(空格分隔): 数据结构和算法 冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作 $array = [ ... »

JS数据结构第四篇 --- 栈

一、什么是数据结构栈 在数据结构中有一个栈结构,在内存空间中也有一个栈空间,这两个”栈“是两个不同的概念。这篇我们说的是数据结构中的栈。栈是一种特殊的线性表,特殊性在哪?就是只能在栈顶进行操作,往栈顶添加元素,一般叫push, 入栈;从栈顶移除元素,一般叫pop, 出栈,操作如图: 这个特征叫”后进 ... »

JS数据结构第三篇---双向链表和循环链表之约瑟夫问题

一、双向链表 在上文《JS数据结构第二篇 链表》中描述的是单向链表。单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地址。然后头结点的上一个节点,和尾结点的下一个节点都指向null。同时LinkedList类中再增加一个last内部属 ... »

JavaScript数据结构 之 链表

一、什么是链表 链表是一种链式存储的线性表,是由一组节点组成的集合,每一个节点都存储了下一个节点的地址;指向另一个节点的引用叫链;和数组中的元素内存地址是连续的相比,链表中的所有元素的内存地址不一定是连续的。结构模拟如图: 一般来说,说到链表,就要提下数组,一般链表都是和数组进行对比。 在很多编程语 ... »

数组

1.什么是数组? 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 2.数组的插入和删除 数组的插入最好时间复杂度为O(1),最坏的时间复杂度为O(n),平均时间复杂度为O(n). 数组插入的改善方法:当数组存储的无序数据时,可以将插入的值直接放入,把替 ... »

复杂度分析(下)

1.复杂分析度 复杂分析度又分为 最好情况时间复杂度(best case time complexity):在最理想的情况下,执行一段代码的时间复杂度. 最坏情况时间复杂度(worst case time complexity):在最糟糕的情况下,执行一段代码的时间复杂度. 平均情况时间复杂度(av ... »

快速排序

首先介绍D&C递归 快速排序的思想是:分而治之(divide and conquer,D&C)一种递归式问题解决思路 这里先介绍D&C的工作原理 1)找出简单的基线条件 2)确定如何缩小问题的规模,使其符合基线条件。 看一个例子。 给定一个数组 {2 4 6},把这些数组相加返回一个结果,使用循环很 ... »

跳跃表

title: 跳跃表 date: 2018/11/6 16:51:28 categories: 数据结构 最近在看redis方面的书籍,碰到了跳跃表这个数据结构。常规的单向链表在进行增删改查时,只能从头结点开始遍历,时间复杂度O(N),而跳跃表采用了二分法的思想,平均时间复杂度可以做到O(logN) ... »

js 单项链表

介绍链表 链表是由一组节点组成的集合。每一个节点都使用一个对象的引用指向它的后续借点。指向另外一个借点的引用叫做链。 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难。只能说在部分变成语言中会有这种情况,在javasc ... »

LRU的理解与Java实现

简介 LRU(Least Recently Used)直译为“最近最少使用”。其实很多老外发明的词直译过来对于我们来说并不是特别好理解,甚至有些词并不在国人的思维模式之内,比如快速排序中的Pivot,模拟信号中的Analog 等等。笔者认为最好的理解方式就是看他诞生的原因,看这个概念的出现如何一步一 ... »

快速排序(Quick Sort)

基本思想: 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对着两部分记录进行排序,以达到整体有序的目的。 通俗点说就是: 在待排记录中找出一个记录,然后想办法将它放到一个位置,是得它左边的值都比他小,右边的值都比他大(正序或者倒序),把这个记录称作枢 ... »

2018第九届蓝桥杯C/C++B组决赛试题

算法蒟蒻,拿个三等奖也正常,不过逛了大半个北京还是挺好玩了。 六月份也没事干,重新做做。 第一题 标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种。 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。 小明有点强迫症,他坚持要求200元换出 ... »