算法
文章平均质量分 94
落樱弥城
无无
展开
-
数据机构之二叉树
二叉树一、二叉树的定义和分类1、二叉树的定义 二叉树是一种特定的树,每个结点最多有两棵子树,并且左右子树不能交换位置。 这意味着下面几棵树是完全不同的树。2、几种特殊的二叉树满二叉树 高度为h并且结点数为2^h-1的树为满二叉树,即每个层都有最大结点数。 因此满二叉树的叶子结点都在最底下一层。并且若按层按顺序为结点编号对于结点i,如果有双亲,必为(向下取整)(i/2),如果有孩子,左孩子必为原创 2017-01-07 14:20:11 · 2528 阅读 · 0 评论 -
数据机构之图
图一、图的基本概念和相关性质1、图的定义 图是由顶点和边集组成的集合,其中顶点的集合记作V,边集记作E,图记作G=(V,E)。 图不可以为空。2、图相关概念 有向图:E是有向边的有限集合时,G就是有向图,对应的若弧是从v->w则记为<v,w>v为弧头,w为弧尾。 无向图:E是无向边的有限集合时,G就是无向图。对应的弧若是v和w之间的弧则记为(v,w)。 简单图:满足不存在重复边;不存在顶点原创 2017-01-07 14:26:47 · 618 阅读 · 0 评论 -
数据机构之树和森林
树和森林一、树和森林的定义和性质1、树的定义 树是n个结点的有限集合。 树可以为空树,即结点数为零。并且任意一颗非空树有以下特点: 1. 有且仅有一个根结点; 2. 当树的结点数大于1时,其余结点可分为多个结点的有限集合,这些集合的每一个又是一棵树,因此为根结点的子树。2、树中的相关术语 假如有一棵树如下图所示: 祖先结点:从根节点到某个节点的路径上的所有节点都是该结点的原创 2017-01-07 14:06:47 · 2990 阅读 · 0 评论 -
数据机构之队列和栈
栈和队列一、栈和队列的概念1、栈的概念 栈是只允许在一端进行插入或者删除操作的线性表。 栈还涉及一些概念: 栈顶: 线性表允许插入和删除元素的一端。 栈底: 固定的,不允许进行插入和删除的一端。 栈的输入输出特点是FILO(first in last out)后进先出,假如栈中有四个元素a_1,a_2,a_3,a_4已经全部按顺序入栈,则出栈的顺序是a_4,a_3,a_2,a_1。原创 2017-01-07 13:58:20 · 2757 阅读 · 0 评论 -
数据机构之线性表
写在前面 打算写一下关于数据结构和算法中的一些学习笔记,在文档中只会用C语言进行算法和数据结构的实现。参考书籍《数据结构与算法(C语言版)》(严蔚敏)一、什么是数据结构 按照课本上的概念,数据结构是相互之间存在的的一种或者多种特定关系的数据元素的集合。但是这样理解有点抽象,我认为可以将数据结构理解为同类型数据的集合和关系的描述。比如线性表就是相同类型元素按照线型结构存储的一种数据结构。二、为什么原创 2017-01-07 13:49:27 · 720 阅读 · 0 评论 -
二叉树的遍历和线索化(递归和非递归版本)
1 二叉树的遍历 二叉树的遍历都是根据父结点的顺序位置来命名的。1.1 先序遍历 先遍历父结点,再遍历左子结点最后遍历右子结点。上述树的遍历顺序为:5 2 1 3 7 6 8 递归版本:@staticmethod def pre_traversal(root, visit_func): ''' @brief 先序遍历 @p...原创 2020-03-18 18:46:19 · 545 阅读 · 0 评论 -
内省排序及C++实现测试
1 IntroSort 内省排序(英语:Introsort)是由David Musser在1997年设计的排序算法。这个排序算法首先从快速排序开始,当递归深度超过一定深度(深度为排序元素数量的对数值)后转为堆排序。采用这个方法,内省排序既能在常规数据集上实现快速排序的高性能,又能在最坏情况下仍保持O(nlog(n))O(nlog(n))O(nlog(n))的时间复杂度。由于这两种算法都属于比较排序算法,所以内省排序也是一个比较排序算法。 一般的排序算法有:冒泡排序,插入排序,选择排序,希尔排序,快速原创 2021-01-01 11:32:30 · 988 阅读 · 0 评论 -
《Strip Pooling Rethinking Spatial Pooling for Scene Parsing》论文阅读笔记
论文地址:Strip Pooling 论文代码:github1 简介 基于空间池化能够有效的提取到long-range的上下文信息这一假设,稳重主要有三个贡献:设计了一种使用非对称卷积1×N1\times N1×N和N×1N\times 1N×1新的空间pooling结构;使用strip pooling设计了一个新的空间pooling模块和Mixed Pooling Module;基于strp pooling和mixed pooling搭建了spnet。2 思路 语义分割自FC原创 2020-05-20 20:16:01 · 834 阅读 · 20 评论 -
二叉查找树和红黑树
文章目录1 二叉查找树1.1 原理1.2 二叉查找树插入1.3 二叉查找树删除1.2 缺陷2 红黑树2.1 平衡树2.1.1 简介2.1.2 平衡性的维护2.1.2.1 LL(右单旋转)2.1.2.2 RR(左单旋转)2.1.2.3 LR平衡旋转(先左后右旋转)2.1.2.4 RL RL平衡旋转(先右后左旋转)2.2 2-3 查找平衡树2.2.1 简介2.2.2 2-3平衡树的插入2.2.2.1 ...原创 2020-03-18 14:10:49 · 359 阅读 · 0 评论 -
字符串匹配(KMP,BoyerMoore,散列指纹)
1 KMP算法1.1 next方法1.1.1 PMT1.1.1.1 PMT含义 KMP算法中关键部分是弄清楚next数组的含义和作用,next数组即部分匹配表(PMT),如下面就是字符串’abababca’的PMT:字符abababcaid01234567pmt00123401 首先说一些简单的基础概念:...原创 2020-03-05 10:54:01 · 729 阅读 · 0 评论 -
数据结构与算法之希尔排序及其改进(可视化)
文章目录1 希尔排序1.1 简介1.2 流程1.3 可视化1.4 python代码实现2 改进II:使用不同的分组方式2.1 思路2.2 python代码实现3 改进III:引入插入排序的改进方式3.1 思路3.2 哨兵版本实现3.3 二分查找版本实现4 性能测试4.1 不同分组性能测试4.1.1 针对tkt^ktk的性能测试4.1.2 不同分组性能测试4.2 优化方法性能测试5 算法复杂度1 ...原创 2020-02-04 16:24:45 · 1033 阅读 · 0 评论 -
感知器及双月实验
文章目录一、定义二、感知器收敛定理三、贝叶斯分类器1、高斯环境下的感知器与贝叶斯分类器的关系2、高斯分布下的贝叶斯分类器3、总结四、实验1、线性可分moon2、线性不可分moon五、附件一、定义 感知器是模仿人类神经元的用于线性可分分类的最简单的神经网络模型。线性可分分类即可以通过一个线性的超平面将数据分开。其基本模型如下图所示,其中a1,a2,...ana_{1},a_{2},...a_{...原创 2019-09-24 12:40:26 · 2976 阅读 · 0 评论 -
改进的二路归并排序(算法4)
文章目录简述改进办法运行结果简述 我们常见的二路归并排序基本上分为两步,时间复杂度为O(log2n)O(log_{2}n)O(log2n),空间复杂度为O(n)O(n)O(n)。下面是我们常用的写法:void merge(int *data, int low, int mid, int high){ int *tmp = new int[high + 1]; int i = low...原创 2018-12-08 22:59:26 · 1211 阅读 · 0 评论 -
矩阵乘积计算(Strassen)
矩阵乘积计算(Strassen)问题描述 已知A,B两个矩阵计算其乘积C?矩阵乘积数学公式: 假设存在两个矩阵A为m×n矩阵,B为k×l矩阵,若需要计算AB则必须n=k,若需要计算BA必须l=m否则无法进行计算,先假定n=k即B为n×l矩阵则AB的结果为一个m×l的矩阵并且该矩阵每个点的元素的值表示为CijCij则:方法一:直接计算 直接利用多重for循环求出相关矩阵对应的点的值即原创 2017-03-29 22:22:13 · 2869 阅读 · 0 评论 -
数据结构与算法之直接插入排序及其改进(可视化)
直接插入排序 直接插入排序顾名思义,就是通过将还未进行排序的元素插入到有序序列中进行排序的来使得无序序列有序算法。 直接插入排序的算法执行步骤为:1、查找出L[i]在L[1]…L[i - 1]的插入位置K2、将L[K]…L[i - 1]的所有元素向后移动一位3、将L[i]插入到L[K]处示意图相关代码/** * 直接插入排序算法(L为线性表) * 1、查找出L[i]在L[1]..原创 2017-03-24 21:08:17 · 493 阅读 · 3 评论 -
数据结构预算法之冒泡排序及其改进(可视化)
冒泡排序 通过元素的两两比较不断将较大值或则较小值移动序列的后面,类似于气泡向上冒的排序算法。 1、比较相邻两个元素大小,如若不符合要求则交换元素 2、对整个序列做同样1的操作,最后的元素一定是当前比较的序列中最大的元素 3、重复以上操作除了上一次遍历的最后一个元素示意图相关代码 /*** 冒泡排序算法(L为线性表)* 通过元素的两两比较不断将较大值或则较原创 2017-03-25 14:24:33 · 414 阅读 · 0 评论 -
数据结构与算法之归并排序及其改进(多路归并,可视化)
归并排序概念及步骤 归并排序:归并排序是利用分治思想进行排序的算法。 步骤: 1、分解——将序列进行多次递归的分解,分解为多个小序列,最终的结果为每个小序列仅仅含有1个元素 2、合并——将相邻的小序列进行排序合并之后多次递归为最终的有序序列。演示图 因为我们排序的元素本身为线性顺序表,每个元素可以看作单个的个体因此相关的分解操作就不需要进行直接进行合并排序即可,演示图以原创 2017-03-25 23:34:25 · 843 阅读 · 0 评论 -
最大子数组和
最大子数组和问题描述: 求一个有序序列的最大子数组和,即求的这个数组的子数组中和最大的数组。解决问题方法:1、暴力枚举: 利用简单的循环枚举出所有的可能性进行比较得到最终的结果。/*** 最大子数组求解问题(L为线性表)* 问题描述:已知一个数组序列L,求出该数组的最大子数组,即数组元素之和最大的子数组*/typedef int type;/** * 用来保存所求的的原创 2017-03-26 19:29:15 · 396 阅读 · 0 评论 -
堆排序,多叉堆及其性能测试
堆排序堆的概念 堆本身为一棵完全二叉树,即拥有的特点是n个结点的堆的高度为logn+1log_n+1,若将堆按照1….n的按层进行编号则第i个结点如果有左孩子的话则它的左孩子的为第2×i个结点,如果它有右孩子的话右孩子为第2×i+1个结点,可以利用这个性质将数组构建成一个堆并且进行方便的索引。 堆分为大根堆和小根堆。 大根堆指所有结点的关键字不小于其子结点的关键字的完全二叉树。原创 2017-04-05 14:01:48 · 628 阅读 · 0 评论 -
优先队列
优先队列优先队列概念 优先队列是一种用来维护一组元素组成的数据结构,而每个元素都有一个对应的值。 优先队列分为最大优先队列和最小优先队列。 最大优先队列和最小优先队列二者区分和大根堆和小根堆的区分方式基本相同,因为最大优先队列和最小优先队列就是大根堆和小根堆的一种应用实例。比较常见的场景是计算机系统中的作业优先级调度。 这里提到的优先队列只是利用堆实现的一种方式,当然也可以使原创 2017-04-05 21:12:16 · 663 阅读 · 0 评论 -
数据结构与算法之快速排序及其改进(可视化)
快速排序 快速排序的基本采用分治的思想通过每一趟的排序将数据分割成两部分,左边的一部分全部不大于主元素,右边的一部分不小于主元素,然后再递归的对着两部分元素进行分割,最终变成有序序列。 快速排序的基本步骤: 1、从数据序列中取出一个主元素也就是作为参考点; 2、将左边大于主元素的数据交换到主元素的右边; 3、通过递归不断的遍历主元素的左右两边的元素,最终实现元素的有序。原创 2017-04-06 10:57:31 · 454 阅读 · 2 评论 -
桶排序 计数排序和基数排序(可视化)
计数排序算法描述 已经确定需要进行排序的序列为某一具体数k范围内的值,利用数组的特性对顺序表中的每个数小于该数的数的个数进行计数,计数结束后该数值在数组中的位置就是对应计数的大小,比如小于dat的数有i个则dat在最终排序的序列中的位置为i+1。算法具体步骤生成两个临时空间,一个存储计数结果,另一个存储最终的排序结果;计数小于对应元素的元素个数;根据计数结果进行最终的定位。算法图示相关原创 2017-04-19 20:12:49 · 551 阅读 · 0 评论 -
数据结构与算法之简单选择排序及改进(可视化)
简单选择排序简单选择排序描述 从序列L[i + 1]…L[n]之间找到其中最小值,然后交换L[i]和L[min]的数据,直到遍历整个序列结束为止。示意图/** * 简单选择排序算法(L为线性表) */typedef int type;void print_array(type *L, int len, char *msg);/** * 用于交换元素 */void swap(t原创 2017-03-27 20:27:37 · 478 阅读 · 0 评论