数据结构
f2016913
一个专业小白的奋斗之路
展开
-
【STL】list迭代器的模拟实现
一:list:list 简单点说就是c++标准库(STL)的一种容器,可以实现插入和删除的操作,实质和双向链表相同,但这个双向链表时带有头结点的双向链表。二:迭代器 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的原创 2017-02-28 09:26:06 · 679 阅读 · 0 评论 -
一个数组实现两个栈
问题描述: 用一个数组实现两个栈 方法一: 将两个栈对应的元素在数组中按照奇偶排列,如:假设栈1按照奇数位排列,栈2按照偶数位排列 这种方法有一种缺陷就是当两个栈的元素相同时就无法按照奇偶进行排列; 方法二: 从中间向两边,栈1向数组的首部移动,栈2向数组的尾部移动,当有任何一个栈增加到首部或者是尾部时数组开始增容; 方法二似乎解决了两个栈元素相同的问题,如果一个栈先到达首部或原创 2017-05-04 22:07:51 · 937 阅读 · 0 评论 -
面试题--给40亿个不重复的,没有排过序,给一个无符号整数,如何判断这个数在这40亿个数中
如果常规的想法是给这40亿数,放到一个很大的数组中,快速排序,然后采用二分查找,来判断这个数是否存在; 但是计算机的内存就是4G,大小差不多刚好是2^32大约为42亿左右,一个整形4个字节,40亿数大约需要16G个字节,在现实基本不可能实现,那么该如何存储呢? 方法:位存储 一个整形32个位,16G个字节只需要500M就可以,然后设置比特位1表示这个数存在,0表示这个数不存在。#include原创 2017-04-23 22:32:23 · 3571 阅读 · 0 评论 -
快速排序及其优化
快速排序的算法: 所谓的快速排序实际上用的是分治思想,将这个数组分成两个部分,左边部分的数据都比右边部分的数据要小,再按照此方法对子区间进行划分进行快速排序; 算法思想是: 1:开始时设置两个变量left,right,给定一个关键值key=a[right]; 2:left向后移,找到第一个比key值大的数,否则继续向后走, 3:right向前移,找到第一个比key小的数,否则继续向前走;原创 2017-05-22 15:59:42 · 762 阅读 · 0 评论 -
二叉树的面试题
二叉树的定义:template<class T>struct BinaryTreeNode{ T _data; BinaryTreeNode<T> *_left; BinaryTreeNode<T> *_right; BinaryTreeNode(const T&data) :_data(data) , _left(NULL)原创 2017-05-14 22:20:50 · 422 阅读 · 0 评论 -
布隆过滤器
一:问题描叙: 在日常生活当中我们经常要判断一个元素在不在一个集合当中,在字处理软件当中,判断一个单词是否拼写正确;在网络爬虫当中,一个网址是否被访问过,最直接的方法将元素全部存到计算机中,遇到一个新元素,将它与集合中的元素进行比较就可以。我们知道集合可以用哈希表来存储,好处是快速准确,缺点是浪费空间,无论是闭散列方法还是开链法,当负载因子超过0.7会导致查找的效率变慢,因此每次都要开一个更大的空原创 2017-04-24 15:39:14 · 914 阅读 · 0 评论 -
哈希表
一:HashTable是散列表/哈希表,是根据关键字(key)而直接访问在内存存储位置的数据结构 通过关键值得函数将所需要的数据映射到表中的位置来访问数据,这个映射函数叫做散列函数,存放记录的数组叫做散列表; 构建哈希表的几种方法: 1:直接定址法–去关键字的某个线性函数为散列地址,hash(key)=key;或者是hash(key) =key*A+B; 2: 除留余数法–取关键值被某个不大原创 2017-04-27 12:30:11 · 919 阅读 · 4 评论 -
选择排序
一:选择排序的算法思想是 每一次在一组数中选最大的放到最后,然后再在剩余的数中选次大的数放到倒数第二个位置,直到这组数选完为止;(以升序为例) 二:优化: 传统的简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。 思路: 1:首先标原创 2017-05-21 21:28:11 · 432 阅读 · 0 评论 -
空间配置器
一:为什么需要空间适配器? 我们知道地址空间的结构如下: 假设系统分配16byte,8byte,16byte,4byte,我们仅仅只是使用了16个字节的空间,当我们下次载要开一个32个字节的大小的空间,虽然内存够却开不了空间,因为空间不连续,只好在内存从新分配一个更大的空间, 1:出现小内存块的问题, 2:频繁的分配小块内存,效率比较低 二:我们看下STL中关于空间配置器: 一级原创 2017-06-04 15:38:22 · 501 阅读 · 0 评论 -
归并排序及排序算法的总结
一:归并排序的思想是 采用分治法,先将一组序列换分成小区间,使分隔区间有序,然后将这些小区间两两归并,最后成为一个有序的序列 思路: 设两个有序的子序列放到同一个序列中的相临的位置,如arr[left..key],arr[key+1…right],先将他们合并到一个临时序列tmp中,最后合并完成后tmp拷贝会原数组arr[left,right]中,这样最后得到的序列就是有序序列. 如: 待原创 2017-05-27 16:53:17 · 1458 阅读 · 1 评论 -
哈夫曼树
huffman树,又称最优二叉树,是加权路径长度最短的二叉树 [贪心算法]是指在问题求解时,总是做出当前看起来最好的选择,通俗的说贪心算法不是整体最优的选择,而是局部最优解 使用贪心算法构建Huffman树 构建哈夫曼树主要包括两部分: 1:建小堆 2:将加权路径长度最短,构建最短二叉树 一:建小堆:#pragma once#include<vector>#include<ass原创 2017-06-14 17:33:52 · 574 阅读 · 0 评论 -
二叉树的递归和非递归
二叉树的几种遍历算法 1.二叉树的前序遍历 2.二叉树的中序遍历 3.二叉树的后序遍历 4 .二叉树的后序遍历一. 二叉树的前序遍历 前序遍历算法是判断节点是否为空,如果不为空,先访问根节点,再访问左子树,最后访问右子树; 前序的递归: 根->左子树(为空)->右子树。对于每一个子树又可以用同样的访问顺序来遍历。void PrevOrder() {原创 2017-03-19 12:14:15 · 668 阅读 · 0 评论 -
面试题之--大数据
1:给一个超过100G大小的long file,long中存着IP地址,设计算法找到次数最多的IP地址: 现实问题: (1)我们知道计算机的内存在4G,可以存放大约16G的字节的内容,因此要想把100G的大文件存到计算机中,基本不可能 (2)我们可以使用前面讲的位图,一个整形32位,最多可以存42亿多的数据,100G的大文件,最多需要3.2G就可以放进去,但是却难以统计最多的IP地址 这时候原创 2017-05-12 20:42:50 · 550 阅读 · 0 评论 -
AVL树
一:AVL树 AVL树又称平衡搜索二叉树,它能保持二叉树的平衡,降低二叉树的高度,减少树的搜索长度。 AVL树的性质: 1:左子树和右子树的高度差的绝对值不大于1; 2:树中的每个左子树和右子树都是AVL树; 3:树中的每个节点都有平衡因子(_bf),每个平衡因子都等于右子树的高度减去左子树的高度; 例: 二:插入 插入一个节点,可能会对这颗AVL树造成影响,打破平衡,如果要继续满足原创 2017-04-06 00:25:41 · 674 阅读 · 0 评论 -
【STL】之Vector的模拟实现
一:迭代器失效?前面我们了解迭代器其实就是智能指针,可以通过运算符的操作来实现接口函数,但有时有会存在安全隐患。这就是我们常说的迭代器失效。所谓的迭代器失效其实是找某个位置的元素,删除,然后再通过operator++,operator--访问下一个元素,会出现野指针造成崩溃的问题;如下:#include#includeusing namespace std;void Test原创 2017-03-07 23:26:53 · 817 阅读 · 0 评论 -
二叉树
二叉树一:树 树是N个有限个数的集合,形状像一颗到过来的树。如下: 树是一种特殊的数据结构有点像链表,每个节点都包括指针域和一个数据域。 根节点:树的第一个节点; 节点的度:树拥有子节点的个数; 叶节点:没有子节点的节点; 树的高度:树中距离根节点最远的路径长度。 父子节点:一个节点father指向另外一个节点child,father这个节点就是父节点,child这个节点就是子原创 2017-03-19 10:49:50 · 434 阅读 · 0 评论 -
面试常见题之TopK问题
一:堆的一个应用就是优先级队列:优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。如:template>class PriorityQueu原创 2017-03-30 08:38:59 · 1602 阅读 · 0 评论 -
堆排序
堆排序堆的一个重要应用,堆排序,主要是将将一组数据排成有序的序列,如何实现?先将这组数据放到二叉树中建大堆,然后再把第一个数据与最后一个交换,最大的数据就在最后,然户把其余n-1个数据继续调成成大堆,再把第一个和次大的交换,每次排序后,无序的数据范围缩小1,直到最后这个无序的序列只剩最后一个数据,就会完成排序分两步:一:建大堆(升序)//向下调整建大堆void _Ajus原创 2017-03-30 16:23:34 · 450 阅读 · 0 评论 -
二叉搜索树实现简单字典
日常生活中我们经常使用字典来查找单词的中文意思,也会根据中文来查找所对应的汉语。前面我们知道二叉树实现可以迅速查找一个数据,而且可以插入和删除。 这里我们可以用搜索二叉树实现简单的字典,查找英文单词对应的汉语意思。 问题的描叙: 1:如何判断英文单词是否拼写正确; 2:如何统计单词出现的次数 这里我们可以用二叉树的K V算法; v(value)是key的附属信息,这里我们可以理解为汉语原创 2017-04-04 09:52:48 · 3141 阅读 · 0 评论 -
二叉搜索树
一:二叉搜索树的性质:1:每个节点都有一个作为搜索的关键码(key),所有节点的关键码互不相同;2:左子树所有节点的关键码(key)都小于右子树的关键码(key)3 : 左子树所有节点的关键码(key)都小于右子树的关键码(key)4:左右字子树都是二叉搜索树二:二叉树的插入:分三步:1:空树的情况,直接把节点插入到根节点2:不为空,比较插入值的关键码与原创 2017-04-01 09:47:29 · 637 阅读 · 0 评论 -
红黑树
一:红黑树 红黑树是一颗二叉搜索树,它的每一个节点增加了一个存储位用来表示颜色,可以是Red也可以是Black,通过对任意一条根到叶子节点的颜色来约束,红黑树保证最长路径是最短路径的两倍,因此近似平衡; 红黑树的性质: 1:每个节点不是红色就是黑色 2:根节点是黑色 3:如果一个节点时红,则它两个子节点是黑色的(没有连续的红色) 4:对每个节点,从该节点到其后代的所有叶子节点的简单路径,原创 2017-04-10 20:33:47 · 397 阅读 · 0 评论 -
堆
一:堆堆数据结构是一种数组结构可以看做是一个完全二叉树;堆的数据存储分为二种大堆:每个父亲节点都大于孩子节点小堆:每个父亲节点都小于汉子节点接下来就是建堆,建堆实际就是讲一个二叉树调整成我们所需要的结果。方法:从第一个非叶节点开始,找到它的最大值(大堆调整)或者是最小值(小堆调整),然后再与父节点比较;我们通过仿函数,来选择我们需要的是大堆还是小堆。原创 2017-03-26 07:46:34 · 352 阅读 · 0 评论 -
map和set
map和set是两个主要的关联容器,但是底层都是红黑树实现 map STL中关于map的理解: map特性是,所有元素都会根据元素的键值自动排序,map的所有元素都是pair(结构体),同时有键值key和实值value。pair的第一个元素被视为键值,第二个元素视为实值,map不允许两个元素拥有相同的键值; pair的定义: template原创 2017-04-18 09:04:32 · 674 阅读 · 0 评论 -
队列和栈的面试题
一:实现一个栈,要求实现Push,Pop,Min的操作时间复杂度是O(1); 我们知道栈的特点是后进先出 Push和Pop的操作都是O(1);要返回最小值Min的时间复杂度是O(1),需要一个辅助栈,用来保存最小值; 思想: 有两个栈s1和s2,其中s2是辅助栈(用来保存最小值的栈) 1:先把元素压入栈1,在比较压入的元素与保存最小值的(栈2)的栈顶元素的大小,始终保持,最小值在栈2.原创 2017-05-01 13:51:10 · 461 阅读 · 0 评论 -
直接插入排序和希尔排序
一:插入排序 在一组无序的数组中,假设第一个有序,每一次数组中剩余的元素与第一个比较,然后逐个插入到一个有序的序列中,直到这个数组所有的数字有序为止; 二:直接插入算法 算法思路: 1:我们先假设第一个有序的数字下标为end, 2:下一个要插入的数字(tmp)继续构成有序就直接插入,此时end向后挪一位, 3:继续插入元素,如果下一个插入的数字和第一个不成构成有序,先与前一个元素交换原创 2017-05-10 21:44:40 · 385 阅读 · 0 评论 -
计数排序和基数排序
前看我们知道插入排序和选择排序或者是快速排序这些都是比较排序,但有的时候我们不希望通过比较如何让一个序列是有序呢? 一:计数排序 计数排序的思想: 1:开一个数组用来保存每一个数字出现的次数;统计次数我们可以用直接定址的哈希来确定可以减小空间的浪费. 2:根据每一个元素出现的次数,按照下标在原数组中排列,这样这组数据就有序 开空间时我们可以根据遍历找到最大值和最小值来确定空间的范围ra原创 2017-05-26 00:28:29 · 352 阅读 · 0 评论