数据结构
lucky52529
跳出自己的舒适区
展开
-
[数据结构]——浅谈红黑树原理与简易实现
红黑树我之前的博客讲解了AVL树的性质,通过对AVL树的了解我们知道了他是一颗高度平衡的二叉搜索树,其实二叉搜索树最大的作用就是进行插入,删除,查找的操作,而AVL树查找的时间复杂度为log(n)。为了保持平衡的性质(左右子树的高度差绝对值不大于一),AVL在进行插入数据时就要进行大量的旋转,当我们的数据量非常的大时,其实我们在进行插入调整这颗树的旋转操作也会有很大的开销,这里就出现了一颗叫红黑...原创 2019-04-20 20:03:46 · 1429 阅读 · 1 评论 -
[数据结构]——空间时间复杂度
算法效率包括时间上的效率(时间复杂度)和空间上的效率(空间复杂度)两个部分时间复杂度:用来衡量一个算法的运行速度,即,算法中的基本操作的执行次数。空间复杂度:算法在运行过程中临时占用存储空间大小的衡量。注:在实际中一般情况关注的是算法的最坏运行情况。下面举两个最典型的例子作为说明:#include <stdio.h> long long Factorial (size_t ...原创 2018-11-29 14:52:29 · 140 阅读 · 0 评论 -
[数据结构]——快速排序
实现快速排序的关键在于,你从一个数组中取出了一个数字,将他和数组中所有的数字相比较,比他小的放在数组的最左边,比他大的放在最右边,这个数字将数组分成比他大和比他小的俩部分,同样的道理,被分成的俩个子数组,又可以随机找出一个数字寻找比他大和小的,一个到最后子数组没办法再被分成俩个部分,利用这样的二分思想,我们便实现了数组的快速排序。(本代码交换函数与随机取值函数并未给出,希望读者自己完成)int ...原创 2018-11-13 17:17:50 · 503 阅读 · 1 评论 -
[数据结构]——字符串旋转
**1.**暴力位移法#include&lt;stdio.h&gt;#include&lt;string.h&gt;void reverse(char* arr, int sz){ int i = 0; char tmp = arr[0]; for(i = 1; i&lt;sz; ++i) { arr[i-1] = arr[i]; //每一次把...原创 2018-11-10 16:15:28 · 178 阅读 · 0 评论 -
[数据结构]——杨氏矩阵
//杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在。时间复杂度小于O(N);#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>//递归写法int sreach_k(int arr[3][3], int row, int col,int k,int x, int ...原创 2018-11-10 15:18:29 · 271 阅读 · 1 评论 -
[数据结构]——用红黑树封装MyMap/MySet
Map和Set的简易实现ps:在简易实现map和set之前你可能需要先学会怎么使用map和set,不会的同学可以戳这里:map容器的使用和set容器的使用,并且要实现自己的map和set你还要知道平衡树的旋转和红黑树原理,不会的同学可以戳这里:AVL树的旋转和浅谈红黑树原理。Map和Set容器模型如果你已经拥有了以上的技能,那么我们现在来聊一聊map和set的模型。通过使用我们发现,map是...原创 2019-04-26 16:02:12 · 246 阅读 · 0 评论 -
[数据结构]——哈希表
哈希表顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN ),搜索的效率取决于搜索过程中元素的比较次数。而实际上我们希望理想的搜索效率是O(1),那到底有没有一种数据结构可以实现O(1)的搜索效率呢?今天我们要介绍的东西叫做哈希表,说到哈希表我们不得不先提一下哈希的概念...原创 2019-05-11 18:53:49 · 469 阅读 · 0 评论 -
[c++]——用哈希表封装unordered_map/set
用哈希表封装unordered_map/set上一篇博客我们讲了哈希表(戳这里查看上一篇博客),这篇博客我们来用已经实现的哈希表来封装出unordered_map/set,我们以前讲过用红黑树封装map/set,其实这里也是换汤不换药,原理基本一模一样,只不过是哈希表有4个模板参数,通过这篇博客,你对哈希表的4个模板参数一定会有新的理解。unordered_map同样我们用unordered...原创 2019-05-11 19:59:04 · 420 阅读 · 0 评论 -
[数据结构]——多阶哈希表源码刨析
多阶哈希表前面笔者的博客已经介绍了哈希表中解决哈希冲突的开放定制法和拉链法,无意中接触到了多阶哈希这种数据结构,同样也可以解决哈希冲突的问题。经过各种资料和源码的阅读,今天拿出来与大家分享。多阶哈希表结构从多阶哈希这个名字就可以听出,多阶哈希在结构上应该像楼梯一样有多阶。没错,正如我们所想的,多阶哈希的结构如下图通过上面的图我们发现,多阶哈希并不是每一阶都是一样长的,而是从上往下逐渐减小...原创 2019-05-12 11:20:28 · 414 阅读 · 0 评论 -
[数据结构]——位图原理及实现
位图今天我们所介绍的数据结构叫做位图,在谈什么是位图之前我们先来看一道"非常简单的题":有40亿个无符号的整型数据,现在给定一个目标数字,判断这个数字是否在这40亿数据中。题目看起来确实非常简单,有的同学说直接遍历一遍不就ok了吗?还有的同学给出了更高效的查找方式就是将这些数字排序然后进行二分查找。但是,这是有问题的,问题并不在于你搜索这个数字的效率问题,而是你在遍历也好排序也罢,这些数字在内存...原创 2019-05-13 14:09:38 · 36112 阅读 · 15 评论 -
[数据结构]——大白话讲解前缀树
前缀树今天给大家讲解一下什么是前缀树,但是这篇文章并不是站在数据结构研发者的角度来讲解的,因为相信很多读者都和笔者一样也才是接触数据结构不久的小白,笔者写文章之前也看过很多描写前缀树的文章,如july大神讲解前缀树。但是这些文章大多数都讲的太过高深,并且大佬们的前缀树也都不是那么容易实现。所以今天笔者尽可能将这个数据结构给大家讲的简单一些。大佬们的前缀树前缀树概念:Trie树,即字典树,又称...原创 2019-05-23 21:29:40 · 1415 阅读 · 0 评论 -
[数据结构]——c语言模拟实现顺序表
顺序表的c语言实现此项目创建了3个源文件,test.h用来建立结构体和函数的声明,main.c用来实现函数,test.c用来实现顺序表的总逻辑。test.h#include<stdio.h>#include<assert.h>#include<stdlib.h>typedef int SqListType;typedef struct Seq...原创 2018-11-29 15:39:21 · 185 阅读 · 0 评论 -
[数据结构]——c语言实现单链表
此次工程还是使用了3个源文件slist.h(头文件源代码),slist.c(实现接口的具体代码),test.c(单链表逻辑)slist.h#pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int SLTDataType;typedef struct...原创 2018-12-01 12:29:35 · 429 阅读 · 0 评论 -
[数据结构]——浅谈AVL树原理与简易实现
AVL树相信学过数据结构的同学对于二叉搜索(排序)树一定不陌生,二叉搜索树是一颗左子节点比根节点小,右子节点比根大且他的子树也满足这种规则的一颗二叉树。二叉搜索树从名字上就知道他是用来进行数据的搜索的,理论上来讲他的搜索效率是log(n),但是事实上在某些极端情况下他好像显得并不那么有效。现在对空树插入一个有序的数列,你会发现他成为了一个单只树,最坏的搜索情况居然退化为o(n)。其实会发生这...原创 2019-04-21 16:24:55 · 889 阅读 · 2 评论 -
[数据结构]——单调栈
单调栈笔者在做leetcode的题(下一个出现的最大数字)时,接触到了单调栈这一种数据结构,经过研究之后,发现单调栈在解决某些问题时出奇的好用,下面是对单调栈的性质和一些典型题目。什么是单调栈?从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈单调递增栈:数据出栈的序列为单调递增序列单调递减栈:数据出栈的序列为单调递减序列ps:这里一定要注意...原创 2019-04-09 17:23:28 · 146757 阅读 · 81 评论 -
[数据结构]——链表排序
链表排序问题:我们需要将一个无序的单链表在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序时间复杂度为稳定O(n log n)的排序只有堆排序与归并排序,但是堆排序需要建堆,那么链表有n个节点我们就需要开辟长度为n的数组来存放节点,所以我们选择归并排序,我们知道普通的归并排序需要开辟一个tmp数组来存放临时数据,但是因为我们这里对链表进行排序不需要临时数组,所以我们使...原创 2019-03-04 16:39:44 · 1410 阅读 · 0 评论 -
[数据结构]——9大经典排序源码
1.插入排序void Insertsort(int* a, int n)//插入排序{ for (int i = 0; i &amp;amp;lt; n - 1; i++) { int end = i; int tmp = a[end + 1]; while (end &amp;amp;gt;= 0) { if (tmp &amp;amp;lt; a[end]) { a[end + 1] = a原创 2019-01-10 15:58:04 · 537 阅读 · 1 评论 -
[数据结构]——二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向 TreeNode* prev = NULL; void _Convert(TreeNode* cur) { if(cur == NULL) return; _Convert(cur->left); cur-&...原创 2019-01-06 16:07:09 · 135 阅读 · 0 评论 -
[数据结构]——根据二叉树创建字符串
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。void _tree2str(struct TreeNode* t,char* ptr){ if(t == NULL) return; char buff[12] = {'...原创 2019-01-06 14:56:00 · 851 阅读 · 1 评论 -
[数据结构]——判断平衡二叉树(ON解法)
给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1O(n^2)解法bool _isBalanced(struct TreeNode* root, int* pDepth) { if (root == NULL) { *pDepth = 0; return true; } int leftDep...原创 2018-12-18 20:42:05 · 324 阅读 · 0 评论 -
[数据结构]——二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,null,2,3]12/3输出: [1,2,3]void PreOrder(struct TreeNode* root, int* returnSize, int* ans){ if(root != NULL) { ans[(*returnSize)++] = root ->...原创 2018-12-10 21:17:56 · 372 阅读 · 0 评论 -
[数据结构]——删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 ListNode* deleteDuplication(ListNode* pHead){ ListNode* cur = pHead; ListN...原创 2018-12-05 15:38:30 · 219 阅读 · 0 评论 -
[数据结构]——模拟实现双向循环链表
此次工程还是使用了3个源文件list.h(头文件源代码),main.c(实现接口的具体代码),list.c(单链表逻辑)list.h#pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int LTDataType;typedef struct Li...原创 2018-12-02 19:50:05 · 482 阅读 · 0 评论 -
[数据结构]——无锁队列
无锁队列写这篇博客前想声名以下几点。第一,这篇文章重点内容是关于无锁队列如何实现,并不会深入讲解底层的CAS机制。原因就是第二条,不知道在看博客的你是否在搜索框中输入过"无锁队列"关键字,你点开居然会惊讶的发现每一篇居然都是那么的相似,一直不理解写博客A抄B,B抄C只是为了骗访客吗?这篇被抄来抄去的博客就是酷壳陈皓老师的原创,老师的博客中深入讲解了无锁队列的原理。只是缺少最后一份代码的实现,既...原创 2019-09-22 17:23:30 · 7861 阅读 · 2 评论