随笔分类 - 数据结构与算法
摘要:简介 在二叉树中的叶子结点存在两个左右子树为空的指针域,对于有n个结点的二叉树,就有n+1个空指针域。如果将这些空指针域存放某种遍历次序下该节点的前驱结点和后继节点,则将这些指针的指向称为线索,加上线索的二叉树称为线索化二叉树 例如下图的二叉树中前序遍历结果为 1,3,8,10,6,14,其中对于叶
阅读全文
摘要:简介 二叉树的存储结构有两种,分别为顺序存储和链式存储 采用顺序存储。指的是使用顺序表(数组)存储二叉树。需要注意的是,顺序存储只适用于完全二叉树 顺序存储的完全二叉树的特征(n表示二叉树中第几个元素,按0开始编号) 第n个元素的左子节点为2n+1 第n个元素的右子节点为2n+2 第n个元素的父节点
阅读全文
摘要:树的定义 树是由n(n>=0,n=0时称为空树)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 树具有以下特点 每个结点有零个或多个子结点,比如:B结点有一个D字节点,G结点没有子节点 没有父结点的结点为根结点,比如:A结点 每一个非
阅读全文
摘要:简介 散列表(也称哈希表),是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表 它可以快速的进行插入、查找、删除操作,无论数据量有多大,它都能把插入、查找和删除操作
阅读全文
摘要:斐波那契数列 斐波那契数列,又称黄金分割数列,因数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、…… 在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n
阅读全文
摘要:简介 插值查找算法类似于二分查找,必须是有序列表,不同的是插值查找每次从自适应mid(即获取数组中间的索引)处开始查找 将二分查找(即折半查找)中的求 mid 索引(即获取数组中间的索引)的公式: mid = left + (right - left) / 2 改成 mid = left + (ta
阅读全文
摘要:简介 二分查找又称折半查找、二分搜索、折半搜索等,是在分治算法基础上演变的查找算法 二分查找算法仅适用于有序序列,它只能用在升序序列或者降序序列中查找目标元素 二分查找局限性 依赖数组结构 二分查找需要利用下标随机访问元素,如果使用链表等其他数据结构则无法实现二分查找 针对有序的数据 二分查找需要的
阅读全文
摘要:简介 基数排序可以从低位(个位)开始,根据个位数排序一次,然后根据十位数排序,再根据百位数进行排序……最终完成整个数组的排序 对于十进制数而言,每一位只会是 0~9 这十个数字,通常使用桶排序(计数排序)来完成每一位数的排序 此种排序一般适用于为整数类型的情况。所有对于字符串和文字排序不适合 排序图
阅读全文
摘要:简介 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并 排序图解 从图中可以看出,对原数组进行拆分成两个子数组,然后对每个子数组继续
阅读全文
摘要:简介 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 排序图解 从图中可以看出,每进行一次快速排序都
阅读全文
摘要:简介 希尔排序是插入排序的一种,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本 排序图解 从图中可以看出每一趟排序中都分成 gap 组,每组都有 gap + 1 个元素,对每一组中的 arr[j] 和 arr[j - gap] 进行比较,如果 arr[j] < arr[j - gap]
阅读全文
摘要:排序图解 从图中可以看出,待排序的数组分为两个子数组,其中一个子数组认为是有序的,另一个数组认为是无序的。从无序的子数组取出前一个元素,在有序的子数组从后往前进行比较,找到待插入的位置 需要排序的趟次 = 数组长度 - 1 排序原理 把待排序的数组分为两组,已排序的和未排序的两个子数组 找到未排序的
阅读全文
摘要:排序图解 从图中可以看出,每一趟排序都把最小(或最大)的元素,放在前一个已排好序的最小(或最大)的元素的后面 需要排序的趟次 = 数组长度 - 1 排序原理 遍历元素找到一个最小(或最大)的元素,把它放在第一个位置,然后再从剩余元素中找到最小(或最大)的元素,把它放在第二位置,依次类推,最后完成排序
阅读全文
摘要:图解冒泡排序 从图中可知,每一次冒泡都将该次排序中最大的值放到最后适当的位置 需要冒泡的次数 = 数组的长度 - 1 排序原理 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置 对每一对相邻元素做同样的步骤,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值 重复
阅读全文
摘要:内部排序 指需要将处理的所有数据都加载到内部存储器(内存)中进行排序 外部排序 由于数据量过大,无法直接全部加载到内存中,需要借助外部存储(文件等)进行排序
阅读全文
摘要:时间复杂度 要计算算法时间耗费情况,首先得度量算法的执行时间,那么如何度量呢? 事后分析估算方法 比较容易想到的方法就是把算法执行若干次,用计算机计时。这种统计方法主要是通过设计好的测试程序和测试数据,利用计算机计时器对不同的算法编制的程序的运行时间进行比较,从而确定算法效率的高低,但是这种方法有很
阅读全文
摘要:简介 定义:定义方法时,在方法内部调用方法本身,称之为递归 作用:它通常把一个大型复杂的问题,层层转换为一个与原问题相似的,规模较小的问题来求解。递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量 递归规则: 执行一个方法时,就创建一个新的受保护的独立空间(栈
阅读全文
摘要:简介 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元,依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系 顺序表API设计 为该顺序表设计几个常
阅读全文
摘要:简介 单链表的反转,面试中的一个高频题目。当然也有很多变体,比如以k个结点为一组进行翻转链表的 需求 原链表中数据为:1->2->3->4 反转后链表中数据为:4->3->2->1 实现 反转链表是有2种方法(递归法,遍历法)实现的 节点类设计 public class Node{ /**存储元素*
阅读全文
摘要:简介 链表是一种物理存储单元上非连续、非顺序的存储结构,其物理结构不能表示数据元素的逻辑顺序,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列的结点(链表中的每一个元素称为结点)组成,结点可以在运行时动态生成 节点类设计 按照面向对象的思想,可以设计一个类,来描述结点这个事物,用一个
阅读全文