数据结构与算法
文章平均质量分 64
zhangbaqing
github地址:https://github.com/GHzbq
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
PriorityQueue源码分析
文章目录预备知识一、底层的数据结构二、如何构造PriorityQueue三、向PriorityQueue插入元素,会发生什么四、删除元素五、其他操作上篇文章,我们使用PriorityQueue解决了TopK问题,其中有个神奇的操作就是,当从PriorityQueue中插入或者删除一个元素时,他总能通过一定的方式调整,使得堆顶的元素是这个PriorityQueue的最值,这一节我们就来研究一下PriorityQueue底层是用什么存储的数据,又是怎么调整数据,使得其满足以上特性。预备知识如何把一个原创 2021-03-30 16:53:34 · 369 阅读 · 0 评论 -
TopK问题
TopK问题在海量数据处理中,经常会有一类问题,求最小的K个数,或者,求最大的K个数,这类问题统称为TopK问题。文章目录TopK问题一、对此类问题的一些思考二、引出“堆”这种数据结构三、Java有没有相关的实现呢?四、使用PriorityQueue解决topK问题一、对此类问题的一些思考如果数据量比较小的话,我么可以通过排序,然后截取其中我们想要的K个数,但假如数据量比较大的话,即使是考虑效率和资源的快速排序(时间复杂度O(nlgn)O(nlgn)O(nlgn),空间复杂度O(1)O(1)O(原创 2021-03-28 20:12:47 · 276 阅读 · 0 评论 -
环形链表专题
最近在刷LeetCode的题,对环形链表方面的题做个总结文章目录一、判断链表是否带环1. 题目详情2. 题目解析解法一:快慢指针解法二:哈希表/map解法三: 非常规做法二、带环链表入口1. 题目详情2. 题目解析解法一:快慢指针解法二:非常规做法一、判断链表是否带环1. 题目详情环形链表-力扣(LeetCode)2. 题目解析解法一:快慢指针我们定义两个指针,初始位置都放在头节点...原创 2019-04-12 10:42:07 · 4978 阅读 · 2 评论 -
初遇哈希表
一、哈希表哈希表: 可以在 O(1) 的时间复杂度内找到元素哈希函数: Hash(key) = key % capacity哈希冲突: 不同的关键字计算出相同的哈希地址这是哈希表无法解脱的桎梏,一旦使用哈希表,哈希冲突是无法避免的,只能通过巧妙的设计哈希函数,尽量减少哈希冲突,而无法避免二、开放地址法解决哈希冲突当发生哈希冲突时,就把值放到下一个空位来看代码:点我查看/下载...原创 2018-09-27 12:44:27 · 227 阅读 · 0 评论 -
数据结构----二叉搜索树--递归(C语言)
上篇文章 二叉搜索树: https://blog.youkuaiyun.com/eric_qiushui/article/details/80516010 删除操作的代码过于冗长,我们考虑递归版本1.BinarySearchTreeRecursion.h#pragma once#include <stdio.h>#include <stdlib.h>#in...原创 2018-06-01 22:04:39 · 451 阅读 · 1 评论 -
数据结构----二叉搜索树(C语言)
关于数据结构二叉树的概念及操作可参看博客: https://blog.youkuaiyun.com/eric_qiushui/article/details/80261271一、二叉搜索树二叉搜索树又称为二叉排序树,它或者是一颗空树,或者时具有以下性质的二叉树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右...原创 2018-05-30 21:15:02 · 936 阅读 · 0 评论 -
排序 ---- 快排(C语言)
思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都要比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快排,整个过程可以递归进行,以此达到整个数据变成有序序列。时间复杂度:最优情况O(nlgn) 最差情况O(n2)空间复杂度:O(1)稳定性: 快排是不稳定排序算法来看代码:// 快排void QuickSort(Datatype...原创 2018-06-05 18:11:28 · 8052 阅读 · 7 评论 -
堆排序(C语言)
【堆排序算法】创建堆:升序 —-> 大堆 降序 —-> 小堆执行以下步骤,直到数组为空 1.把堆顶元素array[0]和当前堆的最后一个元素交换 2.堆元素个数减1 3.由于第一步交换元素之后,可能导致不满足堆的定义,向下调整堆排序的实践复杂度:O(n * log2 n)堆排序不稳定代码: // HeapSort.h...原创 2018-05-29 11:37:47 · 285 阅读 · 0 评论 -
优先级队列
使用数据结构–堆 封装的优先级队列 可参考博客:https://blog.youkuaiyun.com/eric_qiushui/article/details/80488560直接上代码// Priority.h#pragma once#include <stdio.h>#include <stdlib.h>#include <malloc.h&...原创 2018-05-29 10:02:30 · 235 阅读 · 0 评论 -
数据结构--堆的概念及实现原理(C语言描述)
首先说明一下,这里的堆是一种数据结构,不是内存里的堆。一、堆的概念堆是一个所有元素按完全二叉树的顺序存储方式存储在一个一维数组的数组,如果满足双亲节点的值小于(或大于)左孩子节点的值且双亲节点的值小于(或大于)右孩子节点的值,我们称这个堆为小堆(大堆)。 小堆中:任一节点的值均小于等于它左、右孩子的值,位于堆顶节点的元素的值最小,从根节点到每个节点的路径上元素组成的序列都是递增的。 堆...原创 2018-05-28 23:27:44 · 721 阅读 · 2 评论 -
删除 / 插入无头单链表的非尾节点(不能遍历链表)
单链表的结构typedef int DataType;typedef struct Node{ DataType _data; struct Node* _next;}Node, *PNode;单链表的尾插操作void SListPushBack(PNode* pHead, DataType data){ PNode _new = N...原创 2018-06-04 15:40:23 · 439 阅读 · 0 评论 -
逆序单链表(C语言)
先看一下单链表节点的结构typedef int DataType;typedef struct Node{ DataType _data; struct Node* _next;}Node, *PNode;单链表的尾插操作void SListPushBack(PNode* pHead, DataType data){ PNode _new =...原创 2018-06-03 19:08:00 · 2703 阅读 · 0 评论 -
不带头节点单链表的概念及实现
链表:用一组任意的存储单元来存放线性表的节点,这组存储单元可以是连续的,也可以是非连续的,甚至是零散分布在内存的任何位置上。typedef int DataType;typedef struct Node{ DataType _data; struct Node* _next;}Node, *PNode;节点包括两个域: 数据域:用来存储节点的值; 指针域...原创 2018-05-07 12:35:16 · 379 阅读 · 0 评论 -
动态顺序表的实现
上一篇文章静态顺序表的基本操作 实现了静态顺序表的基本操作,仔细一想,发现静态顺序表好像有缺陷,首先,进程中,需要开辟一大块空间供动态顺序表存储数据用,如果存储的数据不多(结点不多),会浪费很多内存,如果开辟空间比较少,而存储数据较多,就会存在数据存不下的情况,这都不是我们想要的,建立在这样的基础上,动态顺序表的就出现了,先来看一下动态顺序表的结构体:typedef int DataType...原创 2018-04-26 22:58:10 · 279 阅读 · 0 评论 -
二叉树的概念及实现
##概念1.二叉树:一棵二叉树是节点的一个有限集合,该集合或者为空,或者是由一个 根节点加上两颗分别称为左子树和右子树的二叉树组成。二叉树的特点:每个节点最多有两棵树,即二叉树不存在度大于2的节点二叉树的子树有左右之分,其子树的次序不能颠倒2.满二叉树:在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有叶子节点都在同一层上3.完全二叉树:如果一棵具有N个节点的二叉树的...原创 2018-05-10 01:24:29 · 340 阅读 · 0 评论 -
静态顺序表的概念及实现
静态顺序表,不涉及动态申请空间一、顺序表概念1.首先,顺序表的概念了解一下: 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。//顺序表声明 typedef int DataType;#define MAX_SIZE 10 ty原创 2018-04-16 14:38:25 · 544 阅读 · 0 评论
分享