
算法与数据结构
文章平均质量分 85
比初级算法更难一点。。。
主要为分治策略,动态规划,递归回溯。
二叉树,完全二叉树,BST树,AVL树
_索伦
结束,还是开始?
展开
-
【数据结构】TrieTree(字典树、前缀树)—— C++实现
TrieTree(字典树、前缀树、单词查找树)字典树,看名字好像和字符串相关。如果你能看到这一篇文章,那么肯定学过字符串串匹配算法,即BF和KMP的模式匹配。字典树并不是来解决字符串匹配问题,而是用于以下场景:大量的单词(串),实现单词的排序功能、快速检索功能、前缀搜索功能…原创 2022-10-23 18:29:14 · 1229 阅读 · 0 评论 -
【数据结构】红黑树(RBTree)详解——C++实现
每一个节点都是有颜色的,不是黑色就是红色。根节点root必须是黑色的。所有叶子节点都是黑色的,叶子节点是NULL节点,不存储实际的数据。每个红色节点必须有两个黑色的子节点,或者说是从每个叶子节点到根节点的所有路径上不能有连续的红色节点。从任一节点到其每个叶子上的所有简单路径都包含相同数目的黑色节点。因为每个节点不是红色就是黑色,所以需要定义一个颜色相关的枚举量。还需要操作其父节点,所以定义一个parent指针。private :// 节点颜色 enum Color {原创 2022-10-15 23:03:16 · 873 阅读 · 0 评论 -
【数据结构】AVL树——C++实现
AVL树特点:**在BST树的基础上,引入了节点“平衡”的概念,任意一个节点的左右子树高度差不超过1。****为什么要引入平衡这个概念?**在BST树中,由于插入后就是排序好的,那就会存在这样一种情况:如果插入的元素依次增大,就会导致理想中的二叉树,形成了一个链表,如下图,这种情况会导致增删查的时间复杂度并不是O(logn),而是O(n)。为了解决这样情况,引入了平衡的概念。原创 2022-10-01 22:53:53 · 1143 阅读 · 3 评论 -
数据结构与算法:大小根堆和快速排序 解决TopK问题
问题:求出一组序列中值最小的前K个元素在正常做法中,是先对这组元素排序,然后得出前k个元素,但排序算法的时间复杂度为O(n^2)或O(nlogn),问题就是 能不能在线性时间内找到top k的元素呢?原创 2022-09-24 11:30:28 · 894 阅读 · 1 评论 -
数据结构与算法:Bloom Filter(布隆过滤器)解决大数据查重问题
在内存有所限制的情况下(如上面的面试问题),快速判断一个元素是否在一个集合(容器)当中,还可以使用。布隆过滤器到底是个什么东西呢?原创 2022-09-23 21:58:52 · 1369 阅读 · 0 评论 -
数据结构与算法:bitmap位图法解决大数据查重问题
有1亿个整数,最大值不超过1亿,问都有哪些元素重复,谁是第一个重复的,谁是第一个不重复的,内存限制100M。原创 2022-09-22 21:33:32 · 1130 阅读 · 0 评论 -
数据结构:哈希表解决大数据查重问题
在面试过程中,有时候会被问到,在上亿个数据中,找出第一个重复的数据,或找出所有重复出现的数据。原创 2022-09-22 17:31:33 · 1467 阅读 · 0 评论 -
数据结构:哈希表——线性探测哈希表、链式哈希表的实现
使关键字和其存储位置满足关系:存储位置 = f(关键字),这就是一种新的存储技术-散列技术。散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key),在查找时,根据这个确定的对应关系找到给定key的映射f(key),如果待查找集合中存在这个记录,则必定在f(key)的位置上。我们把这种对应关系f称为散列函数,又称为哈希函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或者哈希表(Hash Table)。原创 2022-09-22 16:50:09 · 689 阅读 · 0 评论 -
数据结构:二叉排序树—— insert()函数,非递归中序遍历,Remove()函数
文章目录一、二叉排序树的概念二、二叉排序树的结构设计三、构造二叉排序树1.Insert()函数一、二叉排序树的概念1.BST树的定义:二叉排序树,二叉搜索树。二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同。左子树(如果存在)上所有结点的关键码都小于根结点的关键码。右子树(如果存在)上所有结点的关键码都大于根结点的关键码。左子树和右子树也是二叉搜索树。2.特性:如果对一个BST树进行中序遍历,得到的结果是各个结原创 2022-05-11 15:18:32 · 1032 阅读 · 0 评论 -
数据结构:二叉树的遍历——层序遍历、锯齿形遍历
前言在前面的二叉树讲解中,使用了非递归的方式遍历二叉树基本上都是使用栈来辅助。二叉树的遍历(非递归)【点此查看】文章目录前言二叉树的层序遍历方法代码计算二叉树结点个数代码计算二叉树的深度代码二叉树的锯齿形层序遍历方法二叉树的层序遍历二叉树如图所示:请按照层序遍历方法层序遍历就不能借助栈了,但可以借助队列。初始状态将队头结点出队并打印该结点的值,并看该结点有没有左右子树,有就入队列循环,继续出队,直到队列为NULL代码void LevelOrder(BtNode* ptr)原创 2022-05-06 21:00:16 · 919 阅读 · 0 评论 -
数据结构:二叉树:二叉树的先序、中序、后序遍历(非递归方式)
数据结构二叉树的遍历迭代方法栈+计数方法原创 2022-04-26 23:22:28 · 4683 阅读 · 0 评论 -
数据结构:树的概念 | 二叉树的概念 | 根据前序和中序遍历构建二叉树 | 根据中序和后序遍历构建二叉树
文章目录一、树的概念1.名词解释二、二叉树的概念一、树的概念树是由n(n >= 0)个结点组成的有限集合,如果n = 0, 则称为空树,如果n > 0,则有一个特定的称之为根(root)的结点,它只有直接后继,没有直接前驱。除根以外的其他结点划分为m个互不相交的有限集合,每个集合又是一棵树,并且称之为根的子树(subtree),每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。1.名词解释节点的度:一个节点含有的子树的个数称为该节点的度;树的度:一棵树中,最原创 2022-04-24 22:35:34 · 360 阅读 · 6 评论 -
算法:动态规划——最长公共子序列
文章目录一、动态规划概念1. 动态规划步骤最长公共子序列问题题目示例分析代码(递归)查表打印最长公共子序列一、动态规划概念动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多原创 2022-04-23 10:50:46 · 6711 阅读 · 1 评论 -
算法题:全排列问题
全排列原创 2022-04-15 12:44:54 · 743 阅读 · 1 评论 -
算法:归并排序复习 | 递归与非递归写法——笔记自用
void Copy(int* src, int* dest, int left, int right){ while (left <= right) { dest[left] = src[left]; left++; }}void Merge(int* src, int* dest, int left, int m, int right){ int i = left, j = m + 1; int index = left; while (i <= m &&原创 2022-04-14 19:51:58 · 256 阅读 · 0 评论 -
算法题:线性时间选择 | 求数组中第K小的元素 |一维点集S的最接近点对算法
线性时间选择:求出数组第k大的数原创 2022-04-14 11:03:46 · 748 阅读 · 0 评论 -
算法 :快速排序详解 | 递归与非递归形式 | 优化方案 | 单向划分如何编写?
快速排序详解递归与非递归形式解析如何优化:三数取中法 随机划法*单项划分如何编写*原创 2022-04-13 17:29:25 · 395 阅读 · 0 评论 -
算法:分治策略和递归1 | 通过迭代来学习递归
文章目录分治策略和递归分治策略的步骤示例1:阶乘问题示例2:打印数组的值示例3:在数组中查找目标值分治策略和递归分治策略: 是将规模比较大的问题可分割成规模较小的相同问题。问题不变,规模变小。 这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。递归:若一个函数直接地或间接地调用自己,则称这个函数是递归的函数。(简单地描述为“自己调用自己”)。分治法所能解决的问题一般具有以下四个特征:该问题的规模缩小到一定的程度就可以容易地解决。该问题可原创 2022-04-13 11:23:22 · 423 阅读 · 0 评论