![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据和算法
文章平均质量分 82
小飞侠hello
这个作者很懒,什么都没留下…
展开
-
处理海量数据的磁盘外排序算法
当40个输入缓冲区中任何一个处理完毕时,写入该缓冲区所对应的块中的下一个0.625GB,直到全部处理完成。关键就在第5和第6步中的40路输入缓冲区,我们可以先做8路merge sort,把每8个块合并为1路,然后再做5-to-1的合并操作。①、把磁盘上的1TB数据分割为40块(chunks),每份25GB。采用分块的方法(分而治之),首先将数据分块,对块内数据按选择一种高效的内排序策略进行排序(如。的思想对于所有的块进行排序,得到所有数据的一个有序序列。③、把排序好的数据(也是25GB)存放回磁盘。....原创 2022-08-17 17:43:00 · 741 阅读 · 0 评论 -
常见的算法
双向链表用于存储数据结点,并且它是按照结点最近被使用的时间来存储的。如果一个结点被访问了,我们有理由相信它在接下来的一段时间被访问的概率要大于其它结点。当我们往双向链表里插入一个结点,我们也有可能很快就会使用到它,同样把它插入到头部。我们使用这种方式不断地调整着双向链表,链表尾部的结点自然也就是最近一段时间,最久没有使用到的结点。那么,当我们的Cache满了,需要替换掉的就是双向链表中最后的那个结点。如果没有哈希表,我们要访问某个结点,就需要顺序地一个个找,时间复杂度是O(n)。..............原创 2022-08-11 17:44:17 · 109 阅读 · 0 评论 -
浅谈查找算法
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树: 1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;然后,在已确定的块中用顺序法进行查找。d.哈希(散列)查找:复杂度:对于无冲突的Hash表而言,查找复杂度为O(1)(注意,在查找之前我们需要构建相应的Hash表)。可以分为7种查找算法:顺序查找、二分查找、插值查找、斐波那契查找、分块查找、二叉树查找法、哈希查找。......原创 2022-08-10 15:52:00 · 187 阅读 · 0 评论 -
图论算法讲解
若顶点vi和vj间的边没有方向,则称这条边为无向边,用无序偶对(vi,vj)表示;图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G=(V,E),其中V是非空有限集合,代表顶点,E是可以为空的有限集合,代表边。其对确定边操作效率高,但由于其过高的空间复杂度,对稀疏图来说造成了极大的浪费,且由于二维数组可开的空间范围有限,因此邻接矩阵一般适用于点较少的图。表示法,其方法是用一个一维数组存储图中的顶点,用一个二维数组存储图中的所有的边,存储顶点之间邻接关系的二维数组称为。...............原创 2022-07-29 17:19:45 · 826 阅读 · 0 评论 -
浅谈十大排序算法
直接插入排序原理:从待排序的n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置,每次外循环结束后,将当前的数插入到合适的位置。稳定性:稳定排序。时间复杂度: O(n)至O(n2),平均时间复杂度是O(n2)。最好情况:当待排序记录已经有序,这时需要比较的次数是Cmin=n−1=O(n)。最坏情况:如果待排序记录为逆序,则最多的比较次数为Cmax=∑i=1n−1(i)=n(n−1)2=O(n2)。................................................原创 2022-06-24 16:55:55 · 157 阅读 · 0 评论 -
数据和算法的看书推荐
比如《大话数据结构》和《算法图解》。《数据结构与算法分析:C++ 描述》分别是:《剑指 offer》《编程珠玑》《编程之美》《STL源码剖析》、《算法导论》原创 2022-06-23 14:20:42 · 323 阅读 · 0 评论 -
effective STL
基于接口和实现分离的原则。了解stl的接口和stl的实现。原创 2022-05-17 11:20:25 · 1260 阅读 · 0 评论 -
大话数据结构
时间复杂度从小到大排序:0(1) < O(logn) < O(n) < O(nlogn) < O(n2 ) < O(n3 ) < 0(2n ) < O(nl) < O(nn )线性表特点要求:有且只有一个前驱点,一个后驱点。一一对应的关系。顺序存储:用一段连续的内存地址存储数据。如vector,优点是访问元素快O(1),插入删除慢O(N).链式存储:如list(其实是环型双向链表).优点是插入删除快O(1),访问元素慢O(N).........................................原创 2022-06-06 17:46:47 · 239 阅读 · 0 评论 -
STL源码剖析之配接器
adapter(配接器)在STL组件的灵活组合运用上,扮演者转换器的角色。adapter来源于一种适配器模式,其功能是:将一个class接口转换为另一个class的接口,使得原本因接口不兼容而不能合作的classes,可以一起运作。主要包括仿函数配接器(function adapter)、容器配接器(container adapter)、迭代器配接器(iterator adapter)。应用于容器STL提供两个容器stack、queue,其实是一种适配器,它们将deque修饰为另一种容器风貌原创 2022-05-17 10:53:28 · 449 阅读 · 0 评论 -
STL源码剖析之仿函数
1.把该操作设计为一个函数,再将函数指针当成算法的一个参数;或者将该操作设计为一个所谓的仿函数(就语言而言其实是一个class),再以该仿函数产生一个对象,并将此对象作为算法的一个参数。所以仿函数其实就是一个行为类似函数的对象。仿函数类对象像函数一样被调用,调用仿函数类对象时,实际调用的是仿函数类中重载的operator()函数。仿函数的主要用途是搭配STL算法。template <class _ForwardIter1, class _ForwardIter2>_Forwa原创 2022-05-16 17:27:48 · 319 阅读 · 0 评论 -
STL 源码剖析之算法
1.用o(n)表示复杂度2.常用容器的常用算法复杂度。3.操作区间(前闭后开区间,这就是迭代器,一般用iterator begin,iterator end来表示)。迭代器就是一种行为类似指针的对象。4.算法有时需要仿函数进行配合一起使用。5.算法之排序sorta.所有的关联容器都拥有自动排序功能,不需要sort.b.序列容器中的stack、queue、priority_queue有特殊的出入口,不允许用户对元素排序。c.list的迭代器属于bidirectionaliter原创 2022-05-16 10:57:42 · 485 阅读 · 0 评论 -
散列表(哈希表)
散列表(hashtable)是居于“开链的做法”。本质是一个vector和每个vector成员维护一个link list。需要注意针对这个list搜索只能一种线性操作。hashtable 由桶子(buckets)(本质是vector)和 节点(node)(本质是list)组成。hashtable 的数据结构 所以:buckets 就是桶子,node就是节点。其中node 结构定义:迭代器结构迭代器永远维系着与整个buckets vector 的关系,......原创 2022-05-12 17:59:16 · 893 阅读 · 0 评论 -
二叉树、平衡二叉树、红黑树、B树、B+树
二叉树根节点:没有父节点的节点;叶结点:无子节点的节点;深度(或路径长度):根节点到某一节点的路径长度(边数)。高度:某节点到其最深子节点(即叶节点)的路径长度。特点:1.任何一个节点最多只有2个子节点。2.任意节点的键(key)一定大于其左子树中的每一个节点的键(key),并小于其右子树中每一个节点的键(key).红黑树R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红原创 2022-03-03 11:12:10 · 584 阅读 · 0 评论 -
STL源码剖析之迭代器
迭代器是一种行为类似指针的对象。迭代器最重要的工作是operator*、operator ->、operator ++。每一种STL容器都提供专属迭代器。2.1 迭代器相应类型概念、应用场景 & 偏特化概念在实际的算法中,在运用迭代器时,会用到迭代器所指对象中的相应类型(associate type)。那么算法实现中该如何满足 声明一个以“迭代器所指对象(中)的类型”为类型的成员/参数,或返回值是“迭代器所指对象(中)的类型”的类型 的需求呢?可分为以下三种情况:① 迭代原创 2022-05-04 18:19:38 · 784 阅读 · 0 评论 -
C++中typename的用法
1.typename的常规用法typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数;2.typename的第二个用法:修饰类型template <class T> void function() { T::iterator *iter; ..... }看到上面这个例子时,我们脑子里可能会有两种想法:第一:T::iterator *iter;实现乘法,iterator是类T的一个成员;第二:定义一个指针,指针指向的类型原创 2022-05-04 16:19:35 · 765 阅读 · 0 评论 -
STL源码剖解之空间配置器
当我们 new 一个对象的时候,包含两个操作,首先 operator new 分配内存,再调用构造函数构造对象内容 但我们 delete 一个对象的时候,同样先调用析构函数,再调用 operator delete 释放内存STL 将这个过程薄薄的包装了一下,实际上没优化配置器定义于 中, 中又包含 <stl_alloc.h> <stl_construct.h>内存配置由 alloc::allocate() 负责,内存释放由 alloc::deallocate() 负责 。...原创 2022-04-14 16:42:27 · 993 阅读 · 0 评论 -
STL源码剖析
STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。它们之间的关系可通过下图来说明。容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。 算法:各种常用的算法,如sort、find、copy、for_each等 迭代器:扮演了容器与算法之间的胶合剂。 仿函数:行为类似函数,可作为算法的某种策略。 适配器:一.原创 2022-04-13 22:19:40 · 982 阅读 · 2 评论 -
STL源码剖析之容器
容器种类 功能 序列容器 主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。之所以被称为序列容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置,元素就会位于什么位置。 排序容器 包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。排序容器中的元素默认是由小到大排序好的,即便是插入元素,元素也会插入到适当位置。所以关联容器在查找时具有非常好的性能。原创 2022-03-03 09:57:25 · 484 阅读 · 0 评论