数据结构
文章平均质量分 77
楚渐灵
没有比人更高的山,没有比脚更长的路。
展开
-
B树和B+树的简单了解
B树B树概念B树的插入B+树的简单介绍B+树的特性总结B树B树概念B树是一种平衡多叉树,。一棵M(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树,或者满足以下性质:根节点至少有两个孩子每个非根节点至少有 M/2 (上取整)个孩子,至多有M个孩子每个非根节点至少有 M/2 - 1(上取整)个关键字,至多有 M-1个关键字,并且以升序排列key[i] 和 key[i+1]之间的孩子节点的值介于 key[i],key[i+1]之间所有叶子节点都在同一层B树的插入插入过程总.原创 2021-03-11 11:10:36 · 446 阅读 · 2 评论 -
并查集
并查集原理在一些有N个元素的集合应用问题中,需要将N个不同的元素划分成一些不相交的集合。开始时,每一个元素自成一个单元素集合,然后按照一定的规律将归于同一组元素的集合合并。其间要反复查找一个元素在哪个集合中。适用于描述这一类问题的抽象数据类型称为并查集(Union find set)。实际上,并查集的存储是一个森林,每一个集合是一个树。观察数组融合规律,得出以下结论:数组的下标对应集合中元素的编号数组中如果为负数,负数代表根,数字代表该集合中的元素个数数组中如果为负数,代表元素双亲在数组中的原创 2020-09-01 21:21:40 · 138 阅读 · 0 评论 -
哈希
哈希概念在顺序结构或者平衡树中,找到一个元素要经过多次比较,在顺序结构中可能要经历O(N)次,在平衡树中也要经过 O(log2N)。而哈希则建立了一种映射关系,比如说在ASCII码中,小写字母’a’对应的ASCII码是97,'a’和97便是一种映射关系,通过这种映射关系,就能更快的找到一个元素。哈希冲突哈希中找到映射关系所使用的转换函数称为哈希函数,构造出来的结构称为哈希表。例如如下的哈希函数:hash(key) = key % capacity。不同的关键字通过相同的哈希函数计算出了相同的哈希原创 2020-07-19 11:59:14 · 346 阅读 · 0 评论 -
AVL树
什么是AVL树首先AVL树是二叉搜索树,但是严格的控制高度,因为如果插入树的序列原本就是有序的,那二叉搜索树就近似于链表,查找效率极其低下,所以就引入AVL树并且满足下列条件。每个结点左右子树高度差不超过 1左右子树仍然满足上述条件由于严格的控制高度,所以AVL树的查找效率还是 O(log2N),如果有N个结点,就会把树的高度控制在O(log2N)AVL树的插入首先按照二叉搜索树的插入方式进行插入(如果为空直接插入作根节点,如果不为空,比当前结点大就到左子树,比当前结点小就到右子树,在合适的原创 2020-07-01 01:17:23 · 284 阅读 · 0 评论 -
二叉搜索树
二叉搜索树的性质左子树的结点的值都小于根,或者左子树为空。右子树的结点的值都大于根,或者右子树为空。左子树和右子树也满足上述的性质。二叉搜索树的插入若树为空树,直接插入若不为空则根据性质进行插入,比当前结点大就到左子树,比当前结点小就到右子树,在合适的位置插入。bool Insert(const K& key, const V& value) { if (_root == nullptr) { _root = new Node(key, value);原创 2020-06-24 17:54:26 · 121 阅读 · 0 评论 -
计数排序
void CountSort(int *a,int n) { // 找出最大数和最小数,确定序列的范围 int max = a[0]; int min = a[0]; for (int i = 0; i < n; ++i) { if (a[i] > max) { max = a[i]; } if (a[i] < min) { min = a[i...原创 2020-03-28 22:20:28 · 127 阅读 · 0 评论 -
归并排序
假设有这样一个序列: 1 3 5 7 2 4 6 8. 将这个序列从中间一分为二,会发现,左边的序列是有序的,右边的序列也是有序的,但是整个序列是无序的,如果要使整个序列有序,可以借助一个临时数组,两个指向左右两个序列前边的指针 begin1 和 begin2(现在 begin1 指向1,begin2 指向2)。将左右两个序列的元素逐个比大小,小的进入临时数组,并且指针往后走一位...原创 2020-03-26 17:47:48 · 120 阅读 · 0 评论 -
快速排序
快速排序是一种……的排序。(自行脑补)快速排序有三种思想:左右指针法挖坑法前后指针法左右指针法:首先在序列里边找出来 key 值,一般是用的序列最后一个元素作为 key 值。指针 begin 从序列左边开始往右边找比 key 值大的元素,若找到,停下,若没找到,继续往右走。指针 end 从序列右边开始往左边找比 key 值小的元素,若找到,停下,若没找到,继续往左走。交换 ...原创 2020-03-26 14:28:44 · 318 阅读 · 0 评论 -
选择排序
思想: 把要排序的序列分为两个序列,分别是有序序列和无序序列。一开始,因为还没有进行排序,所以整个序列都是无序的,所以有序序列为空,然后以升序为例,进行一次循环,挑出最小的数,放到无序序列的最前边,然后进行一次划分,将刚选出的这个数当做有序序列,剩下的数当做现有的无序序列,再进行循环挑出最小的数,放到最前边,再归类成有序序列的一部分,现在有序序列有两个数,剩下的所有数都是无序序列的,就这样进行一次...原创 2020-03-25 19:11:42 · 127 阅读 · 0 评论 -
希尔排序
希尔排序算得上是直接插入排序的升级版!那么为什么要有希尔排序?因为直接插入排序在最坏情况下(顺序)的时间复杂度是O(n)^2,但是同时在情况最好的时候(逆序)时间复杂度是 O(n),鉴于好的时候效率还可以,所以对插入排序进行一个升级!便有了希尔排序!具体思路如下:先将整个序列分成几个子序列(元素与元素之间相隔 gap(一个常量)的组成一个子序列),分别对每个子序列进行直接插入排序。如下图所示:...原创 2020-03-25 00:56:41 · 134 阅读 · 0 评论 -
堆排序
数组是完全二叉树的很好的存储方式。比如说一个完全二叉树如下图所示。他的逻辑结构便是这样。满足这样一个关系:双亲结点的位置 X 2 +1 = 左孩子结点的位置。(孩子节点的位置 - 1)/ 2 = 双亲结点的位置。然后说关于堆排序的一个重要的算法:向下调整算法: 我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提:左右...原创 2020-02-29 16:56:39 · 155 阅读 · 0 评论 -
插入排序
思想插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排 序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。图解将每个元素和其他元素进行对比,如果,然后将这个元素插入到合适的...原创 2019-11-03 21:04:53 · 94 阅读 · 0 评论 -
队列
Queue.h#pragma once#include <stdio.h>#include <stdlib.h>#include <assert.h>typedef int QDataType;typedef struct QueueNode{ QDataType _data; struct QueueNode* _next;}QueueN...原创 2019-12-20 12:08:00 · 234 阅读 · 0 评论 -
栈
Stack.h#pragma once#include<stdio.h>#include<stdlib.h>typedef int DataType; /*定义栈中数据元素的数据类型*/typedef struct node { DataType *data; int capacity; // 栈的容量 int top; //...原创 2019-12-20 12:06:21 · 94 阅读 · 0 评论 -
双向循环链表
DLinkedList.c#include"DLinkedList.h"// 创建返回链表的头结点.ListNode* ListCreate() { ListNode* head = (ListNode*)malloc(sizeof(ListNode)); head->_next = head; head->_prev = head; return head;}...原创 2019-12-13 15:18:07 · 92 阅读 · 0 评论 -
单链表——数据结构
SLinkedList.h#pragma once#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<assert.h>typedef int SLTDateType;typedef struct SListNode{ SLTDateType data; s...原创 2019-12-10 10:09:23 · 2262 阅读 · 0 评论 -
用栈实现10进制转换为8进制
#include<stdio.h> #define STACK_INIT_SIZE 100#define OVERFLOW -2#define OK 1typedef int SElemType;typedef struct { SElemType *base; SElemType *top; int stacksize;}SqStack;int InitS...原创 2019-10-22 22:58:47 · 1750 阅读 · 4 评论 -
顺序表的实现
实现了线性表的初始化、销毁、尾增尾删、头增头删、指定位置的增加删除,以及打印最后的结果。SeqList.h#pragma once#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<assert.h>#define SLDataType inttypedef...原创 2019-12-06 10:47:15 · 168 阅读 · 0 评论