数据结构与算法
数据结构
further_
这个作者很懒,什么都没留下…
展开
-
数据结构与算法思维导图
原创 2020-09-03 16:57:15 · 115 阅读 · 0 评论 -
快速排序(详解)(C语言)(基本思想、改进算法)
所有关键字比基准小的放R[s]之前;◆ 所有关键字比基准大的放R[s]之后。原创 2020-06-01 17:27:55 · 1109 阅读 · 0 评论 -
哈夫曼树Huffman Tree及其应用——哈夫曼编码
构造这种树的算法最早由哈夫曼于1952年提出的,因此称之为哈夫曼树。**什么是哈夫曼树(Huffman Tree)+概念 **(1)带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带 有权值 wk,从根结点到每个叶子结点的长度为 Lk,则每个叶子结 点的带权路径长度之和就是:WPL=w1L1+w2L2+…+wn*Ln。 最优二叉树或哈夫曼树: WPL最小的二叉树 。(2)结点的权:在许多的应用中,将树中的结点赋予一个有着实际意义的数值,称此数值为该结点的权。(3)结点的带权路径长原创 2020-09-02 16:15:41 · 1577 阅读 · 0 评论 -
线索二叉树
线索二叉树的概念对于具有n个结点的二叉树,采用二叉链存储结构时,每个结点有两个指针域,总共有2n个指针域,又由于只有n-1个结点被有效指针所指向(n个结点中只有树根结点没有被有效指针域所指向),则共有2n-(n-1)=n+1个空链域。中序遍历二叉树的结果是一个结点的线性有序序列。可以利用这些空链域存放指向结点的前驱和后继结点的指针。这样的指向该线性序列中的“前驱”和“后继”的指针,称作“线索”。在结点的存储结构上增加两个标志位来区分这两种情况:这样,每个结点的存储结构如下:按上述原则在二叉树的每原创 2020-09-01 21:09:16 · 779 阅读 · 0 评论 -
B-和B+树的定义、性质特点、举例说明
在学习B-、B+树之前应先学习过二叉排序树/二叉搜索树/二叉查找树!!!和平衡二叉树B-树(B-Tree)的简介B-树(B-Tree)是一种平衡的多路查找树,它在文件系统中很有用。它适合在磁盘等直接存取设备上进行动态表查找,即外存设备。一棵m阶的B-树,或者为空树,或为满足下列特性的m叉树:(1)树中每个节点至多有m棵子树(即至多有m-1个关键字);(由此性质看树的阶,看子树的最多数量)(2)除根结点外,其他节点至少有m/2个孩子结点(即至少有m/2-1=(m-1)/2个关键字);(3)若根原创 2020-09-01 16:40:14 · 3174 阅读 · 0 评论 -
平衡二叉树(AVL Tree)
二叉排序树的结点不同插入次序,将导致不同的深度和平均查找长度,即其效率取决于二叉排序树的形态。为了获得较好的查找效率,就要构造一棵形态均匀的二叉排序树(AVL Tree)。注:在学习平衡二叉树之前应先学习过二叉排序树/二叉搜索树/二叉查找树!!!**什么是平衡二叉树(AVL Tree) **平衡二叉树或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:(1)根结点的左子树和右子树的深度最多相差1;(2)根结点的左子树和右子树也都是平衡二叉树。(具有二叉排序树的性质)平衡因子(Balance F原创 2020-09-01 16:02:20 · 2043 阅读 · 0 评论 -
二叉搜索树/二叉排序树/二叉查找树
怕原创 2020-09-01 09:36:49 · 2142 阅读 · 0 评论 -
二叉树的遍历(递归和非递归算法)
事实上,当使用递归时,二叉树的遍历算法基本一样,只不过是访问结点的顺序和输出结点的顺序不同。先了解下面这个有利于详细学习时的快速理解。先序----根、左子树、右子树;中序—左子树、根、右子树;后序—左子树、右子树、根层次遍历,从上到下、从左到右下面是下面代码会用到的。//二叉树的二叉链存储表示可描述为:typedef struct node{ ElemType data; /* 存放结点的值,ElemType是元素的基本类型 */struct node *lchild; /* 指原创 2020-08-31 22:08:13 · 1047 阅读 · 0 评论 -
二叉树的基本操作的思想、算法(链式存储结构)
学完二叉树的定义、类型、性质、存储结构后,继续学习二叉树的基本操作:创建二叉树、找指定结点、找孩子结点、求二叉树的高度、输出二叉树。下面的算法基于这个二叉树的链式存储结构。//二叉树的二叉链存储表示可描述为:typedef struct node{ ElemType data; /* 存放结点的值,ElemType是元素的基本类型 */struct node *lchild; /* 指向左孩子结点指针*/struct node *rchild; /* 指向右孩子结点指针 */} B原创 2020-08-31 17:25:23 · 1718 阅读 · 0 评论 -
二叉树(定义、类型、性质、存储结构)
二叉树的定义一个有穷的结点集合。 这个集合可以为空;若不为空,则它是由根结点和称为其左子树和右子树的两个不相交的二叉树组成。*注意:二叉树的定义是一种递归定义;二叉树的子树有左右顺序之分 *特殊的二叉树①斜二叉树(Skewed Binary Tree)即均为左子树或右子树。可继续分为斜右二叉树和斜左二叉树。下图为斜左二叉树。②完美二叉树(Perfect Binary Tree) 或 满二叉树(Full Binary Tree)在一棵二叉树中,如果所有分支结点都有左孩子结点和右孩子结点,并且原创 2020-08-31 17:24:58 · 1281 阅读 · 0 评论 -
索引存储结构和分块(索引)查找
索引存储结构索引存储结构=数据表+索引表索引表(index blocked table)中的每一项称为索引项,索引项的一般形式:(关键字,地址)举个例子:分块查找的基本思想分块查找又称分块索引查找(index blocked search)是一种介于顺序查找和二分查找之间的查找方法。其基本思想是:(1)将数据表str[0…n-1]均分为b块,前b-1块中记录个数为s=n/b,最后一块即第b块的记录数小于等于s;(2)每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键原创 2020-07-08 16:46:16 · 2859 阅读 · 0 评论 -
折半查找(二分查找)【和插值查找】(基本思想、递归和非递归算法)
折半查找的基本思想折半查找也称为二分查找(Binary search),要求线性表中的节点必须己按关键字值的递增或递减顺序排列。其基本思想是:首先用要查找的关键字k与中间位置的结点的关键字相比较,这个中间结点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间结点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的结点或者该线性表中没有这样的结点。折半查找的非递归算法int BinSearch(int str,int n,int k){ int lo原创 2020-07-08 16:19:35 · 2510 阅读 · 0 评论 -
顺序查找(基本思想、改进算法)
顺序查找的基本思想顺序查找是一种最简单的线性查找方法。其基本思想是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。最基本的顺序查找的算法int SeqSearch(int str[],int n,int k)//k为待在str[]中查找的关键字{ int i=0;while (i<n && str[i]!=k) //从表头往后找i++;if(i原创 2020-07-08 15:37:00 · 9769 阅读 · 0 评论 -
绪论—— 算法(特点、评价标准、时间复杂度、空间复杂度)
什么是算法?算法(Algorithm)是对特定问题求解步骤的一种描述,是为了解决一个或者一类问题给出的一个确定的、有限长的操作序列。算法(Algorithm)一个算法应该满足的5个条件:①有穷性:一个有限指令集 ;②有输入:接受一些输入(有些情况下不需要输入); ③有输出:产生输出 ;④可行性:一定在有限步骤之后终止;⑤确定性:每一条指令必须有充分明确的目标、不可以有歧义 、在计算机能处理的范围之内 、描述应不依赖于任何一种计算机语言以及具体的实现手段。为让读者清晰了解到算法与代码的差别,并鉴于读者原创 2020-07-06 17:48:40 · 924 阅读 · 0 评论 -
绪论——数据结构基础知识(抽象数据类型)
!!写在开头!!文章较长,对于初学者,下面我列出的几个模块是得掌握的数据结构定义数据结构(data structure)无官方的统一定义,下面三个定义可能有助于读者了解:①“数据结构是数据对象,以及存在于该对象的实例和 组成实例的数据元素之间的各种联系。这些联系可以 通过定义相关的函数来给出。”②“数据结构是ADT(抽象数据类型Abstract Data Type)的物理实现。”③“数据结构(data structure)是计算机中存储、组织 数据的方式。通常情况下,精心选择的数据结构可以带来最优原创 2020-06-25 23:33:11 · 585 阅读 · 0 评论 -
引用(C++)放在数据结构前
为什么要学习引用?在接下来的数据结构的学习中,有关函数参数的问题——&、、&,这四个什么时候要用呢?什么时候用哪个呢?这就涉及到C++的引用。当然,这里只是简单说明一下,不做深究。引用的概念引用就是一个变量或对象的别名。当定义引用时,用一个目标对象的名字对引用作初始化,从而让引用和目标对象建立起联系,对引用的操作就是对目标对象的操作。是不是觉得比较抽象?我们举一个例子:这好比是在一个班里,有个学生叫“张伟”,同时他有个绰号叫“益达”,那么班里的同学都明白,叫“张伟”和叫“益达”实际上都原创 2020-06-22 21:27:12 · 291 阅读 · 0 评论