数据结构
用C++语言讲解ACM数据结构基本算法
我终将成为你
一个大二的笨蛋大学生,喜欢看点算法 ,打算专攻机器学习。
因为有些颓废,大二上就开始实习,两段实习,中小厂AI算法边角料实习,中大厂产品经理。
感觉上班真累,重新激起学习的欲望。
展开
-
数据结构——哈希表C++
哈希表一个重要的点是处理冲突,冲突就是一个数经过哈希函数处理后得到的结果,已经被其他数得到过,那哈希表该位置上就已经存在数据了,这就引起了冲突。关键就在于一个find函数,如果找到了,返回该数的位置,如果没找到,返回该数应该放的位置。如遇冲突,将数据也放在该位置上,排在已有数据后面,像拉链一样。这个方法比简单,就是你若这个位置上有数了,就继续往后找。把一些范围很大的数,通过哈希函数,映射成小范围的数。哈希表按照两种不同的处理冲突的方法,分为两类。(以下列举两种处理冲突的方式)原创 2023-11-03 22:57:57 · 218 阅读 · 2 评论 -
数据结构——堆排序C++
堆实质上是一个完全二叉树,将根结点最大的堆叫做大顶堆,根结点最小的堆叫做小顶堆。堆是一个线性结构,相当于一个数组,每个结点都有两个后继。以大顶堆为例,每个结点都大于其左右两个子树的任意结点,依次类推。假设堆用数组heap[ ]模拟。用一个一维数组来模拟堆,对于x结点,左儿子是2x,右儿子是2x+1。在细讲手写堆的操作之前,先声明一点:堆的作用就是维护堆顶,即找出一组数的最大值或最小值。对于堆中元素的位置,只有两个操作,up和down。原创 2023-10-26 19:26:00 · 204 阅读 · 1 评论 -
数据结构——Tire树(字典树)
高效存储和查找字符串字符串集合的数据结构这是一种树形数据结构,用空间换时间,利用字符串相同的前缀降低算法复杂度。常用的操作有插入和查询。下图展示了字典树结构和建立方法:创建一颗Tire树的方法就是,从树根开始查找,如果没有当前字符,创建一个子结点,如果有,继续向下查找,依次向下。原创 2023-10-16 15:50:58 · 186 阅读 · 2 评论 -
数据结构——并查集C++
基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点储存他的父节点,p[x]表示x的父节点。这是一道最简单的并查集题目,没有附加存储信息,关键就在于每个结点的祖宗结点,只需要注意这一个信息就可以了!如何求集合编号:while(p[x]!=x)x=p[x];如何合并两个集合:把一个根节点接到另一个上。2.询问两个元素是否在一个集合当中。如何判断树根 p[x]==x;原创 2023-10-18 22:30:20 · 137 阅读 · 1 评论 -
数据结构——KMP C++
算法的核心就在于,利用已经匹配好的某段字符串,寻找这段字符中的相等的前缀和后缀,然后一次性获得最小的移动,使移动完还匹配地上,巧妙!我的阐述不是很清晰,下面以KMP板子题为例,进一步分析。KMP算法全称是Knuth-Morris-Pratt 算法,是Knuth,Morris,Pratt这三个人一起研究出来的字符串匹配算法,通过已经匹配过的字符来降低时间复杂度。原创 2023-10-14 00:46:47 · 120 阅读 · 1 评论 -
数据结构——单调队列C++
与单调栈几乎一样,原理也一模一样,唯一的不同就是队头元素可以出去,适配于滑动窗口。原创 2023-10-12 22:59:57 · 134 阅读 · 0 评论 -
数据结构——单调栈C++
单调栈的最典型应用是在一个数组中,找到离该数最近的,较大或较小的数。单调栈实际上底层逻辑是一个双指针算法,是对暴力双循环的简化。以板子题为例:如有数组 3 4 2 6 7 1输出在各数左边比他小的数,如果没有,输出-1。暴力做法显而易见是运用双重循环,运用双指针算法,j指针一直往后移,指向当前要处理的数,i指针要指向符合题目条件的数(单纯用指针模拟较难得到结果,所以用栈这种数据结构的栈顶来代替i指针)原创 2023-10-12 00:14:50 · 200 阅读 · 0 评论