![](https://i-blog.csdnimg.cn/direct/6b50958cf18d42029f42e141a977966c.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 88
数据结构与算法取经之路
UrSpecial
这个作者很懒,什么都没留下…
展开
-
【数据结构取经之路】快速排序的非递归实现
递归实现快速排序在一些场景下有栈溢出的风险,下面就谈谈如何用非递归的方法实现快速排序。原创 2024-03-13 23:03:42 · 351 阅读 · 0 评论 -
【数据结构取经之路】单链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。,数据域就是存储数据的存储单元,指针域就是连接每个结点的地址数据。接着再来说说单链表的意义,也就是它的优势。单链表的优势是相对于和它同属于线性表的顺序表而言的。顺序表的特点是逻辑关系上相邻的两个元素在物理位置上(内存中的真实存储情况)也相邻 ,因此,可以通过下标的随机访问来取出任意元素。但也正因为顺序表物理空间上的连续,在作插入或删除操作时,需要移动大量元素。原创 2024-01-05 15:12:46 · 1716 阅读 · 1 评论 -
【数据结构取经之路】栈
用数组实现的栈叫顺序栈,用链表实现的栈叫链式栈,本文讲解的是顺序栈。初始化操作一般有两种,第一种,在初始化时就给数组分配一定的空间,第二种,初始化时不给分配空间,第一次插入数据时才个数组分配空间。虽然简单,但请不要写成pst->a[pst->top--]. 后置--是有副作用的,也就是说会改变top的值,但这里不需要改变top的值。顺序栈的删除实际上就是数组最后一个元素的删除,不需要挪动数据,top--即可,这样即使数组中还存在该元素,但是已经访问不到了。top的值就是栈的大小,所以返回top即可。原创 2024-03-19 23:06:18 · 614 阅读 · 0 评论 -
【数据结构取经之路】归并排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。原创 2024-03-11 11:00:30 · 944 阅读 · 0 评论 -
【数据结构取经之路】快速排序及其优化
快速排序由C. A. R. Hoare在1962年提出,快速排序是一种高效的排序算法,其核心思想是通过一次排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的数据要小,然后再按此方法对这两部分数据分别进行快速排序,以实现整个序列有序。下文将给出实现快排的三种方法:霍尔法、挖坑法、前后指针法。同时也会给出面对一些特殊场景做出的优化。原创 2024-03-13 16:14:46 · 842 阅读 · 0 评论 -
【数据结构取经之路】建堆&堆排序
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。原创 2024-03-15 13:51:06 · 741 阅读 · 0 评论 -
【数据结构取经之路】希尔排序
而多组并排呢,是先对9和6进行插入排序得到6 9,接着对下一组(蓝色数组)的8和5进行插入排序,并不是一次性将蓝色数组排好序得到2 5 8,而是不同组之间交替的进行部分插入排序。相较于直接插入排序,当gap不等于1时,元素不是一步一步的挪动的,而是跳跃式的移动,从而使得在进行最后一趟增量gap = 1的插入排序时,数组已基本有序,只要少量移动和比较即可完成排序。希尔排序的分析是一个复杂的问题,因为它的时间是所取“增量”序列的函数,这涉及到一些数学上尚未解决的难题。间隔为gap的分为一组,总计gap组。原创 2024-03-16 00:32:37 · 722 阅读 · 0 评论 -
【数据结构取经之路】布隆过滤器BloomFilter原理、误判率推导、代码实现
在一些场景下面,有大量数据需要判断是否存在,而这些数据不是整形,导致位图就派不上用场。这时,时代无比呼唤一种新的解决方案,布隆过滤器也就应运而生了。布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好得多,缺点是有一定的误判率和删除困难。原创 2024-09-02 22:03:20 · 886 阅读 · 0 评论 -
【堆、快速选择排序】探寻TopK问题的解决方案
TopK问题在面试中常常被问到 —— 比如,在10亿个整数里,找出最大的前100个。在海量数据中查找出重复出现的元素或者去除重复出现的元素也是常考的问题。所以在对待TopK问题上,我们可不敢掉以轻心。下面,我们进入正题。TopK问题就是在一个数据集合中找出最大的前K个或者最小的前K个。在面试中遇到这个问题时,通常它的数据量很大,动不动就上亿或者海量数据。这就导致我们无法直接在内存中对所有数据进行排序或者说排序的时间成本很高等等,因此这类问题通常不采取直接排序再查找的做法。下面我们看看几种常见的做法。原创 2024-09-04 09:05:44 · 573 阅读 · 0 评论 -
【STL】list的模拟实现
1)list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2)list的底层是双向链表结构。3)list和forward_list非常相似,最主要的不同在于forward_list是单链表,只能朝前迭代,以让其更简单高效。4)与其他的序列容器相比(array, vector, deque),list通常在任意位置进行插入、删除元素的执行效率更高。5)与其他序列容器相比,list和forward_list的最大缺陷是不支持随机访问。原创 2024-07-01 21:13:34 · 746 阅读 · 0 评论 -
【C++】string类常用函数用法总结
const char& operator[] (size_t pos) const,const_iterator begin() const,const_iterator end() const,const修饰*this,即this指针指向的内容,所以this指针指向的内容不可修改,用法上和其他函数是一样的。resize(size_t n)和resize(size_t n, char c)都是将字符串的有效个数改变到n个,不同的是,当使用 std::string::resize(size_t n)原创 2024-05-13 12:39:13 · 779 阅读 · 0 评论 -
【数据结构取经之路】二叉搜索树的实现
首先,二叉搜索树是一种数据结构,了解二叉搜素树有助于理解map和set的特性。K _key;原创 2024-07-13 13:37:49 · 1036 阅读 · 0 评论 -
【二叉树】非递归实现前中后序遍历
根左子树 右子树2)中序:左子树根右子树3)后序:左子树 右子树根可以看出,这三种遍历方式的本质区别在于什么时候访问根节点,下面将介绍一种很厉害的思想,对于前中后序的非递归实现,它可以是通解。原创 2024-05-28 09:52:46 · 1052 阅读 · 1 评论 -
【STL】优先级队列用法介绍及其实现
优先级队列(priority_queue)是一种特殊的队列数据结构,其中每个元素都有一个“优先级”。优先级最高的元素最先出队,而优先级最低的元素则最后出队。元素优先级的高低通常由它的值决定。//传迭代器区间构造//插入//弹出队头void pop();//返回队头元素但不删除//队列中的数据个数//判断队列是否为空其中,上述构造函数的第三个参数为仿函数,在下面的实现中将会介绍。原创 2024-06-02 23:55:58 · 358 阅读 · 0 评论 -
【数据结构取经之路】位图全解
位图(Bitmap)是一种非常高效的数据结构,主要用于处理大量数据的快速查找、去重等操作。它利用每一位(bit)来表示某个元素是否存在或某种状态,从而极大地节省了存储空间。在内存和存储空间相对受限的环境下,位图尤其有用。下面,我们先瞅一眼C++标准库里的位图,然后再抽出它的核心部分来自己实现。原创 2024-09-01 12:10:25 · 1023 阅读 · 0 评论 -
【数据结构取经之路】队列&循环队列
循环队列的实现一般定义两个指针,头指针front和尾指针rear,front和rear开始都赋为0,每插入一个元素,rear++,每删除一个元素,front++,这和顺序栈如出一辙。因为是用单链表实现队列,如果仅仅记录队头,那么在插入数据时必须得遍历一遍链表,找到队列的尾,才能链接上新的结点,这是一个不小的消耗,所以,除了对链表的结点封装成一个结构体(A)外,还可以再封装一个结构体(B),B结构体成员里包含结构体A。在销毁节点A前,需要先记录A的下一个结点,否则把A释放后,将找不到它的下一个节点。原创 2024-03-21 23:55:49 · 697 阅读 · 0 评论 -
【STL】vector的模拟实现
1)vector是可变数组大小的序列容器2)与数组相比,vector提供了更多的功能3)vector会分配一些额外的空间以适应可能得增长。原创 2024-07-07 23:57:01 · 920 阅读 · 0 评论