随笔分类 - 数据结构&算法
数据结构&算法
摘要:1. 图是什么 从公司回家有三条路线,考虑路况和安全性怎么选择?不考虑安全和路况的话又怎么选择? 在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就 是这些圆圈之间的连线。顶点之间通过边连接。注意:顶点有时也称为节点或者交点,边有时也称为链接。 社交网络
阅读全文
摘要:有了二叉搜索树为什么还要红黑树,以下面几个例子举例,如下面的二叉树可以达到很好的搜索效果 5 7 11 15 19 21 25 26 61 99 再看下面这棵树,我们将下面的数据按从左至右的顺序构造一棵二叉搜索树 15 13 16 11 9 7 5 3 按照之前我们二叉搜索树构建构建的方式,我们将得
阅读全文
摘要:1. 哈夫曼编码概括 /********************************************* * 本文图片较多,多刷新一下才能显示 * **********************************************/ 哈夫曼(Huffman)编码算法是基于二叉树构
阅读全文
摘要:二叉树的遍历是指从根结点出发,按照某种次序依次访问所有结点,使得每个结点被当且访问一次。共分为四种方式: 1. 前序遍历 先访问根节点,然后前序遍历左子树,再前序遍历右子树 上图前序遍历结果: 19 7 5 11 15 25 21 61 前序遍历实现: 递归实现 1 /***************
阅读全文
摘要:1. 二叉树的概念 当要在一组数中要找到一个数,比如 26?该怎么找? 61 25 7 11 15 99 19 21 55 26 最暴力的答案: 从左至右 或 从右至左遍历一次,找到这个数字 但把数据进行排序(按照从小到大的顺序排列)后,再查找相应的这条记录? 5 7 11 15 19 21 25
阅读全文
摘要:1. 什么是树: 树状图是一种数据结构,它是由 n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除 了根结点
阅读全文
摘要:给定一个只包含加减乘除法运算的算术表达式,编写一套算法来计算表达式的值。 输入格式 输入一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”、 减法运算符 “-”、乘法运算符“*”和 除 法运算符“/”,且没有括号,不考虑数值的范围(溢出),待求解的表达式以“=”号结束。 如: 12 +
阅读全文
摘要:找迷宫通路需要使用回溯法,找迷宫通路是对回溯法的一个很好的应用,实现回溯的过程用到数据结构—栈! 回溯法:对一个包括有很多个结点,每个结点有若干个搜索分支的问题,把原问题分解为若干个子问题求解的 算法;当搜索到某个结点发现无法再继续搜索下去时,就让搜索过程回溯(回退)到该节点的前一个结点,继续 搜索
阅读全文
摘要:1. 栈的特点 有一个胡同很窄只能通过一辆车,而且是死胡同,只能从胡同口进出,如果第一个进入,出去会很麻烦,需要所有的车辆出去后才能出去,如图: 胡同里的小汽车是排成一条直线,是线性排列,而且只能从一端进出,后进的汽车先出去,后进 先出(Last In First Out,LIFO),这就是"栈"。
阅读全文
摘要:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特 点快速定位指定索引的元素. (选择排序工作原理 - 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置, 然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排
阅读全文
摘要:操作系统内核作业调度是优先队列的一个应用实例,它根据优先级的高低而不是先到先服务的方 式来进行调度; 如果最小键值元素拥有最高的优先级,那么这种优先队列叫作升序优先队列(即总是先删除最小 的元素),类似的,如果最大键值元素拥有最高的优先级,那么这种优先队列叫作降序优先队列 (即总是先删除最大的元素)
阅读全文
摘要:1. 建立堆算法实现 堆数据结构的定义 1 #define DEFAULT_CAPCITY 128 2 3 typedef struct _Heap 4 { 5 int *arr; //存储堆元素的数组 6 int size; //当前已存储的元素个数 7 int capacity; //当前存储的
阅读全文
摘要:1. 堆的特点: 1.1. 每个节点最多可以有两个节点 1.2. 根节点的键值是所有堆节点键值中最大者(如果是最小堆则相反),且每个节点的值都比其两个或一个子节点的值大(如果是最小堆则相反) 1.3. 除了根节点没有兄弟节点,最后一个左子节点可以没有兄弟节点,其他节点必须有兄弟节点 2. 堆的结构:
阅读全文
摘要:Linux 内核“共享”双向链表在 linux 内核中,有大量的数据结构需要用到双向链表,例如进程、文件、模块、页面等。若采用双向链表的传统实现方式,需要为这些数据结构维护各自的链表,并且要为每个链表设计插入、删除等操作函数。因为用来维持链表的 next 和 prev 指针指向对应类型的对象,所以一
阅读全文
摘要:在高并发 HTTP 反向代理服务器 Nginx 中,存在着一个跟性能息息相关的模块 - 文件缓存。 经常访问到的文件会被 nginx 从磁盘缓存到内存,这样可以极大的提高 Nginx 的并发能力,不过因为内存的限制,当缓存的文件数达到一定程度的时候就会采取淘汰机制,优先淘汰进入时间比较久或是最近访问
阅读全文
摘要:英雄联盟游戏里面防御塔都有一个自动攻击功能,小兵排着队进入防御塔的攻击范围,防御塔先攻击靠得最近的小兵,这时候大炮车的优先级更高(因为系统判定大炮车对于防御塔的威胁更大),所以防御塔会优先攻击大炮车。而当大炮车阵亡,剩下的全部都是普通小兵,这时候离得近的优先级越高,防御塔优先攻击距离更近的小兵。 优
阅读全文
摘要:在队列的顺序存储中,采用出队方式 2, 删除 front 所指的元素,然后加 1 并返回被删元素。这样可以避免元素移动,但是也带来了一个新的问题“假溢出”。 能否利用前面的空间继续存储入队呢?采用循环队列 循环队列入队, 队尾循环后移: SQ->rear =(SQ->rear+1)%Maxsize;
阅读全文
摘要:线程池-由一个任务队列和一组处理队列的线程组成。一旦工作进程需要处理某个可能“阻塞”的操作,不用自己操作,将其作为一个任务放到线程池的队列,接着会被某个空闲线程提取处理。 1 #include <stdio.h> 2 #include <assert.h> 3 #include <Windows.h
阅读全文
摘要:队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列。为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点。 1 typedef int DataType; //队列中元素类型 2 typedef struct _QNode //结点结构
阅读全文


浙公网安备 33010602011771号