
数据结构
adorable_
这个作者很懒,什么都没留下…
展开
-
静态数组顺序表
实现基于静态数组的顺序表的以下基本操作: 1. 初始化 2. 尾插 3. 尾删 4. 头插 5. 头删 6. 读任意位置元素 7. 修改任意位置元素 8. 查找指定元素值的下标 9. 在任意位置插入元素 实现在顺序表中增删查改需注意以下几点: 1.初始化时不用将所有元素赋值为0,那样会降低代码效率 2....原创 2017-12-05 15:29:27 · 676 阅读 · 1 评论 -
海量数据处理
1. 给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分) 解:显然我们是不可能将这100G内存直接加载到内存中去处理的,所以我们可以对大文件进行划分,将相同的IP地址会被划分在一块。原创 2018-03-10 23:46:41 · 188 阅读 · 0 评论 -
数据结构之队列基本操作
1.队列概念只允许在一端进行插入数据,而在另一端进行删除数据的特殊线性表2.进行插入操作的一端称为队尾(入队列)3.进行删除操作的一端成为队首(出队列)4.队列具有先进先出(FIFO)的特性 顺序队列队首不动,出队列时队首后的所有元素向前移动缺陷:操作时如果出队列次数比较多,则要搬移大量元素队首不动,出队列时队首向后移动一个位置缺陷:容易造成队列假溢出原创 2018-05-03 18:21:43 · 596 阅读 · 0 评论 -
最小栈
有关栈方面的知识请参考:>数据结构之栈的基本操作<方法一 定义两个栈,一个保存栈中元素,一个保存当前栈的最小元素,比较要插入的元素和保存最小元素栈中的栈顶元素,若要插入的元素比保存最小元素的栈要小,就将要插入元素同时插入到两个栈中,即保存最小元素的栈的栈顶元素是最小的。原创 2018-05-04 18:15:14 · 302 阅读 · 1 评论 -
判定字符串是否按照出栈顺序
所用栈相关知识请参照:>数据结构之栈的基本操作<基本原理:实现代码:#include <stdio.h>#include "seqstack.h"int IsStackOrder(char input[], size_t input_size, char output[], size_t output_size){ SeqStack stack...原创 2018-05-14 23:27:42 · 358 阅读 · 0 评论 -
两个栈实现一个队列
引用栈相关代码请参考:>数据结构之栈的基本操作<入队列时相当于对entry入栈出队列时相当于对exitus出栈取队首元素相当于对exitus取栈顶元素原创 2018-05-08 16:51:33 · 224 阅读 · 0 评论 -
两个队列实现一个栈
基本实现原理入栈时相当于直接对queue1入队列出栈时先将queue1的前n-1个数据搬移到queue2中,然后对queue1出队列取栈顶元素时也是先将queue1的前n-1个数据搬移到queue2中,然后对queue1取队首元素原创 2018-05-08 17:44:57 · 248 阅读 · 0 评论 -
数据结构知识体系框图
数据结构知识体系框图: 静态顺序表:https://blog.youkuaiyun.com/adorable_/article/details/78720919静态顺序表之二:https://blog.youkuaiyun.com/adorable_/article/details/78817630C++实现顺序表:https://blog.youkuaiyun.com/adorable_/article/detail...原创 2018-06-08 21:38:52 · 1294 阅读 · 0 评论 -
线索化二叉树
线索化概念当某节点的左指针为空时,令该指针指向按照某种方式遍历二叉树时得到该节点的前驱结点;当某节点的右指针为空时,令该指针指向按照某种方式遍历二叉树时得到该节点的后继结点。但是无法区分:左指针指向的结点是左孩子结点还是前驱结点右指针指向的结点是右孩子结点还是后继结点因此需要增加两个线索标志位来区分这两种情况: leftThread(左线索):0: leftC...原创 2018-06-29 17:16:31 · 492 阅读 · 0 评论 -
简单排序
简单排序之冒泡排序、选择排序、堆排序、插入排序。冒泡排序算法的原理如下:比较相邻的元素,如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。选择排序算法的原理如下: 对比数组...原创 2018-06-30 17:02:05 · 150 阅读 · 0 评论 -
希尔排序—Shell
基本定义:希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。 基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。代码实现:void ShellSort(int array[], int64_t size){ if(...原创 2018-07-02 23:52:31 · 180 阅读 · 0 评论 -
快速排序—Quick
所用栈相关知识请参考:&amp;gt;数据结构之栈的基本操作&amp;lt; 快速排序基本思想快速排序是一种划分交换的方法,它采用分治法进行排序。其基本思想是:先从数列中取出一个数作为基准数分区过程,将比基准值大的数全放到它的右边,小于或等于它的数全放到它的左边,基准值则在中间再对左右区间重复第二步,直到各区间只有一个元素或没有元素//////////////////////////...原创 2018-07-09 23:47:32 · 190 阅读 · 0 评论 -
哈希表(开散列)
开散列开散列法又叫链地址法(开链法)。 开散列法:首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各桶中的元素通过一个单链表链接起来,个链表的头结点存储在哈希表中。原创 2018-03-12 23:32:14 · 1110 阅读 · 1 评论 -
单链表经典面试题
单链表经典面试题1.从尾到头打印单链表2.在无头单链表的一个结点前插入一个结点(不能遍历链表) 3.单链表实现约瑟夫环(JosephCircle) 4.逆置单链表 5.单链表排序(冒泡排序)6.合并两个有序链表,合并后任然有序 7.查找单链表的中间节点,要求只能遍历一次链表 8.查找单链表的倒数第K个结点,要求只能遍历一次链表 9.删除链表的倒数第K个结点原创 2018-03-19 11:38:14 · 512 阅读 · 0 评论 -
共享栈
使用一个数组实现两个栈前半部分为一个栈,后半部分为一个栈原创 2018-04-13 22:06:13 · 219 阅读 · 0 评论 -
静态数组顺序表之二
在上次的博客中完成了静态顺序表的初始化 、尾插 、尾删、 头插 、头删 、读任意位置元素 、修改任意位置元素 、查找指定元素值的下标 以及在任意位置插入元素。 这篇博客将介绍以下几种操作: 1. 删除指定值第一个值 2. 删除指定值所有值 3.获取顺序表中元素个数 4.判断顺序表是否是空表 5.冒泡排序 6.利用回调函数的冒泡排序 7.查找...原创 2017-12-15 23:33:12 · 235 阅读 · 0 评论 -
堆的简单操作
基础: 1. 堆是一个完全二叉树 2. 堆有两种, 一种叫小堆(小根堆, 最小堆), 一种叫大堆(大根堆, 最大堆). 3. 以小堆为例, 这个树的根节点是这个树中的最小的元素 对于任意一个子树来说, 子树的根节点, 小于左右孩子节点的值.原创 2018-03-01 15:56:48 · 450 阅读 · 0 评论 -
哈希表(闭散列)
1.哈希表概念 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。原创 2018-03-11 20:13:27 · 1525 阅读 · 1 评论 -
二叉搜索树
二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 •若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 •若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 •它的左右子树也分别为二叉搜索树原创 2018-03-13 22:50:40 · 247 阅读 · 0 评论 -
单链表基础操作
单链表基础操作1.初始化单链表2.尾插3.尾删4.头插5.头删6.查找7.在pos之前插入元素8.在pos之后插入元素9.删除指定位置的元素10.删除指定值的元素11.删除指定值的所有元素12.判断链表是否为空13.求链表元素个数原创 2018-03-17 12:12:54 · 575 阅读 · 0 评论 -
双向链表基本操作
双向链表基本操作1.尾插2.尾删 3.头插 4.头删 5.查找元素在链表中的位置 6.往指定位置之前插入一个元素 7.往指定位置之后插入一个元素 8.删除指定位置的元素 9.删除指定值的元素 10.删除指定值的所有元素原创 2018-03-21 08:50:02 · 334 阅读 · 0 评论 -
位图
利用位图可以判断某个数字是否在一个大范围数据中具体代码如下:①bit_map.h#pragma once #include <stddef.h>#include <stdint.h>typedef struct BitMap { uint64_t* data; size_t capacity; // max bit } Bit...原创 2018-03-23 23:54:46 · 265 阅读 · 0 评论 -
迷宫求解
1) 求简单迷宫是否存在路径 2) 求多出口迷宫的最短路径 3) 求带环的多出口迷宫的最短路径 seqstack.h:#pragma once#include <stddef.h>#define FOR_MAZE#ifdef FOR_MAZEtypedef struct Point{ int row; ...原创 2018-04-08 09:13:48 · 206 阅读 · 0 评论 -
二叉树及其基本操作
二叉树及其基本操作概念二叉树特点:•每个结点最多有两个子树,即二叉树不存在度大于2的结点•二叉树的子树有左右之分,其子树的次序不能颠倒原创 2018-03-29 23:25:57 · 502 阅读 · 0 评论 -
数据结构之栈的基本操作
数据结构之栈的基本操作栈的定义: 在计算机领域,栈是一种按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。栈与堆的区别:1.空间分配栈(操作系统):由操作系统自动分配释放 ,存放函数参数,局部变量的值等。堆(操作系统):一般由程序员自己分配释放, 若程序员不释放,程序结束时可能由系统回收。原创 2018-03-24 20:14:48 · 886 阅读 · 0 评论 -
布隆过滤器
布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。基本思想: 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。原创 2018-03-24 15:13:40 · 237 阅读 · 0 评论 -
归并排序—Merge
归并排序是一种基于分治法的一种排序方法。它将要排序的序列分成两个长度相等的子序列,为每一个子序列进行排序,然后再将子序列合并成一个有序的序列。//////////////////////////////////////////////////////////////归并排序//时间复杂度:O(N * logN)//空间复杂度:O(N)//稳定性:稳定排序/////////////...原创 2018-07-06 23:52:36 · 298 阅读 · 0 评论