数据结构
e我所欲也
在很窄的胡同里长跑
展开
-
哈希应用 位图与布隆过滤器 及海量数据处理问题
文章目录位图布隆过滤器海量数据面试题思路分析位图先介绍一个题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。解决方案:遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN把数据放入map或者unordered_map中,树形结构查找位图解决面对这个问题我们首先想到的就是前三种。但是前三种做法的前提就是需要把数据移到内存上才可以运行,但是40亿个整型,差不多16个G(十亿字节差不多为一个G,一个整型占四个字节),而原创 2020-07-14 15:36:33 · 412 阅读 · 0 评论 -
哈希表 底层原理及unordered_map/unprdered_set的简单实现
文章目录前言unordered_map/_set的介绍底层结构哈希概念哈希冲突哈希函数哈希冲突解决闭散列开散列开散列增容与插入开散列与闭散列比较模拟实现unordered_set模拟实现unordered_map前言在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(log2N),即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到.因此在C++11中,STL又提供了4个unordered系列的原创 2020-07-13 20:19:37 · 3469 阅读 · 0 评论 -
红黑树 插入元素时的旋转着色分析及Map/Set的简单实现
文章目录序列式容器与关联式容器Map与Set的简单介绍set的简单介绍map的简单介绍红黑树红黑树的概念红黑树节点的定义封装搜索树的迭代器红黑树插入节点的控制红黑树的迭代器红黑树的检测set的简单模拟(插入操作和迭代器遍历)map的简单模拟(插入操作和迭代器遍历)序列式容器与关联式容器我们之前已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。而关联式容器也是用来存储数据的,与序列式容器不同的是,其里原创 2020-07-11 18:22:29 · 512 阅读 · 0 评论 -
平衡搜索树AVL 插入操作及旋转分析
文章目录AVL树的概念AVL树节点的定义AVL树的插入如何根据平衡因子维护平衡AVL树的旋转右单旋左单旋双旋:先左单旋再右单旋双旋之先右单旋再左单旋AVL树的验证AVL树的性能AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下(O(N))。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左原创 2020-06-30 14:06:11 · 484 阅读 · 0 评论 -
二叉搜索树 增删查操作
文章目录二叉搜索树二叉搜索树的实现增(插入)操作查找操作删除操作改?二叉搜索树的应用前言:在现在数据为王的时代,数据的存储量一般都是很大的,为了在大量信息中找到某些值,就需要用到查找技术,为了提高查找效率,需要对数据进行排序。排序和查找的数据处理量几乎是整个数据处理量的80%,故排序和查找的有效性直接影响到基本算法的有效性。因而查找和排序是十分重要的处理技术。往期基于线性表的排序方法--------》八大排序C语言实现版本而基于线性表的查找方法一般分为: 顺序查找和二分查找。接着便是学习基于树结原创 2020-06-13 20:07:38 · 592 阅读 · 0 评论 -
循环队列
循环队列概念:循环队列是队列的一种顺序表示和实现方法。与顺序栈类似,在队列的顺序存储结构中,用一组地址连续的存储单元依次存放从队头到队尾的元素,如一维数组Queue[ MAXSIZE]。此外,由于队列中队头和队尾的位置都是动态变化的,因此需要附设两个指针front和rear,分别指示队头元素和队尾元素在数组中的位置。顺序队列的弊端:显然,在非空顺序队列中,队头指针头元素,而队尾指针始终指向...原创 2020-02-19 00:29:28 · 669 阅读 · 0 评论 -
经典排序 插入、希尔、选择、堆排、冒泡、快排、归并
排序的引入当进行数据处理时,经常需要进行查找操作,而为了查的快、找到准,通常要求待处理的数据按关键字大小有序排列,以便采用效率较高的查找方法。排序的基本概念1.排序排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列,通俗的说就是将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。2.内部排序和外部排序根据排序时数据所占用存储器的不...原创 2020-02-16 15:47:48 · 1407 阅读 · 0 评论 -
快速排序 三种版本
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。将区间按照基准值划分为左右两半部分的常见方式有:1. 基础版本2. 三数取中法3. 挖坑法4. 前...原创 2020-02-16 15:43:21 · 1308 阅读 · 0 评论 -
数据结构与算法
1.数据结构的内容1.1先介绍数据结构中的相关术语1.1.1数据数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。换句话说,数据就是对客观事物采用计算机能够识别、存储和处理的形式所进行的描述。总之,数据的概念不再是狭义的,数据已由纯粹的数值概念发展成了图像、字符、声音等各种符号。例如,拿C语言的编译程序来说,他加工的数据就是字符流的源程序.c文件,输出的结果是目标程序....原创 2020-02-13 15:16:28 · 2071 阅读 · 1 评论 -
堆 适用的TOP K问题
堆这种数据结构的使用场景 TOP k问题:从一堆数据中选出最大或最小的K个数往期堆详解文章1.若是找最大的K个数具体思路:1.需要维护一个k个数据的小堆2.从堆外第一个数据开始与堆顶数据比较,大于堆顶数据时,删除这个小的堆顶,插入这个大一点的数就进入这个堆结构里了,然后维护这个堆3.接着再下一个数据开始重复第二步的比较,直到这堆数据全部都比较完。void PrintTopKMax(i...原创 2020-02-11 00:13:56 · 1148 阅读 · 0 评论 -
C语言 堆详解
1.堆的引入之前我们在 二叉树详解文章里谈过二叉树的顺序结构存储方式,普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。如下图可视:所以我们通常把堆(这特殊的一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统中虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。2.堆的概念及结构概念...原创 2020-02-10 23:10:13 · 4040 阅读 · 1 评论 -
C语言 二叉树详解
1.二叉树概念及结构概念:一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。特点:1.二叉树是一种非线性的数据结构,每棵子树的根结点有且只有一个前驱节点(父亲节点)2. 每个结点最多有两棵子树,即二叉树不存在度(度:一个节点含有的子树的个数称为该节点的度)大于2的结点。3. 二叉树的子树有左右之分,其子树的次序不能颠倒。4. ...原创 2020-02-07 00:53:19 · 4770 阅读 · 0 评论 -
C语言 顺序表和链表的区别与总结
顺序表和链表的区别和联系顺序表特点:空间连续、支持随机访问缺点1. 中间/头部的插入删除,时间复杂度为O(N)2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。而链表的结构就正好解决了这些问题链表...原创 2019-12-13 15:12:47 · 1717 阅读 · 0 评论 -
C语言 带头双向循环链表的增删查改功能实现
这里要注意有个头结点,且有前后指针才可以实现循环,写功能时思路必须要清晰。头文件 功能定义// 带头+双向+循环链表增删查改实现#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>typedef int LTDataType;typedef struct L...原创 2019-12-13 15:02:23 · 753 阅读 · 0 评论 -
C语言 单链表的增删查改功能实现
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。无头单向非循环链表(单链表):结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。头文件 功能定义#pragma once#include <stdio.h>#include <stdlib.h>#inc...原创 2019-12-13 14:54:03 · 840 阅读 · 0 评论 -
C语言 顺序表的增删查改基本功能的实现
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。// 顺序表的静态存储#define N 100typedef int SLDataType;typedef struct SeqList{ SLDataType array[...原创 2019-12-13 14:45:15 · 896 阅读 · 0 评论 -
时间复杂度_空间复杂度理解
时间复杂度_空间复杂度理解1.算法效率2.时间复杂度3.空间复杂度1.算法效率算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机...原创 2019-11-22 13:41:45 · 1423 阅读 · 0 评论 -
C语言 链栈的基本功能和详细代码(包含注释)
1.栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶我们可以把栈想象成手枪子弹弹夹,一颗颗按进去后,先打出来的绝对是最后放进去的那...原创 2020-01-26 22:51:22 · 867 阅读 · 0 评论 -
C语言 队列 的基本功能和详细代码(含详细注释)
队列的概念及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的规则FIFO(First In First Out)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头其实队列换一种说法就是我们文明生活中的 排队问题,不管干什么一般总是遵守先来后到的,就是先来的(对头)先获取到资源,后来的不准插队,只能在最后面(队尾)排队等待。...原创 2020-01-26 22:05:14 · 17757 阅读 · 6 评论