
算法与数据结构
文章平均质量分 92
算法与数据结构的记录
selfsongs
现实生活的艰苦,像一捆粗糙的绳子,紧紧的捆住她像捆住天使。天使却从绳索中飞出来,轻轻落在绳索上,唱她应该唱、想唱的歌
展开
-
蓄水池抽样算法
从n个元素中随机取m个元素蓄水池抽样算法洗牌算法其他蓄水池抽样算法蓄水池抽样算法给定一个数据流,数据流长度N很大,且N直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出m个不重复的数据。这个场景强调了3件事:数据流长度N很大且不可知,所以不能一次性存入内存。时间复杂度为O(N)。随机选取m个数,每个数被选中的概率为m/N。算法思路大致如下:如果接收的数据量小于m,则依次放入蓄水池。当接收到第i个数据时,i >= m,在[0, i]转载 2020-11-04 12:34:48 · 441 阅读 · 0 评论 -
字符串查找函数和KMP算法原理及实现
字符串查找string自带的成员函数findKMP算法string自带的成员函数findC++中的find函数使用的是朴素匹配算法,最坏时间复杂度 ,空间复杂度 。KMP算法KMP算法的时间复杂度 ,空间复杂度为 。如果按照渐进复杂度的估计,我们自然是应该使用KMP算法了。那么为什么C++中的find函数不使用KMP算法呢?我个人认为是以下几点原因:在大多数常见场景下,需要匹配的字符是比较短的,朴素的蛮力匹配算法速度以及很快了。在使用KMP算法的时候,需要进行预处理,初始化的时间开转载 2020-09-24 22:42:14 · 3679 阅读 · 0 评论 -
图系列之_图的表示和遍历
图系列之_图的表示图两种表示方法图的遍历(DFS和BFS)代码实现无向图有向图参考:数据结构——图的概述图是由顶点V集和边E集构成,因此图可以表示成G=(V,E)G=(V,E)G=(V,E)。图两种表示方法1.邻接矩阵法;无向图邻接矩阵的特点为:主对角线一定为0且为对称矩阵有向图邻接矩阵是最容易理解的表示方法,优点是简单易懂,缺点是可能会占用很多存储空间,且没有任何意义,空间复杂度有向图是O(n2)O(n^2)O(n2)如果图的边不是很多,则不太适合用邻接矩阵表示。一般邻接矩阵适合表原创 2020-08-17 21:10:24 · 534 阅读 · 0 评论 -
红黑树原理详解
STL源码剖析—红黑树原理详解上https://blog.youkuaiyun.com/Hackbuteer1/article/details/77409561、黑父如下图所示,如果新节点的父结点为黑色结点,那么插入一个红点将不会影响红黑树的平衡,此时插入操作完成。红黑树比AVL树优秀的地方之一在于黑父的情况比较常见,从而使红黑树需要旋转的几率相对AVL树来说会少一些。2、红父如果新节点的父结点为红色,这时就需要进行一系列操作以保证整棵树红黑性质。如下图所示,由于父结点为红色,此时可以判定,祖父结点必定为黑转载 2020-08-04 17:19:58 · 2397 阅读 · 0 评论 -
并查集Disjoint_set
并查集Disjoint_set转载 2020-07-13 23:26:19 · 415 阅读 · 0 评论 -
位运算相关例题
利用“异或”处理数组的相关算法异或运算寻找数组中丢失的数找出数组中两个只出现一次的数字有N+2个数,N个数出现了偶数次,2个数出现了奇数次(这两个数不相等)异或运算异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示。运算时对运算符两侧的数转化为二进制形式,同值取0,异值取1。异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。性质1、原创 2020-06-16 18:17:06 · 627 阅读 · 0 评论 -
位图总结
位图位图位图实现位图位图BitMap:位图是一个数组,数组中的每一个数据元素的每一个二进制位表示一个数据,0表示数据不存在,1表示数据存在。如上所示,当我们需要存放一个数据的时候,我们需要安装以下方法:首先确定这个数字在整个数据的哪一个数据(区间)。确定这个数据(区间)的哪一个Bit位上。在这个位上置1即可。举例假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个B原创 2020-06-13 17:33:24 · 413 阅读 · 0 评论 -
C++智能指针
参考:头文件auto_ptr使用示例unique_ptr类模板声明示例shared_ptr模板声明通过辅助类模拟实现 shared_ptrshared_ptr使用示例weaked_ptrweak_ptr 用法weak_ptr 的作用如何选择智能指针C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:- auto_ptr(C++11已舍弃)- unique_ptr、- shared_ptr- weak_ptr,其中 auto_ptr 是.转载 2020-05-29 00:12:28 · 486 阅读 · 0 评论 -
排序算法之mergeSort,quikSort,heapSort
排序算法之归并排序,快速排序,堆排序原创 2020-05-28 14:24:04 · 842 阅读 · 0 评论 -
排序算法之bubbleSort,selectSort,insertSort,shellSort
温习冒泡排序选择排序插入排序温习关于稳定性稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。不是稳定的排序算法:选择排序(示例【2 3 2 1】)、快速排序(示例【3 1 2 3 5 4】主元2)、希尔排序(示例【】)、堆排序(示例【3 2 3 2】最小堆)。冒泡排序冒泡排序算法是最简单的排序算法,它的执行效率最低,但冒泡排序算法既适用于顺序物理结构也适用于链式物理结构数组的冒泡排序#include<iostream>#include<vector>.原创 2020-05-28 01:39:57 · 297 阅读 · 0 评论 -
单链表、双链表
单链表单向环形链表双链表双向环形链表单链表参考:https://www.jianshu.com/p/a43a5046399f 链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.链表分带哨兵节点的链表和没有哨兵节点的链表,根据实际的需求来确定操作:增删改查,清空所有内存结点结构体的定义:定义了结点之后,我们就可以把若干个结点连接在一起,形成一个链表:没有哨兵结点:带哨兵结点有时候为了操作方便,我们还会给链表增加一个不存放数据的头结.转载 2020-05-28 01:31:15 · 5947 阅读 · 0 评论 -
Bellman-Ford算法证明与代码示例
前导对于一个有权图G(V,E)G(V,E)G(V,E),记w(vi−1,vi)w(v_{i-1},v_i)w(vi−1,vi)为边vi−1,vi边v_{i-1},v_i边vi−1,vi之间的权值,路径p=(v0,v1,...,vk)p=(v_0,v_1,...,v_k)p=(v0,v1,...,vk)的权是指其所组成边的所有权值之和,w(p)=∑i=1kw(vi−1,vi)w(p)=\sum\limits_{i=1}^{k} w(v_{i-1},v_i)w(p)=i=1∑kw(vi−1,原创 2020-05-16 16:25:34 · 2897 阅读 · 2 评论