
数据结构
文章平均质量分 79
星空之下仰望神
喜欢思考。适合成为哲学家的未来程序员
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
位运算的奇技淫巧-位运算分治
对一个32 位无符号整数,如何颠倒它的二进制位?一个朴素的办法是,从低位到高位,逐位使其二进制数就位。uint32_t reserveBits(uint32_t n) { uint32_t ret = 0; for (int i = 0; i < 32; i++) { ret |= ((n >> i) & 1) << (31 - i); } return ret;}对第i位,使用(n >> i) &原创 2021-05-30 09:34:56 · 911 阅读 · 2 评论 -
由Topk到STL源码(快排优化)
一切从一个力扣题开始:最小的k个数TopK:输入整数数组 arr ,找出其中最小的 k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。看到有人说STL提供了算法可以解决这个题,自己实现了一下,于是有了这两种解法。秒杀法调用STL提供的nth_element方法,该方法让第 n 个位置上的元素就位,且所有在位置 n 之前的元素都小于或等于它,所有在位置 n 之后的元素都大于或等于它。class Solution {public: vector原创 2021-04-14 15:21:06 · 289 阅读 · 0 评论 -
优先队列实现哈夫曼树
哈夫曼树给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。哈夫曼树的建立过程:这里使用STL容器适配器priority_queue实现哈夫曼树.结构体定义提示:能存储字符有字符的频率(优先级)有左子结点和右子结点t...原创 2019-11-11 19:28:10 · 3825 阅读 · 0 评论 -
二叉搜索树
二叉搜索树二叉搜索树一般用于查找,查找思路类似于二分查找,平均每次能排除一半的结点,所以它的平均效率为二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树...原创 2019-11-05 21:51:38 · 265 阅读 · 0 评论 -
栈
栈栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。顺序栈顺序栈是用数组实现的栈,结构体定义提示:应有栈顶和栈底...原创 2019-10-30 10:40:41 · 175 阅读 · 0 评论 -
顺序表
看过了很多讲数据结构的文章,有种千篇一律的感觉,套路和顺序大致相同.于是决定,自己写的时候使用一种新的方式把它呈现给大家.将采用提示–思考–代码及注释的方式,在看具体的代码实现之前,大家可以通过提示先试着自己写,然后再看代码实现.代码均使用C++!!!结构体定义提示:应该有存放数据的地方应该记录已存放了多少个元素表应该有上限代码:typedef struct { int *...原创 2019-09-24 21:20:55 · 177 阅读 · 0 评论 -
单链表
单链表(带头结点)结构体定义提示:应有数据域和指针域typedef struct LinkNode { int data; struct LinkNode *next;}LinkNode, LinkList;单链表初始化提示:头结点创建是否成功?头结点的指针域是否置空?bool initList(LinkList* &L) {//L:指向头结点的指针 ...原创 2019-09-28 10:54:38 · 196 阅读 · 0 评论 -
循环链表
循环链表是头尾相连的单链表,它的操作大致与单链表一致.单链表判断是否到达表尾的方式是判断指针域是否为空,而循环链表是判断指针域是否指向头结点.结构体定义提示:应有数据域和指向下一个结点的指针域typedef struct CLinkNode { int data;//数据域 CLinkNode *next;//指针域}CLinkList,CLinkNode;初始化提示:...原创 2019-10-05 09:48:35 · 426 阅读 · 0 评论 -
由Nginx源码写双向循环链表
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Nginx提供了轻量级的双向链表,仅有指针域,而无数据域.用户在使用的时候需要自定义一个包含了这个...原创 2019-10-06 17:32:44 · 210 阅读 · 0 评论 -
队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。顺序队列顺序队列大致结构如下所示:结构体定义提示:要有存数据的地方能找到队头和队尾typedef struct { int data[MAXSIZE];//要有存...原创 2019-10-10 12:44:11 · 371 阅读 · 0 评论 -
链队实现优先队列
首先,什么是优先队列?普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征.简单来说,每次出队,优先级最高的先出,如果优先级相同,按普通队列方式(先进先出)出队.结构体定义提示:应有存放优先级的变量(本文中,数...原创 2019-10-10 12:45:05 · 583 阅读 · 0 评论 -
任务队列
结构体定义typedef struct TQNode { int id; void (*handle)(void); TQNode *next;}TQNode;typedef struct { TQNode *front; TQNode *rear;}Queue;初始化bool initQueue(Queue* &q) { q = new Queue; if ...原创 2019-10-17 12:50:26 · 2356 阅读 · 0 评论 -
循环队列
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。逻辑结构如下:存储结构如下:结构体定义提示:应有数据域有队头和队尾指针typedef struct { int data...原创 2019-10-17 14:21:01 · 251 阅读 · 0 评论 -
堆
堆堆(heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值.堆总是一棵完全二叉树.根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆.这里我们以最大堆为例来讲堆.堆的实质就是树,不过它有些特殊,它是用数组存放的树!堆的父结点和其左右子结点有何关系?如果父结点为i,...原创 2019-10-25 10:12:47 · 165 阅读 · 0 评论 -
堆实现优先队列
堆实现为什么要使用堆实现优先队列?在前面讲了用链队实现优先队列,其思想是插入元素时按普通队列入队,在删除元素(出队)时按优先队列的性质删除.那么就还有一种方式,即插入元素时按优先队列的方式插入,删除时按普通顺序队列的方式删除.那就是用堆实现优先队列!由于前面已经写过堆的实现,这里不再重复造轮子,读者可以自己改写实现优先队列,我们使用容器适配器.堆的实现首先我们需要一个容器,vector容器...原创 2019-10-26 22:20:16 · 786 阅读 · 0 评论