版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 之前的篇章主要讲解了数据结构中的线性结构,所谓线性结构就是数据与数据之间是一对一的关系,接下来我们就要进入非线性结构的世界了,主要是树与图,好了接下来我们将会了解到树以及二叉树,二叉平衡树,赫夫曼树等原理以及java代码的实现,先从最基础的开始学习吧. 一.树 树的定义: 树是n(n>=0)个结点的有限集合. 当n=0时,集合为空,称为空树. 在任意一颗非空树中,有且仅有一个特定的结点称为根. 当n>1时,除根结点以外的其余结点可分成m(m…
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出来. 言归正传,开启本篇的正文. 一.什么是赫夫曼树 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 以上来自百度百科,相信完全不了解的同学看…
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 一.前言 项目进入收尾阶段,忙忙碌碌将近一个多月吧,还好,不算太难,就是麻烦点. 数据结构与算法这个系列早就想写了,一是梳理总结,顺便逼迫自己把一些模模糊糊的概念弄明白,最重要的我觉得数据结构与算法平时我们总是接触,什么ArrayList,LinkedList,HashMap...这些我们总是接触,但是在使用的时候有多少是会考虑一下性能方面问题,是不是你也不管三七二十一上来就是ArrayList,往里面扔数据呗,反正运行一般没问题,就像写文章…
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 上一篇基于哈希表实现HashMap核心源码彻底分析 分析了HashMap的源码,主要分析了扩容机制,如果感兴趣的可以去看看,扩容机制那几行最难懂的代码真是花费了我很大的精力. 好了本篇我们分析一下HashMap的儿子LinkedHashMap的核心源码,提到LinkedHashMap做安卓的同学肯定会想到Lru(Least Recently Used)算法,Lru算法就是基于LinkedHashMap来实现的,明白了LinkedHashMap…
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 存储键值对我们首先想到HashMap,它的底层基于哈希表,采用数组存储数据,使用链表来解决哈希碰撞,它是线程不安全的,并且存储的key只能有一个为null,在安卓中如果数据量比较小(小于一千),建议使用SparseArray和ArrayMap,内存,查找性能方面会有提升,如果数据量比较大,几万,甚至几十万以上还是使用HashMap吧.本篇只详细分析HashMap的源码,SparseArray和ArrayMap不在本篇讨论范围内,后续会单独分析…
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. LinkedList 是一个双向链表.它可以被当作堆栈.队列或双端队列进行操作.LinkedList相对于ArrayList来说,添加,删除元素效率更高,ArrayList添加删除元素的话需移动数组元素,甚至还需要考虑到扩容数组长度. 一.LinkedList中成员变量及每个节点信息 源码如下: transient int size = 0; transient Link<E> voidLink; private static final…
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本片我们分析基础数组的实现--ArrayList,不会分析整个集合的继承体系,这不是本系列文章重点. 源码分析都是基于"安卓版"的源码,和java原生版核心思想都是差不多的.好了,废话依然少说,进入正文. 一.ArrayList中成员变量 源码: /** * The minimum amount by which the capacity of an ArrayList will increase. * This tuning pa…
本文目录 前两篇文章我们学习了一些树的基本概念以及常用操作,本篇我们了解一下二叉树的一种特殊形式:二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 一.二叉排序树定义 二叉排序树或者是一颗空树,或者是具有下列性质的二叉树: 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值 若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值 它的左,右子树也分别为二叉排序树 也就是说二叉排序树中左子树结点值均小于根结…
今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历中,我们需要使用队列来记录每个节点的相邻节点,以便可以在接下来最先访问它们,从而实现广度优先遍历. 在 JavaScript 事件循环(Event Loop)中有一个事件队列(Task Queue),也是先进先出来处理各种异步事件. 在生活中,队列可以映射排队打饭等先来后到的场景. 用 JavaSc…
关于AVL树的简单介绍能够參考:数据结构与算法--AVL树简单介绍 关于二叉搜索树(也称为二叉查找树)能够參考:数据结构与算法--二叉查找树类的C++实现 AVL-tree是一个"加上了额外平衡条件"的二叉搜索树,其平衡条件的建立是为了确保整棵树的深度为O(logN).要求不论什么节点的左右子树高度相差最多1. 该AVL树结点的数据结构: struct AvlNode{ Comparable element; AvlNode * left; AvlNode * right; int h…
什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的,但是代码一般从顶点开始执行操作 本文会讲述一种特殊的树--二叉树,每个节点最多有两个子节点.普通的树,节点可以多于两个,称为多路树/多叉树 树的术语: 1.路径:顺着节点的边从一个节点走到另一个节点,所经过的节点的顺序排列就称为“路径” 2.根:树顶端的节点称为根.一棵树只有一个根,如果要把一个节点…
今天,我们要讲的是数据结构与算法中的集合. 集合简介 什么是集合?与栈.队列.链表这些顺序数据结构不同,集合是一种无序且唯一的数据结构.集合有什么用?在 Python 中,我经常使用集合来给数组去重: >>> list(set([1,1,2])) [1, 2] 当然,ES6中也实现了集合--Set,那么 JavaScript 集合风格的数组去重应该是这样: function remove_duplicates_es6(arr) { let s = new Set(arr); let it…
很大部分转载自 https://blog.csdn.net/singit/article/details/54898316 数据的逻辑结构:反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关. 逻辑结构包括: 集合:数据结构中的元素之间除了“同属一个集合”的相互关系外,别无其他关系. 线性结构:数据结构中的元素存在一对一的相互关系 树形结构:数据结构中的元素存在一对多的相互关系 图形结构:数据结构中的元素存在多对多的相互关系 数据的物…
今天,我们要讲的是数据结构与算法中的栈. 栈的简介 栈是什么?栈是一个后进先出(LIFO)的数据结构.栈有啥作用?栈可以模拟算法或生活中的一些后进先出的场景,比如: 十进制转二进制,你需要将余数倒序输出. 二叉树的先中后序非递归遍历都用到了栈. 在生活中,栈可以模拟煤炉与蜂窝煤等场景. 用 JavaScript 写一个栈类 对于 JavaScript 工程师来说,没必要在开发中实现一个栈.因为 JavaScript 的内置对象 Array 已经实现了栈的相关方法.不过,好的程序员不能光用别人设计…
今天,我们要讲的是数据结构与算法中的链表. 链表简介 链表是什么?链表是一种动态的数据结构,这意味着我们可以任意增删元素,它会按需扩容.为何要使用链表?下面列举一些链表的用途: 因为数组的存储有缺陷:增删元素时往往需要移动元素.而链表在内存中的放置并不是连续的,元素通过 next 属性指向下个元素,所以链表增删元素,不需要移动元素,只需要更改 next 的指向即可. 在生活中,最形象的链表莫过于火车了,车头是 head,每一节车厢都有一个 next 用于连接后面的车厢,想增删车厢,只需要更改 n…
5.1  树和二叉树的定义 树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0):或为非空树,对于非空树T:(1)有且仅有一个称之为根的结点:(2)除根结点以外的其余结点可分为m(m>0)个互不相交的有限集T1, T2, -, Tm, 其中每一个集合本身又是一棵树,并且称为根的子树(SubTree). 二叉树的定义 二叉树(Binary Tree)是n(n≥0)个结点所构成的集合,它或为空树(n = 0):或为非空树,对于非空树T:(1)有且仅有一个称之为根的结点:(2)除根结点…
接下来我们将会介绍另外一种数据结构——树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的.同理,删除数据也是. 然后我们介绍了另外一种数据结构——链表,链表的插入和删除很快,我…
三.树和二叉树 1.树 2.二叉树 3.遍历二叉树和线索二叉树 4.赫夫曼树及应用 树和二叉树 树状结构是一种常用的非线性结构,元素之间有分支和层次关系,除了树根元素无前驱外,其它元素都有唯一前驱. 非空树中节点特征: (1)只有一个根节点,它只有直接后继,但没有直接前驱: (2)元素个数n>1时,其余节点可分为m个互不相交的有限集合.每一个集合本身又是一棵树,称为根的子树.子树的根节点只有一个直接前驱,可以有任意个直接后继. 基本术语 结点:包含数据元素以及逻辑关系信息. 结点的度:节点拥有的…
五.KMP算法:    *KMP算法是一种改进的字符串匹配算法.    *KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.    例如:在BBC ABCDAB ABCDABCDABDE中找到ABCDABD    KMP算法的想法是,利用已经知道的前面六个字符"ABCDAB",不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率. …
Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,PATRICIA tree,以及bitwise版本的crit-bit tree.当然很多名字的意义其实有交叉. Trie树是一种非常重要的数据结构,它在信息检索,字符串匹配等领域有广泛的应用,同时,它也是很多算法和复杂数据结构的基础,如后缀树,AC自动机等. 典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 它的优点是:最大限度地减少无谓的字符串比较,查…
数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数组的存储结构: 以为数组:的存储单元地址是连续的. java中数组是静态的.当数组被初始化之后,该数组所占的内存空间.数组长度都是不可变的.java中的数组必须经过初始化之后才可以使用. 数组初始化的两种方式: 静态初始化:初始化时,我们显示的指定每个数组元素的初始值,由系统决定数组的长度. 动态初…
// 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的.每个 // 元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成.下图展 // 示了一个链表的结构: // 相对于传统的数组,链表的一个好处在于,添加或移除元素的时候不需要移动其他元素.然 // 而,链表需要使用指针,因此实现链表时需要额外注意.数组的另一个细节是可以直接访问任何 // 位置的任何元素,而要想访问链表中间的一个元素,需要从起点(表头)开始迭代列表直到找到 // 所需的元素.…
头文件 typedef int ElementType; #ifndef _AVLTREE_H_ #define _AVLTREE_H_ struct AvlNode; typedef struct AvlNode *Position; typedef struct AvlNode *AvlTree; AvlTree MakeEmpty(AvlTree T); Position Find(ElementType X, AvlTree T); Position FindMin(AvlTree T)…
class TrieTree(): def __init__(self): self.root = {} def addNode(self,str): # 树中每个结点(除根节点),包含到该结点的单词数,以及该结点后面出现字母的键 nowdict = self.root for i in range(len(str)): if str[i] not in nowdict: # 发现新的组合方式 nowdict[str[i]] = {'count':0,'prefix':str[:i+1]} no…
❗❗ 必看经验 在博主刷题期间,基本上是碰到一道二叉树就不会碰到一道就不会,有时候一个下午都在搞一道题,看别人解题思路就算能看懂,自己写就呵呵了.一气之下不刷了,改而先去把二叉树的基础算法给搞搞懂,然后又去把剑指offer里所有关于二叉树的题目挑了出来做,越不会就越把自己往奔溃的边缘虐.还别说,这一搞,神清气爽.也怪之前什么基础准备都没有就直接去题库里挑战题目了. 在这里想说的是,在刷题之前一定得先有自己的知识储备,比如说最起初的数据结构总得会吧,或者说基础的数据结构里都有些啥啥时重点之类的.别…
一.二叉树的遍历 以某种特定顺序访问树中所有的节点称为树的遍历,遍历二叉树可分深度优先遍历和广度优先遍历. 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.可以细分为先序遍历.中序遍历.后序遍历. 深度优先遍历 先序遍历 中序遍历 后序遍历 解释 对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树. 即根节点->左子树->右子树. 对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树. 即左子树->根节点->右子树. 对任一子树,先遍历…
1.  概念 二叉树节点的结构: class Node{ int value; // value表示二叉树的节点值 Node left; Node right; // left和right表示二叉树的两个孩子 Node(int data){ this.value = data; } } 如图: 2.  二叉数的遍历 2.1  按顺序遍历二叉树 先序遍历:中.左.右 中序遍历:左.中.右 后序遍历:左.右.中 以下图二叉树为例: 先序遍历结果为: 1 ,2,4,5,3,6,7 中序遍历结果为: 4…
数据结构与算法(一):基础简介 数据结构与算法(二):基于数组的实现ArrayList源码彻底分析 数据结构与算法(三):基于链表的实现LinkedList源码彻底分析 数据结构与算法(四):基于哈希表实现HashMap核心源码彻底分析 数据结构与算法(五):LinkedHashMap核心源码彻底分析 数据结构与算法(六):树与二叉树 数据结构与算法(七):赫夫曼树 数据结构与算法(八):二叉排序树 本文目录 一.二叉排序树性能问题 在上一篇中我们提到过二叉排序树构造可能出现的性能问题,比如我们…
在上篇博客中,学习了二分搜索树:Java数据结构和算法(六)--二叉树,但是二分搜索树本身存在一个问题: 如果现在插入的数据为1,2,3,4,5,6,这样有序的数据,或者是逆序 这种情况下的二分搜索树和链表几乎完全一样,是最不平衡的二叉树了,二分搜索树的效率直接降到最低 如何解决上述问题: 使二分搜索树保持平衡二叉树的特征,而今天要讲述的AVL树是最经典的平衡二叉树了 满二叉树: 除了叶子节点其余节点都有左右两个子节点的树 完全二叉树: 对于一个树高为h的二叉树,如果其第0层至第h-1层的节点都…
最近忙着准备各种笔试的东西,主要看什么数据结构啊,算法啦,balahbalah啊,以前一直就没看过这些,就挑了本简单的<啊哈算法>入门,不过里面的数据结构和算法都是用C语言写的,而自己对python相对比较熟悉,而且感觉用python实现数据结构相对容易一点.就把这个月来学到的一些,整理一下做个月底总结. 涉及到的书有<啊哈算法>.<复杂性思考>.<数据结构基础(C语言版) 第二版>.<Python Algorithms>,以及其他大牛们的网上教…