![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
liru_1996
这个作者很懒,什么都没留下…
展开
-
数据结构--二叉树的基本操作
首先通过一张图来认识树: 树:由N(N>=0)个结点构成的集合。对N>1的树,有: 1.有一个特殊的结点,称为根结点,根结点没有前驱结点 2.除根结点外,其余结点被分为M(M>0)个互不相交的集合T1、T2…..Tm,其中每一个集合Ti(1<=i<=m)有是一颗结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。,因此,树是递归定义的。代码实现多采用递归的思想。二叉原创 2018-05-03 22:34:15 · 135 阅读 · 0 评论 -
海量数据处理问题
1.给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分) 思路:显然我们是不可能将这100G内存直接加载到内存中取处理的。所以我们可以对大文件进行划分,前提当然是相同IP地址会被划分在一块。假定我们将这个文件分为1024份,那么一个文件的大小大概为100M,然后利用哈希算法对IP地址进行映射,得到的值%1024,将同一个IP地址映...原创 2018-06-07 10:48:17 · 163 阅读 · 0 评论 -
数据结构 ---- 布隆过滤器
基本概念 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表、树等等数据结构都是这种思路,但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢,不过还有一种叫哈希表的数据结构,它可以通过Hash函数将一个元素映射成一个位阵列中的一个点,这样一来,我们只要看看这个点是不是1就知道集合中有没有它了,这就是布隆过滤器的思想。Hash面临...原创 2018-06-06 17:09:26 · 233 阅读 · 0 评论 -
数据结构 ---- 位图的基本操作
首先位图结构体中有两个参数,一个指针用来开辟一段空间存储Bit位,还有一个参数是capacity即位图最多能容纳多少位; 实现代码如下: bitmap.h#pragma once #include <...原创 2018-06-06 15:18:01 · 241 阅读 · 0 评论 -
数据结构 ----- 哈希表(闭散列--线性探测)
关于哈希表首先来看两个概念:1.哈希函数哈希函数是一个映像,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的关键值都落在表长允许范围之内即可;2.哈希冲突对不同的关键字可能得到同一哈希地址,这种现象称为哈希冲突;基于上面两个问题,我们来做说明: 哈希函数的构造 哈希函数的构造方法有很多,比如,直接定址法、数字分析法、平方取中法、折叠法、除留余数法等等,我们这里采用...原创 2018-05-30 15:06:06 · 482 阅读 · 1 评论 -
数据结构 --- 排序算法(2)
1.希尔排序希尔排序又称缩小增量排序,是对直接插入排序的优化; 希尔排序三重循环:第一重,生成步长序列,这里采用希尔序列,如:N/2、N/4、N/8、…..、1;第二重循环,处理每组的数据,注意竖着处理,即先处理第一行的第一个元素,在处理第二行第一个元素……;第三重循环,进行搬运,找到合适的位置,将值插入加进去(结合插入排序的思想);希尔排序的时间复杂度:取决于步长序列,对于希尔序列为O...原创 2018-05-29 21:47:36 · 111 阅读 · 0 评论 -
数据结构 ---- 搜索二叉树的基本操作(2)
实现非递归版本的搜索二叉树的插入、查找和删除插入:这里的思想是定义两个指针一个指向当前结点,一个指向当前结点的父节点,当前结点就是找要插入的位置,插入整体分为两步,第一步是找到要插入的位置,第二步判断要插入的值与此时父节点的大小,来决定是插入到左子树还是右子树即可; 代码实现:void SeachTreeInsert(SearchNode** pRoot ,SearchNodeType ...原创 2018-05-24 15:54:50 · 119 阅读 · 0 评论 -
数据结构 ---- 搜索二叉树的基本操作(1)
关于搜索二叉树,我们先用递归版本完成,非递归版本请关注下一篇文章;首先,什么是搜索二叉树? 定义:搜索二叉树是根结点的左子树的值比根结点小,右子树的值比根结点值大,所有子树都满足这个规则的就是搜索二叉树; 我们要完成关于搜索二叉树的如下操作: search_tree.h #pragma once ...原创 2018-05-24 12:09:21 · 137 阅读 · 0 评论 -
数据结构 --- 排序算法(1)
这里都是按照升序排序的; 交换函数如下:void Swap(int *a ,int *b){ int tmp = *a; *a = *b; *b = tmp; return;}1.冒泡排序方法一:首先,常规冒泡算法,外循环定义count 为排序的趟数,内循环为每趟进行比较并且交换,实现代码如下:void BubbleSort(int arra...原创 2018-05-28 14:48:39 · 127 阅读 · 0 评论 -
数据结构 ---- 堆的基本操作
首先,对于堆来说:1.堆是一个完全二叉树; 2.堆有两种:大堆和小堆; 3.以小堆为例, 这个树的根节点是这个树中的最小的元素 // 对于任意一个子树来说, 子树的根节点, 小于左右孩子节点的值. 4. 以大堆为例, 这个树的根节点是这个树种的最大元素 // 对于任意一个子树来说, 子树的根节点, 大于左右孩子节点的值. 堆的初始化:堆是用数组来定义的,并且在初始化时,...原创 2018-05-21 11:24:51 · 106 阅读 · 0 评论 -
迷宫求解3--带环的多出口迷宫求最短路径
假如有以下带环的多出口迷宫地图: 这里的思路与之前迷宫求解多出口求最短路径相似,不同的是,这里需要多传一个参数pre,保存当前要落脚的点的上一次走到这个点的大小 1.判定当前点是否能落脚 2.如果能落脚,进行标记,同时将当前点插入到cur_path栈中,更新pre 3.判断是否是出口 a)如果是出口,就比较cur_path与short_path的大小,如果cur_path小就代替s原创 2018-05-06 20:50:12 · 281 阅读 · 0 评论 -
迷宫求解2--多出口求最短路径
假如有如下一个迷宫地图: 与迷宫求解1中,简单迷宫找路径思路相似,不同的是:这里需要定义两个栈cur_path和short_path,来存放当前路径长度,与最短路径长度,每找到一条路径就与最短路径进行比较,如果比最短路径短,就用当前路径cur_path代替最短路径short_path; 1.判定是否能落脚; 2.如果能落脚进行标记,同时将当前点插入到cur_path顺序栈中; 3.判断当原创 2018-05-06 19:42:58 · 674 阅读 · 0 评论 -
迷宫求解1--简单迷宫是否存在路径
假如,有如下迷宫地图: 思路: 1.判定当前点是否能落脚 2.如果能落脚进行标记 3.判断当前点是否是出口 a)如果是出口,则找到了一条路径 b)如果不是出口,则以当前点为准则,采用递归的方式顺时针方向继续探测四周 解析: 这里判定落脚规则是,如果当前点为0即是墙,不能落脚,当前点是已经标记过的点,不能落脚; 这里的标记是,将已经走过的点赋值为2;代码如下:原创 2018-05-06 19:05:40 · 256 阅读 · 0 评论 -
数据结构 ----二叉树相关操作(3)
1.二叉树求镜像什么是二叉树的镜像? 如上,右边就是左边这棵树的镜像; 由上图可以看出,求一颗树的镜像就是将二叉树的左右子树交换即可; 这里用递归和非递归两种方法进行求解: 递归实现: void TreeMirror(TreeNode* root){ if(root == NULL){ re...原创 2018-05-17 22:20:50 · 90 阅读 · 0 评论 -
数据结构--顺序表相关操作
顺序表可以看做一个数组,对数组进行操作,体会这一点,顺序表的相关操作就比较容易实现。 代码如下:seqlist.h #pragma once #include <stddef.h> #define原创 2018-05-04 17:37:57 · 114 阅读 · 0 评论 -
数据结构 ---- 二叉树的相关操作(2)
在上一篇文章中完成了二叉树的递归版本的先序、中序、后序遍历,现在来介绍非递归版本的三种遍历方法; 三种遍历均借助顺序栈来完成 先序遍历: 思路:先将根结点入栈,然后循环的进行取栈顶元素,同时出栈,并且将栈顶元素的左右子树入栈,当取栈顶元素失败说明,已经遍历完了,跳出循环; 代码实现: void TreePreOrderByLoop(TreeNode* root){ if(ro...原创 2018-05-17 15:29:30 · 109 阅读 · 0 评论 -
数据结构 ---- 二叉树的相关操作(1)
首先,什么是二叉树? 二叉树是一个根结点只有左右子树就叫二叉树;如下图就是一个普通的二叉树: 树有许多的表示方法,这里二叉树用孩子表示法。 之前关于链表我们知道,用头指针来表示单链表,这里用相同的思想:用根结点指针来表示一棵树; 这里先用递归的思想来完成二叉树的先序、中序、后序,层序这里需要借助之前的顺序队列来完成; 代码实现: bin_tree.h #pragma o...原创 2018-05-17 15:01:29 · 94 阅读 · 0 评论 -
数据结构 ----- 哈希表(链地址法--开散列)
在上一篇文章中已经提到过链地址法,现在具体看下图例子: 实现代码如下: hash.h#pragma once#include <stddef.h>#define HashMaxSize 1000typedef int KeyType;typedef int ValType;//此结构相当于是链表的一个节点typedef struct HashElem{...原创 2018-05-31 15:59:37 · 711 阅读 · 0 评论