数据结构和算法
_Madrid
华而无实
展开
-
数组类—StaticArray
StaticArray上一节数组类的抽象类里我们在程序里构造的Array类里定义了成员的地址变量,有了可以返回数组的大小的方法,也通过下标合法性的检查避免了数组越界的问题,但是还有一个问题没有解决,就是数组之间可以赋值。在这篇博客里,我们新创建的一个类继承自Array类,然后去客服数组间不能互相赋值的问题。设计要点:类模板封装原生数组实现函数返回数组长度拷贝原创 2017-11-28 19:05:21 · 742 阅读 · 0 评论 -
snowflake
文章目录snowflake原理优点缺点源码解读包变量解读节点生成一个节点生成ID关于作者snowflake这个算法是twitter开源的,作用是分布式下生成全局唯一的ID。原理Each time you generate an ID, it works, like this.A timestamp with millisecond precision is stored using 4...原创 2019-01-31 17:04:41 · 644 阅读 · 0 评论 -
Morris先序中序遍历
文章目录Morris先序中序遍历实现原理先序遍历中序遍历疑问总结关于作者Morris先序中序遍历这里把Morris实现先序中序遍历放在一起记录是因为先序和中序原理相同。这两者都和各自的递归版本有着很强的联系性。实现原理在上一节Morris遍历文章中,阐述了递归的本质。再来熟悉下:递归实现前中后序遍历二叉树的算法非常简单,但是深入探究背后,会发现三者其实是统一的。为什么这么说,这是因为三...原创 2019-01-14 18:20:42 · 477 阅读 · 0 评论 -
Morris遍历算法
文章目录Morris遍历概念步骤再论递归遍历Morris序分析后续关于作者Morris遍历二叉树有前中后序遍历,还有层次遍历,为什么还需要Morris遍历呢?考虑一下前中后序的遍历,这三种的空间复杂度总是逃不过O(h),h=height(root),层次遍历的空间复杂度也不可能达到O(1),恰巧Morris遍历就是空间复杂度为O(1)的遍历,而且时间复杂度依旧保持O(N)。概念对二叉树进...原创 2019-01-12 23:47:46 · 574 阅读 · 0 评论 -
trie
前缀树前缀树主要用于词频统计,一些补全也可以实现。特点根节点不包含字符,除根节点意外每个节点只包含一个字符。从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符串不相同。结构type node struct { pass int end int child map[byte]*node}pass:节点添加的次数...原创 2019-01-17 18:02:33 · 363 阅读 · 0 评论 -
LRU
最近频繁的看到LRU这个关键词,而且在公司也听到了,于是乎趁着国庆无聊就搜索了解了一下,本来以为是多么玄乎的技术,发现只是比较简单的两个数据结构的结合。为什么需要LRU缓存是很重要的一项技术,可以加速我们的访问。但是缓存是有容量的,不能无限制的缓存,所以我们缓存一定量的时候就需要淘汰缓存中的内容,那么我们根据什么来进行这个淘汰的过程呢?读到这里也就可以明白了,我们需要缓存机制来指导这个淘汰...原创 2018-10-06 21:08:08 · 2077 阅读 · 0 评论 -
并查集
作用: 合并两个集合,查询两个元素是否在同一个集合中。代表元:一个结合中的某个元素,此元素可以代表这个集合。大概实现: 把集合想象成一棵树,集合中的代表元是根节点,根节点的父亲是自身,根节点有孩子,孙子...,而且我们还有一个变量维护了当前树的节点个数,而且这个值只有根节点有权访问。形象原理: 之前学习的时候查看别人博客,觉得有一段解释非常形象,在这里借用一下。 (原博文地...原创 2018-07-03 12:12:41 · 261 阅读 · 0 评论 -
二叉堆
结构: 完全二叉树分类 大根堆:以任意节点作为根节点的树中的最大值就是根节点 小跟堆:以任意节点作为根节点的树中的最小值就是根节点基本操作 heapInsert:向上调整 heapIfy:向下调整 heapPop:删除并返回堆顶元素实现原理 因为是一颗完全二叉树,所以采用数组实现。如果一个节点位置索引为i,父节点为:(i-1) / 2,左孩子:2*i +1...原创 2018-06-27 10:37:39 · 113 阅读 · 0 评论 -
Trie
Trie树的三个基本性质,很简单,网上随便一篇博客都可以查出来,罗列如下: 1、根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 3、每个节点的所有子节点包含的字符都不相同。 应用的场景就是查询字符串,字符串的前缀,词频统计等等。优点是查询的效率非常高,缺点是利...原创 2018-06-29 16:05:34 · 683 阅读 · 0 评论 -
线性表的顺序存储结构
线性表的顺序存储结构顺序存储定义:线性表的顺序存储结构,是指用一段连续的内存空间一次存储线性表中的数据元素设计思路:使用一位数组实现,直接申请一段大小固定的连续的内存空间程序表现:class SeqList : public List{protected: T* m_array; int m_length;public: bool inse原创 2017-11-27 17:52:00 · 282 阅读 · 0 评论 -
数组类
数组类开发理由:原生的数组创建后没有大小的概念原生数组对越界访问只有警告,不易发现数组变量之间不能互相赋值设计要点:抽象类模板存储空间的位置和大小由子类完成提供数组长度的抽象函数[]操作符重载,判断下标是否合法同类型对象间的复制操作代码表现:template class Array : public Object{prot原创 2017-11-28 14:30:29 · 288 阅读 · 0 评论 -
顺序存储结构线性表—DynamicList
DynamicList在上一片博客里说到了一种基于顺序存储结构的实现,即StaticList,这一篇说另外一种DynamicList。这个类也要继承SeqList类,初始化父类的成员变量和重写capacity。StaticList和DynamicList都是继承自SeqList,大部分的实现都是一样的,那么不一样的就是DynamicList相比于StaticList来说,它的大小是可以原创 2017-11-27 23:41:37 · 369 阅读 · 0 评论 -
顺序存储结构线性表—StaticList
StaticList在顺序存储结构里说到了基于顺序存储结构的有两种具体的实现,一种就是StaticList。而且也说道了这个类要继承SeqList类,而且要初始化父类的成员变量和重写capacity,并且实现方法的具体操作。设计要点:类模板使用原生数组作为顺序存储空间使用模板参数决定数组的大小程序表现:template class Stati原创 2017-11-27 19:54:31 · 181 阅读 · 0 评论 -
线性表
线性表抽象定义:具有相同类型的n(n>=0)个数据元素的有限序列。表现形式:1、数据元素类型相同2、零个或多个数据元素的集合,个数必须有限3、元素之间是有序排列的性质:1、第一项只有一个后继2、最后一项只有一个前驱3、除首尾项,其它每一项都有一个前驱和一个后继常用操作:1、元素插入2、元素删除3、获取指定位置的元素原创 2017-11-27 17:31:07 · 133 阅读 · 0 评论 -
链式存储结构线性表
链式存储结构线性表顺序表的问题:1、顺序表的访问和修改的时间复杂度是常数级的,非常快。但是顺序表的插入和删除的缺不好,这两种操作的时间复杂读是O(N),看上去挺好,但是顺序表的插入和删除是通过大量数据的移动形成的。考虑最坏的情况,一个顺序表很长,在第一个位置插入元素,或者删除一个很长的顺序表的第一个元素,需要移动大量的元素,当元素的类型是复杂的类类型时,这种情况就更糟了。2、顺序表原创 2017-12-01 20:56:38 · 438 阅读 · 0 评论 -
单链表的实现
继承的类:List类成员变量:class LinkList : public List{protected: struct Node : public Object { T value; Node* next; }; mutable struct : public Object { c原创 2017-12-08 20:14:01 · 190 阅读 · 0 评论 -
数组类—DynamicArray
DynamicArray上一篇说到了数组类的一种具体对象,这篇里面来说另一种。就是DynamicArray,既然StaticArray已经够好了,为什么还要有DynamicArray呢。就如同前几片博客里讲的基于顺序存储结构的线性表的两种实现一样,我们想让这个对象可以动态的改变自己的存储空间的大小,这样就会更加灵活。设计要点:类模板在堆中申请一定的空间作为存储空间原创 2017-11-28 20:27:53 · 4755 阅读 · 0 评论 -
base64
base64有些协议是文本协议,但是需要传输二进制数据。base64正是将二进制数据转换为可显示字符集的一种编码。思想标准ascii中127个字符,[0-31]和127是不可显式的字符。那么[32-126]这个区间,94个字符是可以显示的。base64只选用了其中的64个字符,为什么选用64个呢,这个算法实现是有关联的。字符肯定和数据是联系起来的,为了能表示64个字符,需要6位的二进制数据...原创 2019-02-14 18:30:36 · 348 阅读 · 0 评论