
数据结构
文章平均质量分 93
算法与数据结构
、山有木兮木有枝
语法只是工具,算法才是灵魂
展开
-
滑动窗口算法总结
算法目的该算法展示了如何将嵌套for循环在少数问题中转换为单个for循环,从而减少了时间的复杂性。应用滑动窗口技术:我们使用线性循环计算n个项中前k个元素的总和,并将总和存储在变量window_sum中。然后,我们将在阵列上线性滑动直至达到最终并同时追踪最大和。要获得k个元素块的当前总和,只需从前一个块中减去第一个元素并添加当前块的最后一个元素即可。 下面的表示将清楚说明窗口如何在阵列上滑动。这是我们计算从索引0开始的初始窗口总和的初始阶段。在这个阶段,窗口和为6.现在,我们将maximum_s原创 2020-08-12 18:55:00 · 10026 阅读 · 1 评论 -
并查集原理、代码、例题演示
并查集原理在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-findset)比如:某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不同的学校,起先互不相识,每个学生都是一个独立的小团体,现给这些学生进行编号:{0, 1, 2, 3,4, 5, 6, 7, 8, 9}原创 2020-08-07 22:44:14 · 228 阅读 · 1 评论 -
红黑树的插入(map、set的底层实现)
红黑树红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。性质每个结点不是红色就是黑色根节点必是黑色的 (重点)如果一个节点是红色的,则它的两个孩子结点是黑色的,即没有连续的红节点 (重点)对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点 (重点)每个叶子结点都是黑色的(此处的叶子结点指的是空原创 2020-06-30 14:44:38 · 250 阅读 · 0 评论 -
AVL 树的插入以及简单代码实现
AVL 树概念AVL树是最先发明的自二叉搜索树。因为一旦二叉搜索树插入的数据接近有序,那么则会退化成为一颗单支叶树,相当于一个链表,查找效率低下。但在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。严格保证了树的高度,大大提高了查找的效率,但是增加和删除可能需要通过一次或多次旋转来重新平衡这个树。特点本身首先是一棵二叉搜索树。它的左右子树都是 AVL 树带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。如果一棵二叉搜索树是高度平衡的,它就是AV原创 2020-06-28 23:46:47 · 811 阅读 · 0 评论 -
一篇文带你搞懂搜索二叉树的原理和实现
二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树1.二叉搜索树的查找2.二叉树的插入a. 树为空,则直接插入b. 树不空,按二叉搜索树性质查找插入位置,插入新节点3.二叉搜索树的删除首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:a. 要删除的结点原创 2020-06-16 23:19:43 · 981 阅读 · 2 评论 -
C语言实现单链表
#define _CRT_SECURE_NO_WARNINGS#include<stdint.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<assert.h>#include<stdio.h>//SeqList#define O...原创 2019-12-03 22:34:58 · 220 阅读 · 0 评论 -
模拟顺序表的动态存储
头文件:#pragma once#include <stdio.h>#include <assert.h>#include <stdlib.h>typedef int SLDateType; //数据typedef struct SeqList{ SLDateType* a; size_t size; //有效数据的长度...原创 2019-12-04 18:52:24 · 139 阅读 · 0 评论 -
排序算法一锅端
两种思路,正序和逆序:void sort(int *arr, int len) //正序{ for (int i = 0; i < len - 1; ++i) //控制循环次数 { for (int j = 0; j < len - i - 1; ++j) //每一轮循环后最左边的已经是最小的,故下次只需遍历 len - i个 { if (arr[j...原创 2019-12-06 21:07:59 · 697 阅读 · 0 评论 -
C实现栈
#include <stdio.h>#include <stdlib.h>#include <assert.h>// 动态增长的栈typedef int STDataType;typedef struct Stack{ STDataType* _a; int _top; // 栈顶 int _capacity; // 容量 }Stack...原创 2020-01-06 21:11:57 · 209 阅读 · 0 评论 -
C实现带头双向循环链表
头文件:#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<assert.h>#include<stdlib.h>typedef int LTDataType;typedef struct ListNode{ LTDataType a; struct ListNode* prev...原创 2020-01-10 21:36:46 · 166 阅读 · 0 评论 -
C实现非循环队列
头文件:#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int QDataType;typedef struct QListNode{ struct QListNode* _next; QDataType _data;}QNode;typedef struct Qu...原创 2020-01-11 20:52:06 · 329 阅读 · 0 评论 -
顺序表和链表的优点和缺点
顺序表:优点:空间连续,支持随机访问,查找元素的时间复杂度为O(1)缺点:1.插入或者删除元素的时间复杂度为O(n)2.扩容的代价比较大链表:优点:1.空间不连续2.插入或者删除的时间复杂度为O(1)3.扩容容易缺点:1.不支持随机访问2.查找元素的时间复杂度为O(n)...原创 2020-01-26 20:57:24 · 709 阅读 · 0 评论 -
力扣题库设计循环队列
题目要求:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyC...原创 2020-02-07 22:00:09 · 538 阅读 · 0 评论 -
堆的创建插入删除排序(含堆的向上,向下调整)
堆堆再逻辑上可以看成一颗完全二叉树。原创 2020-03-04 21:30:17 · 399 阅读 · 0 评论