数据结构与算法
数据结构与算法的学习总结
FlameAlpha
荒诞之余也常伴理性,不是吗?
展开
-
数据结构与算法 之 排序算法的实现与优化(动画)
排序算法冒泡排序法实现对相邻的元素排序若无数据交换,排序结束,如果存在执行步骤1选择排序实现将整个数组作为排序区间将排序区间的最小值(最大值)与起始元素交换将排序段的起始位置后移一位,循环步骤2插入排序实现将数组的[1:end]作为排序区间将起始元素放在前段已排序数组的合理位置(大于前一个元素,小于后一个元素)。将排序区间的起始位置后移一位,执行步骤2优化...原创 2020-02-10 19:55:01 · 1116 阅读 · 0 评论 -
数据结构与算法之二叉查找树精简要点总结
二分搜索树二分搜索树是一种二叉树,但是不一定是完全二叉树,其具有父节点大于左子树,且小于右子树的特点。实现查找元素:查找时利用二分查找树的特性,如果小于该节点则去该节点的左子树进行搜索,如果大于该节点则去该节点的右子树进行搜索,直到搜索到相等的节点后返回。删除元素:删除元素时需要先找到该元素,然后维护二分搜索树的特性,及将左子树中的最大值(或者右子树的最小值)取出补全删除元素的位置。插...原创 2020-02-10 20:05:30 · 829 阅读 · 0 评论 -
数据结构与算法之堆的精简要点总结
堆优先队列普通队列:先进先出;后进后出优先队列:出队顺序和入队顺序无关;和优先级相关实现生活中一般使用二叉堆,及该堆是一个完全二叉树,而堆又可以分为最大堆,最小堆,最大索引堆,最小索引堆。最大(最小)堆具有删除堆顶节点和插入节点两个功能,而除上述两个功能外,最大(最小)索引堆本身具有可以修改节点的特点。堆化:因为堆满足完全二叉树的条件,所以新插入的节点应在堆底的末位后一位,之后对...原创 2020-02-10 20:10:38 · 776 阅读 · 0 评论 -
数据结构与算法之并查集的精简要点总结
并查集主要用于解决连接问题,其基本思想是为每一个数据都打上标签,当标签一致时则为一个集合。但是考虑到求并集的时候的效率问题,这里采用树形结构解决该问题,简单来说就是利用两个节点的根节点是否一致作为是否为一个集合的标志。实现查找:为防止该数据结构退化为链表,在每次查找过程中,选择进行路径压缩,使该节点指向该节点的父节点的父节点。查找的结果则返回该节点所在子树的根节点。合并:合并过程为了保证该...原创 2020-02-10 20:13:27 · 870 阅读 · 0 评论 -
数据结构与算法之图的精简要点总结
图与树和并查集相近,主要解决的是网络问题,比如人际网络。实现方式图有两种实现方法包括邻接矩阵和邻接表。邻接矩阵(Adjacency Matrix)适合存储稠密图(Dense Graph),邻接表(Adjacency List)适合存储稀疏图 (Sparse Graph),稠密图的代表是完全图,即每个顶点都与其他任意顶点相连。邻接矩阵则是使用 array[i][j]表示第i个节点是否指向第j个...原创 2020-02-10 20:14:25 · 930 阅读 · 0 评论 -
常用排序算法一句话快速拾起
冒泡排序:从前向后依次相邻的两个元素作比较,前比后大则交换,反之无操作插入排序:从前向后遍历元素,并将遍历到的元素插入前段已遍历元素的合适位置选择排序:将未排序区间中的最小值放在未排序区间最前,或最大值放在最后归并排序:将全部元素分为n段,将每段全部元素排序,并将相邻段归并为一段,重复排序归并操作快速排序:随机选择元素作为分段元素对元素分段,对每一段重复上述分段操作桶排序:将全部元素均匀...原创 2020-02-10 20:19:38 · 926 阅读 · 0 评论 -
有序二维数组查找的两种方法:从左上角(递归)和右上角(非递归)出发
有序二维数组查找这道题是在学习剑指offer这本书看到的,原题如下所示: 在一个二维数组中,每行都按照从左到右递增的顺序排序,每列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分块治之在拿到题目的时候,我并没有找到右上角那么优秀的特征,所以我选择二分查找的有序数组的思想,最初的想法是从最小值(左上角)到最大值(右下角)进行扇形搜...原创 2020-05-01 14:19:36 · 2872 阅读 · 1 评论 -
各个常用的排序算法的适用场景详细分析
在介绍各排序算法的使用场景时,先来温习一下跟时间复杂度有关的一些名词概念:逆序对:设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。在未知的状态下,每两个元素为逆序对的概率为50...原创 2020-05-01 14:19:58 · 5850 阅读 · 0 评论 -
自编数据标注(分割)软件 : 数据读取及绘制,双击添加竖线,数据标注(分割)后导出
前段时间因为在自建人体活动的数据库,所以需要自己标注数据(没钱只能自己整理????),所以需要实现一个功能就是对文件中的一系列数据进行标注,为每一条时间序列数据赋予一个相应的值,也就是分类标签,做机器学习的同学应该知道,实际上就是将无数条数据分为几大类,因为我做的是监督学习,所以需要监督数据,这样的话需要自己制作训练数据(太难了????,还是多传感器多通道的)。为了减轻自己的工作量,选择自己编写一个数据标注的...原创 2020-02-19 09:20:40 · 672 阅读 · 0 评论 -
数组嵌套实现哈希函数的数据分片应用
什么是哈希算法呢? 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法, 而通过原始数据映射之后得到的二进制值串就是哈希值,简单磊说就是唯一标识的数据映射。百度百科中解释为Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就...原创 2020-02-19 11:00:55 · 428 阅读 · 0 评论 -
使用链表实现连续分段数据的标签显示
之前的一篇文章自编数据标注(分割)软件 之 数组嵌套实现哈希函数的数据分片应用介绍了如何显示数据点的活动标签。但是并不特别符合当前的需求,并无法达到动态修改每段数据的标签值,因为其中的labelNum是由slice获取得的,并且是从头到尾遍历进行的赋值操作,算法复杂度较高为O(n),即在每一次的分割点的加入都需要O(n)的时间复杂度,并且可以简单分析该分割点之后的数据标签也会收到影响。这时便想到...原创 2020-02-19 12:05:26 · 395 阅读 · 0 评论 -
双向链表的归并排序C++实现(含注释,非递归)
void __merge(Node *l, Node *mid, Node *r) { Node * currprev = l->prev(); Node * endnode = r->next(); auto i = l, j = mid; while (i != mid || j != endnode) { if (i == mid)...原创 2020-02-24 20:21:49 · 1240 阅读 · 0 评论 -
二叉搜索树的深度&广度优先遍历 C++实现
实际上树和图的广度&深度优先遍历方法十分类似,所以今天针对树的遍历方法实现进行详细分析,并且树的遍历在笔试中也是非常常见的一种方法,并且《剑指Offer》中的许多面试题用到了这两种遍历方法进行不同需求的算法实现。深度优先遍历深度优先遍历:借助递归算法不断遍历当前遍历到节点的左右子节点,对于树这个数据结构根据左子节点、右子节点和当前节点的遍历顺序该搜索算法又可分为前序、中序和后序遍历,其...原创 2020-03-12 16:28:56 · 1222 阅读 · 0 评论 -
二叉搜索树C++详细实现
相信大部分人都会实现二叉搜索树,实际上就是根据与当前节点相比的大与小进行整个树的建立。这里部分代码引用的是王争老师的二叉搜索树代码,为了方便关于二叉搜索树其他内容的讲解,代码基本上具有注释,如果哪里写的不明白可以留言,因为我自己也修改了一下,不知道是否存在bug。具体的功能有:搜索元素删除元素插入元素最大元素获取最小元素获取删除最大元素删除最小元素前、中、后、层序遍历获取ce...原创 2020-03-12 19:05:52 · 690 阅读 · 0 评论