数据结构课程
文章平均质量分 86
_g63
一天进步一点点
展开
-
4.2 字符串模式匹配
字符串的两种模式匹配方式:朴素算法、KMP算法。原创 2017-10-15 19:30:09 · 231 阅读 · 0 评论 -
7.1 树的基本概念、性质与运算
树的基本概念定义 树是由nn个结点(或元素)组成的有限集合。通常用符号TT表示。 当n=0n=0时,称为空树; 当n>0n>0时,有一个根结点(root),由根结点又指向有限个互不相交的子集TiT_i,这些子集同样也是一颗树,称为子树(sub tree)。树是一种利用递归定义的。通常用来表示具有层次的数据。树是具有一对多的关系,可以由图转化来(图的生成树(spanning tree原创 2017-11-11 00:24:07 · 657 阅读 · 0 评论 -
第五章 递归综合习题(leetcode)
下面例举了一些leetcode上面的一些习题,作为前一篇内容的补充。没有涉及到动态规划、分治法的题目,因为那些题目难度都比较大^^。 这些题目主要讲解如何根据书上的三种类型,设计递归算法。对于递归定义,这里选择了一道快速幂的题目;对于递归数据结构,这里超前使用了第7章的二叉树而不是使用之前的链表(线性数据结构使用递归并没有太大的意义,直接使用迭代基本上是很方便了),虽然超前但是应该也很容易明白;对原创 2017-10-23 22:43:38 · 1007 阅读 · 0 评论 -
7.2 7.3 二叉树的概念和性质、存储
基本概念二叉树定义二叉树的递归定义: 一颗空树或者单个结点构成的树是一颗二叉树; 除此之外,一棵二叉树有两颗互不相交的二叉树(分别称为左子树和右子树)构成。 需要区分二叉树和二次树的概念。二次树一定是二叉树(当然二次树不区分左右孩子),反之不一定成立。因为一棵一边倒的树可以是二叉树,但是二次树必须要求存在一个度为2的结点。 对于满二叉树和完全二叉树只给出形式化描述:满二叉树(f原创 2017-11-12 17:37:00 · 259 阅读 · 0 评论 -
7.4 7.5 二叉树的基本操作与遍历
二叉树类定义这里的二叉树使用了典型的二叉链实现方法:分为左右两个孩子链。这里和之前的链表实现一样,使用了类内定义的结点结构体BinaryTreeNode。考虑到插入和删除对于位置的要求比较复杂,因此在此处的二叉树实现中并没有包含(在二叉搜索树中,插入和删除是一个重点过程);同时考虑到这是一个原型二叉树,因此也没有使用泛型,对于树的结点的值的类型默认定义为字符串类型。事实上,对于建立二叉树的构造函数,原创 2017-11-16 17:00:31 · 379 阅读 · 0 评论 -
7.7 线索二叉树
为什么要创建线索二叉树对于普通含有nn个结点的二叉树来说,一共含有2n2n个指针域,而实际上,树的顶点集中元素的个数VV和边集中元素的个数EE的关系满足|V|=|E|+1|V|=|E|+1,也就是说在上述二叉树中n=e+1n=e+1,得e=n−1e=n-1,共n−1n-1条边,于是只需要n−1n-1个指针就可以刻画这颗二叉树了。但是在采用二叉链存储结构的二叉树来说,对于大多数语言来说,声明一个二叉树原创 2017-12-21 23:04:46 · 263 阅读 · 0 评论 -
7.8 最优二叉树与哈夫曼编码
最优二叉树定义对于一棵树,可以将每一个结点赋一个数值,称之为结点的权重(weight),简称权。定义一棵树上某个结点ViV_i的带权路径长度(weighted path length)为从根节点到该结点的路径长度lil_i与该结点上权重wiw_i的乘积。一棵树的带权路径长度是指所有结点的带权路径长度之和,即L=∑n0i=1wiliL=\sum_{i=1}^{n_0}w_il_i,其中n0n_0是叶子原创 2017-12-26 19:51:37 · 3433 阅读 · 0 评论 -
10.1 内排序综述
由于自己比较懒,之前一直没有跟着写博客,学习进度其实也落下不少。正好赶上期末复习,就打乱了顺序,草草结束第七章树之后,先跳到第十章内排序来写。内排序相关概念排序(sort)是指将一个表,按照关键字形成一个递增或者递减的序列。关键字应该满足偏序关系。所谓内排序就是指所有数据都是在内存中进行排序的,不需要进行内外存数据交换。 排序的稳定性是指,相同的关键字在排序前后,相对次序是否发生变化。如果不变,原创 2017-12-27 16:51:45 · 184 阅读 · 0 评论 -
10.2 插入排序(1)
基本思想插入排序的基本思想在于维护一个有序区,依次在线性表中向后扫描元素,将其插入在这个有序区的合适位置。 下面讨论具体算法:设一线性表A[1..n]A[1..n]。我们令循环变量ii从22到nn。利用循环变量ii便将线性表划分为两个部分A[1..i−1]A[1..i-1]和A[i,n]A[i,n]。在每趟循环执行前,A[1..i−1]A[1..i-1]都是局部有序的。因此在每趟循环过程中,我们的原创 2017-12-27 20:04:20 · 158 阅读 · 0 评论 -
10.2 插入排序(2)
核心思想希尔排序(Shell Sort)是Donald Shell命名的,是第一个突破O(n2)O(n^2)时间的排序算法之一。希尔排序的核心在于选取恰当的增量dd,对于线性表A[1..n]A[1..n],对任意的t∈[1,n]t\in [1,n]取A[t],A[t+d],A[t+2d],...A[t],A[t+d],A[t+2d],...看作是新的表,将其进行一次插入排序,然后缩小增量dd,再如法原创 2017-12-29 11:15:32 · 201 阅读 · 0 评论 -
10.3 交换排序(1)冒泡排序
基本思想冒泡排序的思想和其名字一样直观,把整个表看作一个水池,数据看作石头,重的自然沉下去而轻的会浮上来。当然在程序里面,直接沉下去和直接浮上来都是不可能的,因此冒泡排序就是相邻元素进行比较,如果逆序了,就相互交换,如此迭代直到序列有序为止。 冒泡排序每次迭代产生的有序区都是有序的(注意参考下面的实现理解)。实现template<typename _Ty>void bubble_sort(std原创 2018-01-18 15:52:03 · 220 阅读 · 0 评论 -
6.1 6.2 数组、稀疏矩阵
数组数组的一般定义数组是一种由相同数据类型构成的序列。数组的本质就是一个线性表。对于一维数组,该线性表中的元素类型就是需要存放的类型ElementType,对于多维数组,其维度d≥2d≥2,则可以认为线性表的元素类型是d−1d-1维数组。这样来看,数组也是一种递归的定义。 对于数组来说,通常只有以下两种操作:读取和写入。这两种操作需要一个输入向量来表示下标(即用来定位)。 数组中最常见的是一维数原创 2017-10-30 21:40:25 · 402 阅读 · 0 评论 -
4.1 字符串及其表示
总述基本概念 (字符)串(string)是指由零个或者多个元素(字符)组成的有限的序列。序列中所含的字符的个数称为该串的长度(教材中讨论的都是基于ASCII编码的字符串的长度,这里不讨论Unicode、GBK等多字节宽字符的情况)。 含有零个字符的串称为空串。通常将字符串用双引号括起来表示,如"a1a2a3...an""a_1a_2a_3...a_n",与大多数编程语言的习惯一致。也经常将字符串原创 2017-10-10 23:42:57 · 3958 阅读 · 0 评论 -
《数据结构》课程绪论
李春葆《数据结构教程》第一章绪论 数据结构的相关概念,及算法的时间(空间)复杂度分析原创 2017-09-13 18:27:49 · 484 阅读 · 0 评论 -
2.3 线性表的链式存储结构(链表)
基本概念和特点链表的定义-线性表的链式存储结构称之为链表(linked list)。链表包括两部分构成:数据域和指针域。数据域保存数据元素,指针域描述数据元素的逻辑关系。 - 链表通常使用带头结点的表示。指向头结点的指针称之为头指针(head pointer),指向最后一个结点(也就是尾结点)的指针称之为尾指针(tail pointer)。 - 链表不具备随机存取特性。 - 存储密度原创 2017-09-20 00:38:43 · 1347 阅读 · 0 评论 -
2.5 有序表
有序表(ordered list)是指所有元素按照递增或者递减的方式组织的线性表。 一些数据结构教材中,没有单独将有序表列出来讲解,因为有序表实际上只是线性表的一种特殊形式,大多数操作与线性表无异,只是插入和删除需要维护其有序性。 大多数情况下,有序表只需要对普通线性表执行一次排序操作就可以得到。 有序表最重要的操作是二路归并。前面提到过二路归并排序算法的分析,其中核心的操作就是二路归并。原创 2017-09-23 10:19:23 · 394 阅读 · 0 评论 -
第2章 线性表综合习题(leetcode)
线性表(单链表、数组)一些leetcode的习题。作为第二章的补充练习。原创 2017-09-24 22:48:21 · 475 阅读 · 0 评论 -
2.1 线性表的定义、逻辑结构、基本操作
李春葆《数据结构教程》2.1 线性表的定义、逻辑结构和基本操作原创 2017-09-16 17:35:23 · 441 阅读 · 0 评论 -
2.2线性表的顺序存储结构
线性表使用顺序存储结构进行描述,并分析一些基本算法,以及学习总结原创 2017-09-16 19:06:30 · 503 阅读 · 0 评论 -
3.1 栈及其基本应用
栈的基本定义、操作栈的链表、顺序表实现栈的一些基础应用原创 2017-09-25 23:00:52 · 319 阅读 · 0 评论 -
第4章 字符串综合习题(leetcode)
数据结构课程第四章 字符串 Leetcode的一些不错的习题,作为补充原创 2017-10-17 22:21:46 · 463 阅读 · 0 评论 -
3.2 队列
队列(queue)是一种只能在某一段进行插入,在另一端进行删除的线性表。将进行插入和删除的两端分别称为队首(front)和队尾(rear)。将元素进入队列成为入队(enqueue),将元素从队列中删除成为出队(dequeue)。队列具有FIFO(First In, First Out)的特性。队列的基本操作 名称 作用 cr原创 2017-10-01 20:39:03 · 224 阅读 · 0 评论 -
第3章 栈和队列综合习题(leetcode+vjudge)
这里选择了一些栈和队列的练习,一部分来自leetcode,也有一部分通过vjudge 取自其他平台。没有选择综合性较强的题目,单纯使用栈、队列、线性表的基本操作和思想就可以解决了。 对于双端队列和优先队列,这里仅仅使用STL进行解决,说明一下使用他们进行解决的办法,不提及物理实现及相关问题。双端队列的物理实现可以使用带尾结点的链表;而优先队列需要使用二叉堆(binary heap)实现,这在第1原创 2017-10-06 10:17:40 · 1155 阅读 · 0 评论 -
第5章 递归算法设计
基本概念在定义一个函数时,出现调用自身函数的,称为递归(recursion)。如果一个递归函数,最后一条语句是递归调用语句,则称这种递归调用为尾递归(tail recursion)。一个递归模型通常有两部分构成:初值(递归出口)和递归体。递归的使用条件递归的数学定义,比如斐波那契数列:F(1)=F(2)=1,F(n)=F(n−1)+F(n−2),n≥3F(1)=F(2)=1,F(n)=F(原创 2017-10-21 20:22:46 · 1533 阅读 · 0 评论 -
10.3交换排序(2)快速排序
基本思想快速排序也是一个典型的分治思想(divide and conquer)的运用。对于分治法需要了解如下的一个流程: 1.将当前的大问题分解成若干个子问题 2.解决每一个子问题 3.合并子问题的解 对于运用到数组的排序来说,很显然可以将数组一分为二,分别将其左右排序完成后,再对整个数组进行排序。上面描述的便是归并排序的一般思路。 而对于快速排序则略有不同:先选取一个枢轴量pivot,将原创 2018-01-19 18:49:43 · 318 阅读 · 0 评论