数据结构与算法
文章平均质量分 85
惊鸿一博
毕业于中国科学院大学/中科院自动化研究所;专注于SLAM,三维重建,图像处理,视觉定位等;曾就职于鸿海集团,大陆集团,现在某自动驾驶独角兽企业;热爱分享,热爱生活;欢迎一起交流,学习,进步。
展开
-
KD-Tree原理详解
目录1、简介2、原理2.1、数据结构2.2、构建kd-tree例子2.3、最近邻检索3、常用函数4、参考文献kd-tree是在进行激光点云编程中经常使用的一个工具,我们平时使用的时候可能就是使用其中的一小部分的内容,并未对其进行很深的思考。那么kd-tree的原理到底是什么呢?我们又经常使用哪些常用函数呢?本片文章将对kd-tree进行细致的整理,方便以后的使用和阅读。1、简介kd-tree简称k维树,是一种空间划分的数据结构。常被用于高维空间中的搜索,比如范转载 2022-02-24 17:17:25 · 7554 阅读 · 0 评论 -
C++_数据结构_堆用法详解
1. 基本概念堆(heaps)是一种特殊的数据组织方式,STL中的 priority_queue 容器适配器底层就是采用堆来组织数据存储的。为了弄明白堆是什么,首先要搞清楚什么是树存储结构。1.1 树存储结构树是分层排列的元素或节点。每个节点有一个键,它是节点中所保存的对象,就如同链表中的节点。父节点是有一个或两个子节点的节点。一般父节点可以有任意个数的子节点,树中的父节点不需要有相同个数的子节点。没有子节点的节点叫作叶节点。一般父节点的键与其子节点有一些关系。树都有一个根节点,它是树的基础,.转载 2021-12-20 15:00:33 · 1755 阅读 · 0 评论 -
C++_Hash容器总结
一、Hash基本概念散列Hash函数是一种特殊的映射函数, 散列表Hash Table由散列函数所产生的一种数据结构. 这是一种非常重要的数据结构.首先, 先了解散列表在数据结构方面的基础:散列表是用于存储动态集的一种非常有效的数据结构。通过散列函数h(key)的计算结果,直接得到key关键字表示的元素的存储地址。散列技术中,可能会有两个不同的key1和key2,通过h(key)计算得到的地址是一样的,这就发生了冲突。散列技术中散列函数h(key)和解决冲突的技术是最关键的问题。1.1 散列转载 2021-07-15 12:43:19 · 1332 阅读 · 0 评论 -
数据结构_满二叉树、完全二叉树、二叉排序树、平衡二叉树
一、满二叉树除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。或者说:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。或者说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。二、完全二叉树完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。或者说:若设二叉树的深度为h,除第 h 层外,转载 2021-03-06 10:06:11 · 869 阅读 · 0 评论 -
算法_快速排序算法C/C++
目录快速排序1. 算法思想2. 实现原理3. 动态演示4. 完整代码5. 结果展示6. 算法分析快速排序1. 算法思想快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2. 实现原理2.1、设置两个变量 low、high,排序开始时:low=0,high=size-1。2.2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基转载 2021-01-25 21:34:25 · 151 阅读 · 0 评论 -
条件随机场(CRF)
目录1.定义1.1 图1.2 概率图模型(PGM)(1)有向图的联合概率:(2)概率无向图模型:1.3 马尔可夫性1.4 团与最大团1.5 概率无向图模型的联合概率分布1.6 条件随机场1.7 线性链条件随机场2.条件随机场的不同形式2.1 条件随机场的参数化形式2.2 条件随机场的简化形式2.3 条件随机场的矩阵形式3.概率计算问题3.1 前向-后向算法3.2 概率计算3.3 期望值计算4.学习算法(参数估计)5.预测算法(.转载 2020-10-30 09:34:09 · 9061 阅读 · 0 评论 -
算法笔记_面试题_数组/链表/跳表/各种数据结构复杂度对比
面试题数据和链表,增删改查的时间复杂度分别是什么?参考:https://blog.csdn.net/weixin_41725746/article/details/93081477跳表的工作原理?优势?跳表用到的思想:1.升维 (没隔一个抽取,建立一个维度的链表)2.空间换时间 (常用的两种思想)优点:提高了查找的速度,增删改查的时间复杂度都是O(logn), 其空间复杂度为O(n)....原创 2020-06-22 16:22:58 · 369 阅读 · 0 评论 -
算法笔记_二分查找/斐波那契查找
1. 查找问题定义:在非降序数组中,找出指定的元素,如从{1,2,3,6,8,12}中找出元素2的位置。二分查找的复杂度(比较次数,又称查找长度)是O(1.5log(n)),但不是最优的。改进:fibonacci数列进行改进。原因:对于一个非降序数组,二分查找向左查找。需要比较1次,而向右查找,需要比较2次,存在不平衡,而我们希望,正确的比较(向左查找)的次数多一些,所以,不再使用从中间元素分成两半,进行查找,而是以fibonacci数列的值(1、1、2、3、5、8、13、21、34)作为划分数原创 2020-06-17 13:42:33 · 412 阅读 · 0 评论 -
矩阵运算_Eigen使用_基本数据类型
来自高翔的SLAM十四讲 简单介绍eigen作为矩阵运算常用库的基本使用示例 细节参考注释文件结构CMakeLists.txtcmake_minimum_required( VERSION 2.8 )project( useEigen )set( CMAKE_BUILD_TYPE "Release" )set( CMAKE_CXX_FLAGS "-O3" )# 添加...原创 2020-04-28 22:42:42 · 2276 阅读 · 0 评论 -
算法笔记_什么是数据结构_向量vector
P34https://www.bilibili.com/video/av75509584?p=34基本概念抽象数据类型(ADT) vs 数据结构汽车使用手册,在某种意义上,就是一种ADT,用户只需要关系如何使用它,不必关系内部的实现,内部的实现由生产者决定。算法中,将向量的元素对应的索引,称之为“秩”。disordered(): 返回逆序对的个数;若返回0,说明逆...原创 2020-01-14 22:02:11 · 657 阅读 · 0 评论 -
算法笔记_什么是算法/算法分析/减而知之/分而治之/动态规划
目录一.基本概念1.1 什么是计算?关于有穷性什么是好算法?1.2 算法分析是干什么的?T(n)怎样评价算法优劣?大O记号法 - 确定算法上界(最坏情况)Ω表示法 - 确定算法下界(最好情况)1.3 常见的复杂度各种级别的复杂度 总结对比二. 算法分析详解2.1 算法分析的主要方法如下2.2 基本的数学知识回顾级数循环 vs 级数...原创 2019-12-26 10:05:59 · 587 阅读 · 0 评论 -
哈夫曼编码(Huffman Coding) cpp完整代码实现 详细注释 ASCII码表
1.概念 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试原创 2017-06-03 15:48:00 · 7873 阅读 · 0 评论 -
完全二叉树/ 满二叉树/二叉树遍历(前序、中序、后序、层序遍历)
1.概念 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二原创 2017-05-24 15:52:39 · 5490 阅读 · 0 评论 -
线性表(插入/清除数据/快慢指针查找中间数据)
1.概念线性表 :顺序存储结构线性表 及 链式存储结构线性表链式存储结构线性表(线性链表):具有链接存储结构的线性表,它用一组地址任意的存储单元存放线性表中的数据元素,逻辑上相邻的元素在物理上不要求也相邻,不能随机存取。一般用结点描述:结点(表示数据元素) =数据域(数据元素的映象) + 指针域(指示后继元素存储位置)顺序存储结构线性表:顺序存储结构就是用一组地址连原创 2017-04-18 22:22:13 · 609 阅读 · 0 评论 -
线性表_循环链表(增减删查 + 约瑟夫环问题 代码实现 )
1.概念循环链表是链式存储结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。判断空链表的条件是head==head->next;rear==rear->next;循环链表的特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活。①循环链表中没有NULL指针。涉及遍历操作时,其终止条件就不再是像非循环链表那样判原创 2017-04-20 23:57:53 · 448 阅读 · 0 评论 -
线性表_双向循环链表(Caesar加密变换结点顺序 代码实现 )
1.有图有真相2.代码实现//Caesar Password with DualLinkList#include #include #define OK 1#define ERROR 0typedef char ElemType; //双向循环链表元素类型typedef int Stutas; typedef struct DualNo原创 2017-04-27 22:37:40 · 532 阅读 · 0 评论 -
线性表_使用栈实现二进制转换到八进制/十进制/十六进制
1.定义与概念栈栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为后进先出表。viod *malloc(size_t size) 向系统申请分配指定size个字节的内存空间。返回类型是原创 2017-05-01 22:49:14 · 3804 阅读 · 0 评论 -
线性表_栈_逆波兰计算式(Reverse Polish Notation)
1.概念 逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后) 实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中序表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍原创 2017-05-07 22:41:32 · 2320 阅读 · 0 评论 -
循环队列 代码实现(FIFO)
1.概念 为充分利用向量空间,克服顺序存储结构的"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。 循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件fro原创 2017-05-09 22:11:53 · 16112 阅读 · 0 评论 -
递归算法—输入字母逆序输出&汉诺塔递归算法
1.概念递归——将一个大的问题分解成比较小的、有着相同形式的问题。递归是一种强有力的思想。在计算机科学的学习中,一个重要的必须学习的概念是递归。递归是一种编程策略,它把一个大的问题分解成具有相同形式的简单问题。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。2.代码1)递归实原创 2017-05-18 21:46:33 · 1571 阅读 · 0 评论 -
线索二叉树(Binary Thread Tree)
// 1.用户前序输入二叉树数据 // 2.对二叉树进行线索化 lchild ltag Data rtag rchild // ltag/rtag 左右标记位 0:有孩子结点 link 1: 存储前驱或后继结点线索 Thread // 3.中序迭代遍历输出二叉树数据原创 2017-05-31 11:14:37 · 4504 阅读 · 0 评论 -
递归算法计算八皇后问题(Eight Queen Problem with Recursive Algorithm)
1.概念八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。2.实现#incl原创 2017-05-19 23:01:58 · 678 阅读 · 0 评论 -
深入理解什么是变量?
总结:变量是为某一内存起一个名字,本质就是代表内存中的一段存储空间。变量名存在编译器中(如vs 下的cl.exe),变量名指向一块内存地址,编译之后,变量名变成地址。变量是一种使用方便的占位符,用于引用计算机内存地址。 参考:http://baike.baidu.com/link?url=QH98DaRn-l9tI-EGi1U3AWbuEXBLoTXXQ9mUE4ouwdQ8M_UcY5JLH原创 2017-06-01 14:03:05 · 965 阅读 · 0 评论 -
KMP算法计算next数组 匹配字符串
1.概念 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。 设原创 2017-05-21 23:31:29 · 694 阅读 · 0 评论 -
树的存储_ 双亲表示法 及 双亲孩子表示法
1.概念 树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树。节点的度(degree):一个节点含有的子树的个数称为该...原创 2017-05-23 16:29:55 · 25198 阅读 · 2 评论