在追求知识的路上永不停息,为了人类心智的荣耀。披荆斩棘吧,放弃的那一刻是容易的,而此后则是无尽的黑暗,坚持的那一刻是痛苦的,而此后力量会喷薄而来。
散列又称词典(dictionary),在讨论这部分内容时我们将看到散列实际上并不是一种简单的技术,从某种意义上讲它甚至是一种思想,是一种赖以高效组织数据,并实现相关算法的重要思想。接下来我们就会看到,在这种思想背后的原理,是如此的直观和简单。
话说这个系列鸽了好久,之前在准备语言考试,就没管博客了,现在暑假咱们继续上路! 每当我们进行一次插入之后,整棵AVL树的平衡性就有可能发生改变,为了控制整棵树的高度,我们需要通过一系列变换(重平衡)来保证它仍满足AVL的平衡条件。
AVL树是有平衡条件的二叉搜索树。这个平衡条件必须容易保持,而且需要保证树的深度是O(logN)。 AVL=BBST 作为二叉搜索树的最后一部分,我们来介绍最为经典的一种平衡二叉搜索树:AVL树。
极端退化 前面所提到的二叉搜索树,已经为我们对数据集进行高效的静态和动态操作打开了一扇新的大门。正如我们所看到的,BST从策略上可以看作是将之前的向量(动态数组)和链表结构的优势结合起来,不过多少令我们有些失望的是:目前所实现的BST还有些稚嫩,表现在它的时间复杂度在极端情况仍未得到有效的控制。
前言:常见的数据结构都有指针和数组两种实现方式,这篇先介绍指针实现,而数组实现在后续文章里会讲到。 (长文预警!) 说完了一般的树,我们再来看看二叉树,这是一种很典型的树,它的所有节点度数都不超过2,最多只有两个孩子。
这一次将以树作为主题,来讨论相关的术语和操作。而无论在学什么东西之前,都要有一个动机——用来解答为什么要学这个,否则将会漫无目的,迷茫不可终日。 在此前所接触到的两种主要的数据结构,也就是向量(顺序表or数组)以及列表(链表,栈,队列),从分类上讲,都属于所谓的线性结构,而我们很快就会看到,树结构并不是完全的线性结构,因此这部分内容将是这门课的又一里程碑。
前言:因为栈的很多操作是基于表的,所以这篇文章里的例程就不再大面积地写注释了,有不理解的地方可以翻看之前的链表笔记,或者直接写在评论区。 咳咳,说到这个栈,很多人乍听之下感觉很陌生、卧槽这是什么玩意。
有了指针实现看似已经足够了,那为什么还要有另外的实现方式呢?原因是诸如BASIC和FORTRAN等许多语言都不支持指针,如果需要链表而又不能使用指针,那么就必须使用另外的实现方法。还有一个原因,是在ACM-ICPC,OI等竞赛中,比赛时间有限,用指针写起来太费事,而且数量不多的情况下,用数组实现的脸变运行速度会更快。
其实本应该从一般性的表讲起的,先说顺序表,再说链表 。但顺序表的应用范围不是很广,而且说白了就是数组的高级版本,他的优势仅在于两点:1.逻辑直观,易于理解。2.查找某个元素只需要常数时间——O(1),而与此同时,因为每个单元的物理内存都是连续的,所以不便于移动,不便于精细化操作,每次插入和删除都会带来巨额的时间开销。
砝码称重 有了对母函数的一般认识后,我们可以用它来解决一些简单的计数问题,比如说下面这道题:我们有1,2,3,4g四个砝码,一共可以称出多少种重量;而且,对于某一个重量,共有多少种称法?这个可以直接用母函数求解,1g的对应1+x,2g的对应1+x2,以此类推。
根据定义,这个序列作为函数的系数,称G(x)就是序列的母函数。和一般意义上的函数相比,母函数的功能是计数。 从百度和维基上能找到的相关说明都显得太学院派,不容易理解,还是用例子说明并引入吧。