![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
一纸一清风
滋滋有味的学习 津津有味的生活
展开
-
用顺序表实现栈
栈是一种有约束的顺式结构,他需要遵循先进后出,后进先出的基本规则,我们可以用顺序表和链表两种方式来实现因为简单就意味着不容易出错,所以在这里我使用顺序表来实现栈Stack.h#pragma once#include<Windows.h>#include<assert.h>//对于栈我们可以用顺序表和链表来实现,栈的代码并不难,在此处,为了省事,直接用顺序表来...原创 2018-10-27 11:14:27 · 724 阅读 · 0 评论 -
STL----multimap
简介Multimap是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key, value>,其中多个键值对之间的key是可以重复的 在multimap中,通常按照key排序和唯一的标识元素,而映射的value存储与key关联的内容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组...原创 2019-08-21 19:28:00 · 196 阅读 · 0 评论 -
STL----set
简介set是按照一定次序存储元素的容器 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序 set容器通过key访问单个元素的速度通常比unordered_s...原创 2019-08-21 20:54:16 · 148 阅读 · 0 评论 -
STL----multiset
简介multiset是按照特定顺序存储元素的容器,其中元素是可以重复的 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T),multiset元素的值不能在容器中进行修改(因为元素总是const的),但是可以从容器中插入或删除 在内部,mu...原创 2019-08-21 21:04:48 · 199 阅读 · 0 评论 -
STL----list
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素 list和forward_list非常相似:最主要的不同在于forward_list是单链表,只能向前迭代,让其更简单和高效 与其他序列式容器相比(array , vector, ...原创 2019-08-13 11:40:47 · 101 阅读 · 0 评论 -
list和vector区别
vector list 底层结构 动态顺序表,一段连续的空间 带头节点的双向链表 随机访问 支持随机访问,访问某个元素效率O(1) 不支持随机访问,访问某个元素效率O(N) 插入和删除 任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入是有可能会造成扩容,增容,开辟空间,拷贝元素,释放旧空间,导致效率更低 任意位置的插...原创 2019-08-13 11:58:56 · 534 阅读 · 0 评论 -
二叉搜索树
概念二叉搜索树又称二叉排序树,它或者是一颗空树,或是具有以下性质的树若它的左子树不为空,则它的所有左子树上的节点都小于根节点的值 若它的右子树不为空,则它的所有右子树上的节点都小于根节点的值 它的左右子树也分别为二叉搜索树二叉树的操作二叉树的插入将插入节点与根节点进行比较,比根节点大的向右走,比根节点小的向左走,一直向下走直到找到位置二叉树的删除首先查...原创 2019-08-22 09:57:46 · 141 阅读 · 0 评论 -
快速排序
基本思想1.先从数列中取出一个数作为基数2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边3.再对左右区间重复第二步,直到各区间只有一个数这就是挖坑填数的基本思路下面我写一下实现步骤总结1. i = L, j = R,将基准数挖出后形成第一个坑a[i]2. j--由后向前找比它小的数,找到后挖出此数填到前一个坑a[i]中3. i++由前向...原创 2019-08-13 10:11:17 · 105 阅读 · 0 评论 -
归并排序
归并排序是一种比较高效的排序它的基本思想可以概括为先查分,再合并所谓拆分就是可以利用递归的思想,将数列分为一个一个的小数列,拆分过程有种像树的感觉,当分出来的数据只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的两个小组就可以了。这样先通过递归的分解数列,再合并数列就完成了归并排序下面给出具体实现//归并排序//稳定性 稳定//时间复杂度 O(n*logN)...原创 2019-08-13 10:30:28 · 111 阅读 · 0 评论 -
AVL树
概念为了防止二叉搜索树退化成单支树的例子,所以为二叉搜索树加入了限制条件,平衡因子,平衡因子是用父节点的右子树高度减去左子树高度,AVL树规定每个节点的平衡因子不能大于1也不能小于-1,所以每次进行插入操作时,都需要保证每个节点的左右子树高度之差不超过1,从而可以降低树的高度,从而减少平均搜索长度AVL树节点的定义template<class T>struct AV...原创 2019-08-22 10:53:05 · 178 阅读 · 0 评论 -
红黑树
概念红黑树,是二叉搜索树的一种变种红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉搜索树的平衡,从而获得较高的查找性能AVL树的严格平衡策略以牺牲插入和删除操作的代价,换来了O(logN)的查找事件复杂度红黑树虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:他可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目红...原创 2019-08-22 14:43:20 · 149 阅读 · 2 评论 -
STL----map
简介map是关联容器,他按照特定的次序(按照key值来比较)存储由键值key和值value组合而成的元素 在map中,键值key通常用于排序和唯一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_tyoe绑定在一起,为其取别名为pair 在内部,map中的元素总是按照键值key进...原创 2019-08-21 19:08:42 · 108 阅读 · 0 评论 -
STL----unordered_map
概念unordered_map是存储<key, value>键值对的关联式容器,其允许通过key快速的索引到与其对应的 value 在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值地类型可能不同 在内部,unordered_map没有对<key, value>按照任何特定的顺序排序,为了能在常数范围内找到...原创 2019-08-24 09:26:05 · 151 阅读 · 0 评论 -
STL----deque
1.deque,是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以向两端进行伸缩2.特定的库可以以不同的方式deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。3.因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效。与vector不同的是,dequ...原创 2019-08-13 15:33:46 · 99 阅读 · 0 评论 -
CloudBackUp
项目介绍该项目可以完成对一个指定目录下的文件进行监控,并将数据上传到云服务器上进行备份和下载功能。1. 客户端对指定目录进行监控,对每个文件生成etag信息,鉴别是否需要备份 2. 客户端将需要备份的文件基于http协议的PUT请求上传到服务器端 3. 服务端对于PUT上传的文件进行备份到指定目录下 4.服务端对于热度较低的文件进行压缩存储,并在文件被请求时进行解压缩处理5...原创 2019-08-08 18:24:40 · 405 阅读 · 0 评论 -
STL----stack
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器实现的,容器适配器既是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器...原创 2019-08-13 16:11:29 · 78 阅读 · 0 评论 -
LeetCode-二叉树的中序遍历
给定一个二叉树,返回它的前序遍历。下面我将给出两种写法,一种是递归,一种是迭代递归写法class Solution {public: vector<int> inorderTraversal(TreeNode* root) { vector<int> result; if(root) { ...原创 2019-08-14 08:04:46 · 92 阅读 · 0 评论 -
LeetCode-后序遍历二叉树
给定一个二叉树,返回它的后序遍历。还是同样的配方,我将给出它的递归写法和非递归写法class Solution {public: vector<int> postorderTraversal(TreeNode* root) { vector<int> result; if(root) { ...原创 2019-08-14 08:04:57 · 90 阅读 · 0 评论 -
LeetCode-二叉树的公共节点
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* roo...原创 2019-08-14 08:05:06 · 345 阅读 · 0 评论 -
Huffman树实现文件的压缩与解压缩
Huffman树的概念Huffman树是由n个带权叶子节点构成的所有二叉树中带权路径长度最短的二叉树。节点的带权路径长度树根到某一节点的路径长度与该节点的权的乘积。树的带权路径长度树的带权路径长度为树中从根节点到所有叶子节点的各个带权路径长度之和。Huffman树的构造步骤:初始化:将给定的节点都看作根节点,构成森林。找最小树:在森林中选出两棵根节点的权值最小的二叉树...原创 2019-08-09 21:19:11 · 290 阅读 · 0 评论 -
顺序表和链表的总结
尾插和尾删 顺序表:O(1) 不带头节点的单链表:遍历链表,删除O(N)如果将最后一个节点保存:O(1)任意位置的插入与删除顺序表O(N),因为涉及到数据的迁移链表O(1)顺序表支持随机访问,访问任意位置节点O(1)链表需要遍历O(N)底层的空间不同顺序表底层是一段连续的空间链表底层是不连续的...原创 2019-08-07 19:01:35 · 259 阅读 · 0 评论 -
STL----queue和priority_queue
queue的介绍1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:emp...原创 2019-08-14 20:30:20 · 201 阅读 · 0 评论 -
LeetCode-字符串相加
给定两个字符串形式的非负整数num1 和num2,计算它们的和。注意:num1 和num2的长度都小于 5100.num1 和num2 都只包含数字0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库,也不能直接将输入的字符串转换为整数形式。这是一种思路,暴力解法,但是好像会超时class Solution {pu...原创 2019-08-10 15:46:42 · 121 阅读 · 0 评论 -
快速排序及优化
1、快速排序的基本思想:快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。2、快速排序的三个步骤:(1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot)(2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此...原创 2019-09-23 21:53:55 · 136 阅读 · 0 评论