数据结构与算法
文章平均质量分 65
TABE_
这个作者很懒,什么都没留下…
展开
-
C++ STL sort函数的底层实现
sort函数的底层用到的是内省式排序以及插入排序,内省排序首先从快速排序开始,当递归深度超过一定深度(深度为排序元素数量的对数值)后转为堆排序。先来回顾一下以上提到的3中排序方法:其中先讲下快排和堆排,快排的平均复杂度为nlogn,但是它的复杂度是根据基准值来决定的,基准值选择的不好,最坏的复杂度会达到n2,而堆排序的复杂度是一定的为n*logn,那为什么不直接使用堆排序呢,是因为在将堆顶值与最后一个结点值交换并移除最后一个值后,在重新建堆的过程中,交换到堆顶的值显然比每个结点要小,但还是要经过对比判断,这原创 2022-07-10 21:01:35 · 1967 阅读 · 0 评论 -
任意等概率随机数转换(用 Rand7实现 Rand10等)
已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。解题思路如下:rand7()-1 可生成 1 到 7 范围内的均匀随机整数1,2,3,4,5,6,7.rand7()-1 可生成 1 到 7 范围内的均匀随机整数0,1,2,3,4,5,6.(rand7()-1)*7 可生成 0,7,14,21,28,35,42这些随机数那么(rand7()-1)*7)+rand7()产生1,2,3,…,49的随机数我们想要产生原创 2022-03-13 20:39:00 · 2461 阅读 · 0 评论 -
常见的排序算法
这里写目录标题插入排序直接插入排序希尔排序选择排序选择排序堆排序交换排序冒泡排序快速排序归并排序插入排序直接插入排序将数组中的所有元素依次和前面的已经排好序的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。场景:现有一个无序数组,共7个数:89 45 54 29 90 34 68。使用直接插入排序法,对这个数组进行升序排序。89 45 54 29 90 34 6845 89 54 29 90 34 6845 54 89 29 90 34 6829 45原创 2022-03-06 16:50:55 · 328 阅读 · 0 评论 -
二叉树的统一迭代法
二叉树的统一迭代法迭代法中序遍历迭代法前序遍历迭代法后序遍历我们发现迭代法实现的先中后序,其实风格也不是那么统一,除了先序和后序,有关联,中序完全就是另一个风格了,一会用栈遍历,一会又用指针来遍历。其实针对三种遍历方式,使用迭代法是可以写出统一风格的代码!接下来介绍一下统一写法。我们以中序遍历为例,使用栈的话,无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。那我们就将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。如何标记呢,就是要处理的节点放入栈之后,紧接着原创 2021-10-09 23:33:50 · 346 阅读 · 0 评论 -
贪心算法和动态规划的区别
贪心算法是动态规划的一个特例,动态规划是贪心算法的泛化。动态规划类似于穷举法,只是记录了之前的结果,不需要进行重复的计算,可以利用前边的结果(状态方程),一般复杂度比贪心高,但是可以得到全局最优解。贪心算法每次只考虑当前,不保证能得到全局最优,只保证当前最优,应用前一般需要证明,一般复杂度比较低。...原创 2022-03-02 21:24:44 · 3719 阅读 · 0 评论 -
跳表skiplist
这里写目录标题跳表介绍查找操作插入操作删除操作概率均衡技术跳表性能跳表应用跳表介绍跳跃列表(也称跳表)是一种随机化数据结构,基于并联的链表,其效率可比拟于二叉查找树(对于大多数操作须要O(logn)平均时间)。跳表是对有序的链表添加上附加的前进链接,添加是以随机化的方式进行的,所以在列表中的查找能够高速的跳过部分列表元素,因此得名。跳表的全部操作都以对数随机化的时间进行。一个简单的跳表如下所示:传统意义的单链表是一个线性结构,向有序的链表中插入一个节点须要O(n)的时间,查找操作须要O(n)的时原创 2022-01-18 21:38:25 · 757 阅读 · 0 评论 -
B树和B+树
目录B树B树优点B树的不足B+树B+树的优点B树B树又名平衡多路查找树,即一个结点的查找路径不止左、右两个,而是有多个。数据库索引技术里大量使用者B树和B+树的数据结构。一个结点存储多个值(索引)。B树的阶数:M阶表示一个B树的结最多有多少个查找路径(即这个结点有多少个子节点)。M=2是二叉树,M=3则是三叉树。一棵M阶B树有以下特点。特点:每个结点的值(索引) 都是按递增次序排列存放的,并遵循左小右大原则。根结点的子节点个数为 [2,M]。除根结点以外的非叶子结点的子节点个数为[Math原创 2022-01-04 21:35:13 · 1210 阅读 · 0 评论 -
红黑树和AVL树
一,AVL树(平衡二叉树)(1)简介AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树树高不超过1,和红黑树相比,AVL树是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差的绝对值不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的,由此我们可以知道AVL树适合用于插入与删除次数比较少,但查找多的情况。(2)局限性由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用转载 2021-04-26 16:25:11 · 4266 阅读 · 0 评论 -
哈希表详解
这里写目录标题哈希表的概念哈希冲突开放地址法链地址法哈希表的概念散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。哈希冲突在理想的情况下,每一个 关键字,通过哈希函数计算出来的地址都是不一样的。但是在实际情况中,我们常常会碰到两个关键字key1≠key2,但是f(key1) = f(key2), 这原创 2021-12-30 20:18:54 · 3317 阅读 · 0 评论 -
堆的构建、插入和删除
堆操作堆的构建堆的插入堆的删除代码实现堆的调整堆的构建和插入堆的删除本文以小顶堆为例,介绍了堆的构建、插入和删除操作的实现过程,本文所使用的小顶堆如下:堆的构建初始数组为:9,3,7,6,5,1,10,2,按照完全二叉树,将数字依次填入vector。填入后,找到最后一个结点的父节点(或者直接从vector.size()/2处)开始调整。以此类推,自底向上调整到根节点。堆的插入首先在vector末尾插入数字0,vector的大小加1。从0的父节点开始,依据最小堆的定义,自底向上,递归调原创 2021-07-16 11:49:32 · 781 阅读 · 0 评论 -
计算机四则运算——逆波兰式
A+B*(C-D)-E*F的语法树如下:中缀表达式1.1定义2.1定义2.2求值2.3中缀表达式转换为前缀表达式3.1 定义3.2 求值3.3 中缀表达式转换为后缀表达式1.1定义我们最熟悉的一种表达式A+B*(C-D)-E*F等是中缀表示法。中缀表达式是由相应的语法树中序遍历得到的。中缀表达式先算括号里的,然后算乘除,最后算加减,但是,计算机处理中缀表达式却并不方便,因为没有一种简单的数据结构可以比较方便的从一个表达式中间抽出一部分进行计算,计算完成后再放进去,然后继续后面的计算(链表也许可以,原创 2021-05-14 16:25:40 · 3102 阅读 · 0 评论