数据结构
文章平均质量分 82
阿敢
这个作者很懒,什么都没留下…
展开
-
二叉树的遍历及基本操作
二叉树,顾名思义,是有每个结点有两个分支的树,我们将结点称为根节点,将它的两个分支称为它的左子树、右子树,所以我们用以下结构来定义二叉树的结构。typedef char TreeNodeType;typedef struct TreeNode//树的结点{ TreeNodeType data;//数据 struct TreeNode* lchild;//左子...原创 2018-05-07 18:00:57 · 2066 阅读 · 0 评论 -
堆的创建、插入、删除等操作实现
堆的相关操作实现-基于C语言首先,堆是一个完全二叉树,它分为大堆和小堆。大堆:根节点比左右子树的值都大,整个堆的堆顶元素一定是最大值,比如:小堆:根节点比左右子树的值都小,整个堆的堆顶元素一定是最小值,比如:1. 堆的结构定义 因为堆分为大堆和小堆,所以我们在堆的结构里放一个函数指针,用来控制当前的堆是大堆还是小堆#define MAXSIZE 1024typedef char Heap...原创 2018-05-14 18:01:59 · 901 阅读 · 0 评论 -
希尔排序、归并排序、快速排序、计数排序、基数排序、睡眠排序、猴子排序
本文将介绍七大排序算法的三种,其中另外四种见博客冒泡排序、选择排序、插入排序、堆排序,其中本文用到的两个数的交换函数也在该博客中有介绍。1.希尔排序(1)实现思想:...原创 2018-06-03 14:17:59 · 618 阅读 · 0 评论 -
海量数据处理
1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分) 2. 给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数). 3. 有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集(hash文件切分 + 布隆过滤器). 4. 给上千个文件, 每个文件大小为1K -...原创 2018-06-08 11:29:22 · 216 阅读 · 0 评论 -
哈希扩展——布隆过滤器相关操作实现
哈希扩展——布隆过滤器 本文用到的位图操作,见博客:哈希扩展—位图的相关操作实现 首先,布隆过滤器是用于判断一个字符串元素是否在集合中存在。 我们想要判断一个元素是否在集合当中,一般的做法是先将元素保存起来,然后再比较确定集合中是否存在。我们之前介绍过的链表、二叉树等都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大,我们遍历比较确定的速度...原创 2018-05-28 11:20:44 · 510 阅读 · 0 评论 -
冒泡排序、选择排序、插入排序、堆排序
本文主要讲解几种数据结构当中常用的排序算法,本文的例子与代码都以实现升序排序为基础。首先,给出实现排序的基础交换两个值的函数void Swap(int* a, int* b)//交换函数{ int ret = *a; *a = *b; *b = ret; return;}一. 冒泡排序1. 实现思想: 遍历要排序的数列,每次遍...原创 2018-05-28 17:23:15 · 1119 阅读 · 0 评论 -
哈希桶/开散列法实现哈希表
哈希桶/开散列法实现哈希表 关于开散列的实现思想见该博客——点击打开链接,这里不再介绍,直接上代码。1. 哈希表结构实现原创 2018-05-22 23:22:47 · 373 阅读 · 0 评论 -
线性探测/闭散列法实现哈希表
线性探测解决哈希冲突的哈希表 哈希表是一种不用遍历,可以随机访问元素,实现时间复杂度为O(1)的一种数据结构,大大节省了时间。一. 哈希表定义 我们一般定义一个数组用来表示一个哈希表的存储元素的空间,并且通过哈希函数来实现确定某个元素的存入位置、查找某个元素、删除某个元素。哈希函数 我们定义哈希函数,一般采用除整取余法:hash(key) = key % ...原创 2018-05-22 18:35:15 · 995 阅读 · 0 评论 -
二叉搜索树的插入、查找、删除的非递归实现
二叉搜索树的非递归实现之前写过递归版本的,这里的实现思想是相同的,具体见二叉搜索树相关操作的递归实现,这里只写几个非递归实现的函数1. 给定一个值,将该元素插入二叉搜索树SearchNode* CreateSearchNode(SearchNodeType value)//创建一个结点{ SearchNode* new_node = (SearchNode*)malloc(sizeof(...原创 2018-05-18 17:52:13 · 740 阅读 · 1 评论 -
二叉搜索树的插入、删除、查找的递归实现
二叉搜索树的递归实现首先,二叉搜索树是也是一颗二叉树。它的特点是左结点(左子树的根结点)的值比根结点小,右结点的值比根结点的值大。比如说,下图所示的二叉搜索树:所以我们定义二叉搜索树的结构如下:#pragma once#include <stdio.h>#include <stdlib.h> ...原创 2018-05-18 17:44:02 · 926 阅读 · 0 评论 -
!-- 带头结点带环的双向链表的相关操作实现 --!
DLinklist.hDLinklist.c原创 2018-04-03 20:48:25 · 239 阅读 · 0 评论 -
!-- 顺序栈与链式栈的C语言实现 --!
栈基本操作:入栈、出栈、取栈顶元素基本特性:先进后出注意:栈本身不能遍历,不能打印,我们在代码中实现的打印只是为了检查代码的正确性具体操作的详细解释在代码中会有注释。1.顺序栈: 在结构体内定义一个变量以使用malloc申请内存,从而实现将顺序表的固定长度修改为可动态扩容SeqStack.h#pragma once#include <stdio.h>#include <...原创 2018-04-14 10:49:48 · 327 阅读 · 0 评论 -
!-- 顺序队列及链式队列的C语言实现 --!
队列基本操作:入队列、出队列、取队首元素;基本特性:先进先出; 1.顺序队列: 实现顺序队列时,我们利用数组实现,定义了head,tail用来记录当前首元素和最后元素的下标。但是在删除时,因为队列要实现“先进先出”,所以进行头删。所以本来数组的下标为[0,MAXSIZE),原本的head应该为0,但头删之后就不为0。在tail等于或大于MASIZE值时,若head不为0,则可以从0再继续入...原创 2018-04-14 10:58:24 · 548 阅读 · 0 评论 -
单链表(不带头结点不带环)的相关操作基于C语言实现
不带头结点不带环的单链表 链表按照:单向链表、双向链表;带环链表、不带环链表;带头结点、不带头结点;共有八种,最常见的即不带头结点不带环的单链表的相关操作实现。1. 不带头结点:用NULL表示空链表;2. 用第一个结点表示整个链表。因为知道第一个结点,从而通过其next域可以找到单链表的其他结点;3. 最后一个结点的next指向NULL;4. 单链表除首元素结点外的每个结点都有直接前驱,除最后一个...原创 2018-05-09 10:31:49 · 588 阅读 · 0 评论 -
!-- 基于C语言的迷宫求解问题 --!
迷宫求解问题 我们要先初始化一个迷宫地图,这里分为两种,一类为简单迷宫(不带环),一类为复杂迷宫(带环)。具体示例如下,这里采用6*6的数组表示迷宫地图,每个位置上对应元素的值非0即1,1表示路,0表示墙; 这里迷宫求解问题,我们可以采用两种方式求解,一种是利用函数本身递归的调用,一种则是利用循环一直查找。且这里的迷宫求解问题也分为两类,一类是简单的查找迷宫的一条路径,一类则是找到迷宫...原创 2018-04-21 20:37:21 · 555 阅读 · 0 评论 -
哈希扩展——位图
在之前的介绍过的哈希表中,如果要在表中存放一个整数,此时就要申请一个整型的内存来存放它,一个整型数据在32位或64位平台下都占4个字节。如果现在需要存储的数据非常多,比如说40亿个不重复的数据,就需要160亿个字节来存储,1GB的内存表示10亿个字节,此时就需要16GB的内存来存放这些数据,而我们普通的电脑内存一般都是4G的内存,这显然是不够大的。我们知道,内存中的最小单位是比特位...原创 2018-05-27 11:05:14 · 444 阅读 · 0 评论