
数据结构
编程小耗子
本人比较喜欢高性能服务器开发。
在校曾获奖:
中国大学生计算机设计大赛国赛三等奖;
龙鼎杯河北二等奖;
蓝桥杯省赛三等奖;
CCPC河北省赛三等奖;
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
手撕堆排序
手撕堆排序实现思路:首先初始化堆,进行下沉操作,从最后一个叶子节点的父节点开始,将小数据下沉下去,做成一个最大堆(小到大做最大堆,大到小做最小堆)然后堆顶与未排序数组位置元素交换,未排序数组缩减一个元素。由于将元素交换到堆顶,打破了堆的性质,将堆顶的元素重新下沉,做出保持堆的性质。重复操作第二步,直至未排序数组元素个数为1,因为1个元素就不需要排序了。排序结束。写的不好请指正,嘻嘻_#include <iostream>#include <string.h>#in原创 2021-02-17 17:26:35 · 269 阅读 · 0 评论 -
什么是布隆过滤器
1. 什么是布隆过滤器本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。2. 实现原理实现的结构是bitmap结构,通过对数据进行多次hash得到的结果,对其对应的bitmap位置置为1。例如数据A三次hash的结果为1,5,7。那么原创 2021-02-17 13:26:18 · 308 阅读 · 1 评论 -
单链表实现快排
单链表实现快排该方法通过前后指针的方式实现。通过后指针不停的走,获取数据只要小于哨兵值,就交换到前指针。所以该方法也就不需要链表的前序节点。下面是具体实现。#include<iostream>#include<ctime>using namespace std;struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};ListNode *ghead原创 2021-02-17 13:23:42 · 256 阅读 · 0 评论 -
时间轮算法设计实现
时间轮算法基本思想参照时钟运转的思路,每个相同刻度下的时间是相同的,将所有相同时间的时间放在一个槽中,通过用一个指针每过一个刻度指向时间轮的槽,取出槽中链表,循环遍历相同刻度下的事件。(liunx内核就是这么做的)。如图所示的是一个时间轮的基本结构。时间轮分为N个时间槽slot,每时间槽指向一个定时器链表,这个链表里包含多个定时器,这个链表的定时器Timeout时间相同,因此链表里的定时器无须排序。简单时间轮的实现#include <unistd.h>#include <i原创 2021-01-25 22:31:15 · 415 阅读 · 0 评论 -
使用红黑树实现定时器
使用红黑树实现定时器使用的是nginx中使用的红黑树结构,直接从中迁移出来并修改。通过红黑树实现的时间轮,查询与插入的时间复杂度是O(Logn)。查询第一个节点只需要找树的最左边一个节点即可。定时器本身就是从头部开始取数据,红黑树就不比跳表这一数据结构匹配定时器实现的更好。文件rbtree.h#ifndef _NGX_RBTREE_H_INCLUDED_#define _NGX_RBTREE_H_INCLUDED_typedef unsigned int ngx_rbtree_ke原创 2021-01-25 21:19:19 · 985 阅读 · 0 评论 -
使用跳表实现定时器
使用跳表实现定时器使用的是redis中使用的跳表结构,直接从中迁移出来并修改。通过跳表实现的时间轮,查询第一个数据的时间复杂度就是O(1),插入时间复杂度就 大概率的趋向于O(logn(N))。定时器本身就是从头部开始取数据,跳表这一数据结构就特别匹配定时器的实现。文件skiplist.h#ifndef _MARK_SKIPLIST_#define _MARK_SKIPLIST_/* ZSETs use a specialized version of Skiplists */#def原创 2021-01-25 09:01:52 · 691 阅读 · 0 评论 -
redis之跳跃表的实现
跳跃表跳跃表(skiplist) 是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均O(logN) 、 最坏O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。在大部分情况下, 跳跃表的效率可以和平衡树相媲美, 并且因为跳跃表的实现比平衡树要来得更为简单, 所以有不少程序都使用跳跃表来代替平衡树。Redis使用跳跃表作为有序集合键的底层实现之一, 如果一个有序集合包含的元素数量比较多(默认情况是大于128个使用跳表), 又原创 2021-01-23 16:14:41 · 226 阅读 · 0 评论 -
redis之字典实现
字典在不进行rehash的时候,使用的是ht[0],进行rehash的时候,ht[0]和ht[1]一起使用。typedef struct dict { //类型特定函数 dictType *type; //私有数据 void *privdata; //哈希表 dictht ht[2]; // rehash索引 //当rehash不在进行时, 值为-1 in trehashidx; /* rehashing not in pro原创 2021-01-23 00:11:09 · 264 阅读 · 1 评论 -
数据结构之快速排序的三种写法
方法1:前面放一个指针的方法void quick(int *arr, int len, int start, int end){ int low = start; for (int i = start + 1; i < end + 1; i++) { if (arr[i] < arr[start]){ low++; if (low != i){ swap(&arr[low], &arr[i]); } } } swap(&ar原创 2020-11-16 22:56:53 · 350 阅读 · 0 评论 -
红黑树------插入结点
红黑树的优势首先红黑树是不符合AVL树的平衡条件的,即每个节点的左子树和右子树的高度最多差1的二叉查找树。但是提出了为节点增加颜色,红黑树是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多,所以红黑树的插入效率更高。红黑树能够以O(log2 (n)) 的时间复杂度进行搜索、插入、删除操作简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线原创 2020-07-08 21:28:25 · 491 阅读 · 0 评论 -
插入,希尔,快速,归并 四大排序实现
文章链接:https://codemouse.online/archives/2020-05-17-22-08-18插入排序// 插入排序,从大到小void sortInsert(int* arr, int len){ int temp = 0; for ( int i = 1,j =0; i < len ; i++) { temp = arr[i]; for (j = i-1; j >= 0 && arr[j]原创 2020-06-23 11:01:03 · 119 阅读 · 0 评论 -
看毛片(kmp)算法实现
文章链接:https://codemouse.online/archives/2020-05-17215750kmp算法简单理解next的获取双指针,当两个指针的字符一致的时候,一起向前走,如果不一致,指向前面的k回退到next[k-1]的位置,直到遇到一致的字符或者到0的位置,然后放置当前位置的k值.kmp用法双指针,一个指向带匹配字符和 匹配字符.但两个指针指向的字符一致的时候,指针同时往前走,但不一致的时候,匹配字符的指针回退到next[q-1]的位置,直到遇到一致的字符或者到0的位置.原创 2020-06-23 11:00:24 · 7173 阅读 · 0 评论 -
通过逆波兰式,做带括号的混合运算
文章链接:https://codemouse.online/archives/2020-03-01-101711逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)。如(a+b)*c-(a+b)/e的后缀表达式为:(a+b)*c-(a+b)/e→((a+b)*c)((a+b)/e)-→((a+b)c*)((a+b)e/)-→(ab+c*)(ab+e/)-→ab+c*ab+e/-算法实现:判断是否为数字,是数字则放入队原创 2020-06-19 19:19:02 · 535 阅读 · 0 评论 -
线性队列的自我实现
线性队列的实现代码 #include <stdio.h>void Queue(int* que, int id){ *que = id;}void popQueue(int que[], int len){ for (int i = 0; i < len; i++) { que[i] = que[i + 1]; }}void main(){...原创 2018-12-07 07:57:20 · 210 阅读 · 0 评论 -
链表栈的自我实现
链表栈的实现代码 #include <stdio.h>#include <stdlib.h>typedef struct Strack{ int id; struct Strack *pnext;}STR,*PSTR;void create(PSTR *head){ *head = (PSTR)ma...原创 2018-12-07 08:07:44 · 167 阅读 · 0 评论 -
c++的vector容器的自我实现
实现代码 #pragma once#include <windows.h>template<class T>class Myvector{ T *pBuff; size_t num; size_t maxNum;public: struct MyIterator { T *pIt; MyIterator& operator=(M...原创 2018-12-07 08:25:37 · 281 阅读 · 0 评论 -
c++的List容器的自我实现
实现代码如下 #pragma once#include <iostream>using namespace std;template<class T>class MyList{private: struct node { T data; node* pre; node* next; };public: struct iterat...原创 2018-12-07 08:27:58 · 282 阅读 · 0 评论 -
链表实现图书借阅管理系统
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>typedef struct book{ char name[10]; struct book* next;}BOOK,*pBook;typedef stru...原创 2018-12-07 16:23:06 · 1750 阅读 · 0 评论 -
8大常用排序写法
八大排序的理解个人对八大排序的理解,如有错误请指出新人第一次写博客,排版可能稍微不好看,请谅解 代码最简单,但效率低冒泡:相邻比较思想选择:选择最小的思想 代码简单,排序快速,常用插入:与前面比较,大于自己,前移希尔:在插入的基础上做出跨度 使用递归思想,排序快速,代码复杂快速:在逻辑切分数组后将第一个元素作为参考值进行左右在切分,递归思想归并...原创 2018-08-06 18:44:58 · 1269 阅读 · 0 评论