数据结构与算法
Mr.Wang-USTC
主要研究方向,计算机视觉,模式识别与智能系统
展开
-
数据结构与算法之左高树
知识点来源于参考书籍《数据结构、算法与应用》,本人仅作整理与记录,方便日后复习查看。左高树的定义: 设x是扩充二叉树的一个结点,并令left_child(x)和right_child(x)分别表示内部结点的左、右儿子。定义shortest(x)为从x到一个外部结点的最短路程长度。 令s (x)为从节点x到它的子树的外部节点的所有路径中最短的一条,根据s(x)的定义可...原创 2019-03-29 21:40:20 · 1177 阅读 · 0 评论 -
二叉树常见的几种操作和问题
二叉树的定义:一棵二叉树t是有限个元素对集合(可以为空)。当二叉树非空时,其中一个元素称为根,余下的元素被划分成两棵二叉树,分别称为左子树和右子树。二叉树的特性:一棵二叉树有n个元素,他有n-1条边 一棵二叉树的高度为h,他最少有h个元素,最多有个元素,此时称为满二叉树 一棵二叉树有n个元素,他的高度最大为n,最小高度为二叉树的常见操作:二叉树的节点结构template&l...原创 2019-04-05 17:01:42 · 661 阅读 · 0 评论 -
数据结构与算法之二叉搜索树
看到有个家伙写的很好:二叉查找树(二)之 C++的实现二叉搜索树的定义:一棵二叉树,可能为空;一棵非空的二叉搜索树满足以下特征:每个元素有一个关键字,并且任意两个元素的关键字都不同,因此,所有的关键字都是唯一的。 在根节点的左子树中,元素的关键字(如果有的话)都小于根节点的关键字。 在根节点的右子树中,元素的关键字(如果有的话)都大于根节点的关键字。 根节点的左、右子树也都是二叉搜索...原创 2019-03-30 15:58:48 · 280 阅读 · 0 评论 -
数据结构与算法之堆排序
堆排序:先用n个待排序的元素来初始化一个大根堆,然后从堆中逐个提取元素(删除)。每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列。结果这些元素按照非递增的顺序排列。初始化时间为O(n),每次删除的时间为O(logn),因此总时间为O(nlogn)。#include<iostream>#include<vector>...原创 2019-03-30 11:43:42 · 203 阅读 · 0 评论 -
数据结构与算法之箱子排序 (链表描述)
问题描述:假定用一个链表保存一个班级学生的清单,每个节点的数据域有学生姓名和分数。我们需要对学生们的分数进行排序,其中n为学生总数,箱子排序的思想是首先将分数相同的节点放在同一个箱子里,然后将箱子连接起来就得到有序的链表。 假设分数介于0-5之间,则需要6个箱子,每个箱子对应一个分数。每一个箱子都是一个链表。一个箱子的节点数介于0-n之间,n为总人数。开始时,所有的箱子全...原创 2019-03-17 22:32:35 · 331 阅读 · 0 评论 -
数据结构与算法之选择排序
选择排序的基本思想:给数组元素进行排序,首先找出数组中最大的元素,将它移到a[n-1],然后在余下的n-1个元素中找到最大的元素,把它移动到a[n-2]。如此循环下去,直到只剩下一个元素。 以下是具体实现的C++代码template<class T>void selectionSort(T a[] , int n){ //给数组a[0:n-1]的...原创 2019-03-18 21:36:43 · 135 阅读 · 0 评论 -
数据结构与算法之冒泡排序
冒泡排序的基本思想:冒泡排序采取一种简单的“冒泡策略”,两个数进行比较,将大的一个扔到右边去的基本策略。在一次冒泡过程中,相邻的元素进行比较。如果左边的元素大于右边的元素,则两者进行交换。假设现有数组[6,5,8,4,3,1],首先将6,5进行交换得到[5,6,8,4,3,1],再将6,8进行比较,不交换,再将8,4进行比较,交换得到[5,6,4,8,3,1],再将8,3交换得到[5...原创 2019-03-18 21:54:45 · 124 阅读 · 0 评论 -
数据结构与算法之计数排序
计数排序的基本思想:在一个数组中对每个元素按大小进行排名次,一个元素的名次是数组中比他小的元素的个数加上左边出现的与之相等的元素的个数(备注:这里名次越高说明元素越大)。例如数组a=[5,4,2,5,8,9],新建一个相同大小的数组用于保存数组元素的名次,得到名次数组 R=[2,1,0,3,4,5]。 名次计算C++代码template<class T>vo...原创 2019-03-18 22:17:24 · 161 阅读 · 0 评论 -
数据结构与算法之插入排序
插入排序的基本思想: 在有序数组中插入元素:例如,在数组a[0:4] = [2,4,6,8,9]中插入3,结果是a[0:5] = [2,3,4,6,8,9]。因此,从数组的最右端开始,将元素依次向右移动一位直到找到元素的插入位置为止。template<class T>void insert(T a[],int n, const T&x){ int ...原创 2019-03-19 21:31:01 · 109 阅读 · 0 评论 -
数据结构与算法之括号匹配问题
在各大公司的笔试题中,我们经常会遇到关于括号匹配的问题。其实匹配问题中主要运用到的数据结构就是栈,例如对一个字符串进的左右括号进行匹配,字符串(a*(b+c)+d)在位置0和位置3有左括号,在位置7和10有右括号,位置0的左括号与位置10的右括号相匹配,位置3左括号和位置7的右括号进行匹配。在字符串(d+f))( 中,位置5的左括号和位置6的右括号都没有与之相配的括号。在这种问题一...原创 2019-03-24 12:33:47 · 933 阅读 · 0 评论 -
数据结构与算法之汉诺塔问题
汉诺塔问题 描述:假设有n个碟子和三座塔。初始时所有的碟子从大到小叠在第一座塔上,现在需要将所有的碟子移动到第二座塔上,每一次移动一个碟子,而且在任何时候大碟子都不能放在小碟子上面。在移动的过程中,可以借助第三座塔。 求解思路:采用递归的思路解决问题,为了将最大的碟子移动到第二座塔上面,我们需要将最上面n-1个碟子移动到第三座塔上面。然后,我们需要做的又是...原创 2019-03-24 13:48:07 · 393 阅读 · 0 评论 -
数据结构与算法之堆
声明:博客主要知识点内容来自参考书《数据结构、算法与应用》,本篇博客的主要目的是记录学习过程,方便日后复习。堆的定义:一棵大根树(小根树)是这样一棵树,其中每个节点的值都大于(小于)或等于其子节点(若有子节点的话)的值。一个大根堆(小根堆)既是大根树(小根树),也是完全二叉树。堆的常见操作:大根堆的插入操作:插入过程基本是这样的,将新的元素插入新的节点,然后沿着新的节点到根节点的路径,...原创 2019-03-29 14:59:05 · 656 阅读 · 0 评论 -
基本算法之回溯法
回溯法是搜索问题解的一种系统方法。回溯法求解首先需要定义一个解空间,这个空间至少包含问题的一个最优解。回溯法的下一步是组织解空间,使空间便于搜索,典型的组织方式是树或者图。一旦确定了解空间的组织方式,这个空间即可按照深度优先的方式从节点进行搜索。在0-1背包问题中,开始节点为根节点,开始节点为一个活动节点又是一个E-节点。从E-节点试着移动到一个新的节点。如果从当前的E-节点移动到一个新的...原创 2019-04-21 20:30:31 · 622 阅读 · 0 评论