数据结构与算法
若愚和小巧
懂深度学习、SLAM的软件工程师
展开
-
软件开发随笔:用C++写一个计算密集型适用的自适应线程池
在线程池中,如果为了保守创建较少的线程数,则不能充分利用性能;而创建过多的线程数会有可能在我们使用别的进程时,出现CPU的调度延迟导致缓慢,因为我们的任务是计算密集型,计算时会占用一整个核。在这里我使用一个多余的线程来监听CPU的状态,让线程池可以根据CPU占用率灵活控制本进程的计算量,在最大程度榨取计算机性能的同时保证用户对机器的其他基本操作。原创 2022-09-25 00:04:58 · 782 阅读 · 1 评论 -
来用C++实现八叉树以及解决点云的均匀降采样问题
点云降采样原创 2020-10-29 18:03:29 · 2252 阅读 · 4 评论 -
一种通过模仿SIFT特征实现基于二维地图的初定位方法
原创 2021-09-06 18:22:53 · 361 阅读 · 0 评论 -
重读数据结构之爬楼梯问题(动态规划)
leetcode能让人身心愉悦(误),每天抽出一点时间做一道题更是养生之道。那么,原创 2020-03-17 13:58:47 · 384 阅读 · 3 评论 -
哈希表的C++实现
哈希表是一种基于键值映射的快速搜索的数据结构,时间复杂度基本上是O(1)。针对键与值的映射,我们通过哈希函数(散列函数)来实现,它大致有数字分析法、平方取中法、折叠法、除留余数法等,而除留余数法对我们来说最为常见,也更适合初学者理解。但是在取余的过程中可能会导致散列冲突,在这里先用开放定址法中的线性探测法实现。哈希表目前在STL中的实现是unorder_map,非常好用,今天试着自己实现一个:...原创 2019-03-19 12:10:02 · 2737 阅读 · 0 评论 -
利用人工势场法的最短路径寻找
人工势场法也可以用作机器人避障。我目前思考的是使其作为全局规划器,规划全局路径,也可以做局部规划直接下达至速度计算,目前暂时先看看全局路径计算。它将整个地图环境抽象为势场,机器人同时受到目标点的引力与障碍物的斥力,向合力的方向移动,当机器人逐步接近障碍物,受到的斥力越来越大以致偏离障碍物,达到避障的效果。如果做一个简化,每次计算便向合力方向延伸一个步长,便可逐渐到达终点。在栅格地图中,障碍物很...原创 2019-01-07 21:30:43 · 5541 阅读 · 9 评论 -
用A*算法求自主导航的最短路径
A*算法是基于图搜索的一种较快捷的寻路算法,下面是它的基本思路。一.节点的数据结构。在每一个路径节点或潜在的节点(即地图的栅格)中,具有的数据如下:1.最基本的坐标值,在这里我们选择用栅格二维数组的下标而不是笛卡尔坐标x、y。2.父节点,它意味着路径的拓展过程中本节点是从其父节点延伸过来的。3.在每一轮迭代查找时,该路径点的优劣,它包括F,G,H三个数值,G指的是从起点移动到当前栅格的移动...原创 2019-01-01 23:44:13 · 1835 阅读 · 2 评论 -
来用C++写一个RRT算法求自主规划的最短路径
RRT(快速扩展随机树)算法不同于图搜索算法,它通过在全图中不断随机撒点,将路径像树一样拉伸直至终点,这样它不需要对环境进行数学建模,很适合在动态环境下的快速开拓路径。实际上,RRT算法正是维护树状结构的过程。先写一下粗暴方法的伪代码思路:T.init(root)for i = 1 to N randnode = Sample() nearestnode...原创 2018-12-27 10:16:30 · 6252 阅读 · 24 评论 -
递归方法之“八皇后”问题
八皇后问题可谓是非常古老经典,对菜狗的吸引力也很强,今天用递归方法来写一个。#include <iostream>using namespace std;//数组中存储各皇后当前位置的行数,数组下标是各皇后的列数int queensLocation[8]={-1,-1,-1,-1,-1,-1,-1,-1};//可行方案的数量int count=0;//检查当前方...原创 2018-11-05 12:16:56 · 289 阅读 · 0 评论 -
重读数据结构之优先级队列
队列是一种先进先出的结构,但优先级队列需要对后挤进去的数据进行排序,如果足够大的话会排至队首。它可以用来维护一堆数据中最大(最小)的N个数据,在这里用大顶堆(完全二叉树)来实现不停输入整数时找出K个最小的数,通过与堆顶的比较,决定是否顶替堆顶并再次排序。这也是为了给KD树求K近邻做个铺垫~大顶堆在数组中的表现是数组下标n是下标2n与2n+1的父节点,同时2n的节点大于它的兄弟节点,因此在有...原创 2018-11-08 20:44:44 · 153 阅读 · 0 评论 -
重读数据结构之来用递归写个汉诺塔
递归方法是通过利用系统上一阶段的状态来计算本阶段的状态,类似于“数学归纳法”,由初始阶段状态与状态间的变换函数可得任意阶段的系统输出。汉诺塔某一层的移动是先进先出,因此可以利用链栈和递归方法来构建并实现汉诺塔问题:#include <iostream>#include <stack>#include <vector>using namespac...原创 2018-11-04 22:07:13 · 203 阅读 · 0 评论 -
重读数据结构之逆转一个链表
菜狗开始重新读一遍数据结构啦,找找自己还不会的算法做做,今天从第二章看起,看到一款算法——逆转一个线性链表。这个仿佛需要思考一会,算法设计的也比较巧妙。开心上代码:#include <iostream>using namespace std;//创建一个链表节点typedef struct linkNode{ struct linkNode *link; ...原创 2018-10-29 21:33:30 · 285 阅读 · 0 评论 -
Dijkstra算法以及邻接表与堆优化
Dijkstra算法是最经典的单源最短路算法,它很像是广度优先遍历与最小生成树的结合,从出发点开始向四周扩散,直到搜索完毕所有节点为止,因此它很适合用来计算节点较少的稀疏图的最短路径问题,但是它以简单粗暴著称,算法思想属于贪心法的范畴。在初始时先将起点放入,从起点开始依次遍历邻居节点,将邻居的边权值设置为目前邻居的路径长度,再从中找到从起点开始路径最短的邻居节点,作为下一次遍历的起点,纳入到已...原创 2019-01-16 22:25:25 · 1127 阅读 · 0 评论 -
KNN算法的KD树C++实现
KD树本质上是一种二叉树,它拥有具备特定排列顺序的分裂节点以便查找数据,即在二叉排序树之中,某个分裂节点左子树的值均小于分裂节点的值,而右侧均大于分裂节点的值,如果用中序遍历这棵树,它的打印顺序将是从小到大递增的顺序。当然剩下的科普就不说了,这也是在PCL库当中,最常用的轮子之一,处理点云速度非常快。另外,KNN算法是机器学习训练的一种非常有效的分类方法,手撸这个算法就显得很重要了。当然,在企业级...原创 2019-01-17 21:42:16 · 1065 阅读 · 1 评论