![](https://img-blog.csdnimg.cn/a49bf6b409f84c90b5d6ebd1fb3eb524.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构和算法
文章平均质量分 79
算法学习记录
KamikazePilot
编程新人,希望做高级U3D
展开
-
模型的细分和简化
本质为引入更多三角形。原创 2023-06-04 14:01:49 · 567 阅读 · 0 评论 -
C++ 简易位图
位图没啥好说的,实际上就是将一个数组中所有二进制位拆分出来,一个bit表示一个bool量主要使用的还是位运算来做,非常简单,一看就会。原创 2023-02-03 00:08:13 · 198 阅读 · 0 评论 -
C++Morris遍历
Morris算法是针对二叉树实现的一个遍历算法,它是一种空间复杂度为O(1)的遍历算法通常情况下使用迭代或递归的方式遍历二叉树的空间开销都是O(N)级别的,较为理想的情况下可以做到O(logn)级别,而Morris算法通过更改节点指针指向的方式做到了它们都做不到的事情,可谓非常厉害。原创 2023-01-29 22:32:18 · 390 阅读 · 0 评论 -
C++ AVL树
众所周知红黑树是由AVL树改进得来的,想要深入学习哈希表的底层存储那么AVL的学习就相当有必要了。本来想将AVL的插入删除都能实现,但是在写删除功能时碰到了难题和Bug,所以暂时先给出插入的实现过程,和删除功能的实现思路。原创 2023-01-26 18:34:22 · 480 阅读 · 0 评论 -
C++ 实现Manacher算法
这里我们采取从中间向两边扩散的方式,动态查找可能存在的最大回文串。例如以下标位置的为中心的最长回文子串为以下标位置的为中心的最长回文子串为以下标位置的为中心的最长回文子串为但是这种求解过程有一定局限性,它无法判断长度为偶数的回文串所以如果我们需要同时判断偶数个的子串,就需要从两个值之间的位置出发判断这里的选择,是通过直接添加补间字符的方式来解决这个问题。例如:这样的话我们就可以判断偶数串的回文情况。至于为何前后各额外添加了一个,则是为了后面方便计算使用。重构字符串代码:2.暴力解法原创 2022-12-28 23:40:27 · 696 阅读 · 0 评论 -
C++ 实现字符串查找 KMP算法
刚接触KMP算法时,你大概会觉得这个算法非常诡异,一波诡异的操作处理后生成了一个`next`数组,又一波诡异的遍历操作后,就找到了目标位置(???WTF);代码倒是不长,每个单词都认识,但是放一块就不认识了,像极了四级英语阅读。。(???WTF);代码倒是不长,每个单词都认识,但是放一块就不认识了,像极了四级英语阅读。。原创 2022-12-25 00:32:59 · 1149 阅读 · 8 评论 -
C++ 实现并查集结构
其实并查集的每个小集合就是一张有向图,只不过是所有**子节点指向父节点**的图结构。他之所以能够高效的合并和查找,是因为它在查找过程中,一直在动态更改所有走过节点的父节点。原创 2022-12-23 00:47:42 · 418 阅读 · 0 评论 -
一致性哈希
这个算法是一种特殊的哈希算法,目的是解决分布式缓存的问题。普通哈希算法在分布式存储具有较大的局限性,简单的讲就是难以扩展。一致性哈希相对而言具有较好的容错性和可扩展性,更加适合现在的分布式存储。原创 2022-12-22 16:42:13 · 476 阅读 · 0 评论 -
C++ 栈逆序
题目如下:你需要不借助其他任何数据结构,通过递归实现栈的逆序(我很想吐槽这个题,怎么会有人这么干?但是鉴于它的做法比较骚,所以还是写上记录一下)。原创 2022-12-18 00:40:03 · 800 阅读 · 0 评论 -
c++ 实现Djkstra寻路算法
- 本文来自左程云左神分享的视频教程内容 - 中间有一些地方写的比较随便,后面懒得改了,就在基础上加的; - 这一篇基本都是用的指针,你问我为什么要写成指针?我也不知道,大概是那会脑子抽了; - 理解Djkstra的基本思想之后,如果需要做抽象的话,可以将`Node`节点的`value`改成泛型,也可以加一个变量在里面,记录距离长度,再重载一下运算符,就可以实现自定义排序;这里就先写成这样,需要的时候再改 - 阅读本文前你需要先了解图的相关概念,还有STL的基本知识原创 2022-12-17 02:23:45 · 975 阅读 · 0 评论 -
C++ 实现前缀树
- 前缀树是一种查找结构,常用于指定字符串或是数组、线性表等**连续信息**的存储和查找。 - 他的作用类似于哈希表,但是它相对于哈希表来说,限制更多,通用性较差,但是它的功能更加强大,可定制性也更强。原创 2022-12-10 19:00:36 · 1115 阅读 · 2 评论 -
计算点在线上的投影坐标
该线段必须给出确切的起始点和终点, 而不是一个向量,因为一个向量并不能代表一个线段。下图中蓝色标记的是未知量,黑色为已知量。向量归一化后其长度为一,所以我们可以将。又因为需要的是点到线段上的垂点。首先由向量的点积公式可知。所以我们得到的实际上是。由此即可得到目标点相对。原创 2022-11-27 20:35:34 · 1476 阅读 · 0 评论 -
C语言实现归并排序
思路:创建一个动态空间(*p)作为排序辅助数组,其大小为(right - left + 1) * sizeof(int)。归并排序每次递归的动作:将给定数组以中点为界,分为左右两部分,且左右两边的数字分别有序。(至于如何将它做到分别有序,则需使用递归实现) 使用两个指针 L(初始值为左边界) 和 R(初始值为中点右侧的第一个数字 mid + 1) ,分别指向左右两边的左节点,比较指针指向的两个数字; 如果左侧的数字小于等于右侧的数字,则将左侧的数字拷贝进入动态空间p,然后L++; 如果左侧原创 2022-04-07 14:45:57 · 4190 阅读 · 1 评论 -
C语言实现桶排序(基数排序)
桶排序是一种神奇的算法。问题:假设有数组:arr[] = { 32, 33, 23, 42, 12, 54, 53, 52,100 };该如何用桶排序?第一轮:准备十个桶子 从前向后遍历,将个位为x的数字依次放入第x个桶子中,即: 桶0:100 桶1: 桶2:32, 42, 12, 52 桶3:33, 23, 53 桶4:54 桶5: …… 将所有桶中元素依次倒出至原数组:arr[] = { 100, 32, 42, 12, 52, 33, 23, 5.原创 2022-04-07 12:25:46 · 3375 阅读 · 0 评论 -
C语言实现堆排序
要实现堆排序,首先需要了解堆排序的原理。堆排序原理: 堆的结构类似于完全二叉树,头节点位于整个结构的最上方,每个父节点从左到右依次分岔,延申出两个子节点。 每层节点从左到右在数据中是依次排列的关系。 堆中某个结点的值总是不大于或不小于其父结点的值。 上图的每个位置分别对应一个数组的元素下标HeapInsert:(末尾插入) 假设这个堆有序,且每个父节点的值大于等于其子节点:假如上图是一个数组......原创 2022-04-06 20:24:43 · 8262 阅读 · 4 评论 -
排序算法小结
时间复杂度,空间复杂度,稳定性 时间复杂度 空间复杂度 稳定性 选择 O(N^2) O(1) 无 冒泡 O(N^2) O(1) 有 插入 O(N^2) O(1) 有 归并 O(N * logN) O(N) 有 快排 O(N * logN) O(N) 无 堆排 O(N * logN) O(1) 无 桶排序 O(N)原创 2022-04-06 19:09:21 · 412 阅读 · 0 评论 -
C语言实现快排(荷兰国旗问题)
问题一:给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度0(1),时间复杂度O(N)解法一:关于这个问题,左程云(左神)的解法是创建两个标志(可以是指针),第一个标志指向左侧的移动范围用L表示,第二个标志指向数组的元素用i表示。从左到右依次遍历数组当数组中的数小于目标数字时,并且交换L位和i位的数字,L和i都左移当数组中的数不小于目标数字时,i左移,L不移动当i元素越界后结束判断表示已经分边操作完成代码如原创 2022-04-01 21:54:53 · 1595 阅读 · 1 评论