![](https://img-blog.csdnimg.cn/88dd4bd9bbce44758fcbab840222cc3c.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 95
介绍数据结构以及其代码实现
半__夏
路漫漫其修远兮,吾将上下而求索。
展开
-
从磁盘结构和索引来看B/B+树
从磁盘的结构触发,讨论了数据如何在磁盘上存储以及如何通过索引进行优化。针对索引又讨论了稠密索引和稀疏索引的区别和应用。在进一步讨论了M路搜索树和如何从M路搜索树演化来B树以及B+树。原创 2021-12-19 14:25:17 · 641 阅读 · 0 评论 -
通过树结构的演变以及实现来辩证的看数据结构
1. 单链表、双链表、循环链表的设计实现2. AVL树的构建和实现3. 红黑树的演变和实现4. Trie树的实现和应用5. 堆如何实现优先队列和堆排序6. 跳跃表在redis中的应用原创 2021-10-18 00:53:10 · 326 阅读 · 0 评论 -
图论基础以及深度优先搜索和广度优先搜索
1. 介绍树的前序遍历、中序遍历、后序遍历、层序遍历2. 介绍图论基础概念3. 介绍图的邻接矩阵、邻接表的表示方法以及邻接表的优化4. 图的深度优先遍历、广度优先遍历原创 2021-08-06 23:41:19 · 404 阅读 · 2 评论 -
队列以及队列的应用
队列队列的定义生活中可能有很多种需要排队的场景,比如中午去食堂打饭,需要排队,排在队头的同学肯定是先去的,所以先打上饭。计算机中也有很多这样的场景,比如作业调度系统,如果同时来几个任务都需要用到输入输出系统,但是输入输出设备只有一套,谁先用呢,也是谁先来谁用,也需要排队。再比如我们的锁机制,如果出现多线程竞争同一把锁,那么同时只有一个线程获得了锁资源,剩下的线程怎么办呢,那如果是公平锁,肯定也是排队,等锁被释放了,那个最先来的线程优先获得锁资源。那么根据上面的说法我们也大概了解了什么是队列。把他从生活原创 2020-08-02 20:10:33 · 4552 阅读 · 1 评论 -
栈的数组和链表实现以及用栈实现中缀表达式转换后缀表达式并求值
栈栈的定义教科书上栈的定义是这样的:只允许在表的末端进行插入和删除的线性表。允许插入和删除的一端叫做栈顶(top),另一端叫做栈底(bottom)。栈中没有元素的时候是一个空栈。那我们看图为例:这就是一个栈的结构,他只允许从top端插入删除,bottom端是封闭的。有一组数据data1,data2,data3入栈的时候是顺序的,那么出栈的时候就刚好倒过来,最后一个入栈的先出栈,最早一个入栈的最后出栈。我们把这个规则叫后进先出(LIFO)。栈的代码实现栈作为一种顺序表,可以通过数组和链表这两种方法原创 2020-07-26 19:06:45 · 375 阅读 · 0 评论 -
链表的几种形式以及约瑟夫环和LRU缓存淘汰算法的设计(java、C、Go语言实现)
介绍链表的几种基本类型,包括单链表、双向链表、循环链表,以及每种结构的java代码实现,其中双向链表java代码可以参考linkedlist,文章中给出了C语言和Go语言版本的实现。文末通过设计LRU缓存淘汰算法、解决约瑟夫问题介绍了链表的应用。...原创 2020-07-19 20:29:14 · 329 阅读 · 0 评论 -
归并排序
归并排序所谓归并排序,意思就是合并两个已经有序的列表,然后输出到结果列表。这一点从字面意思也能大概看来。下面我们从两个点说归并排序:归并排序的归并怎么归?归并排序需要两个已经排序的数组,这两个数组从何处来?归并排序的归并怎么归假设有两个已经排序的数组A和B以及一个空数组C,那么归并排序的归并过程大致如下所示:假设有两个指针Apos和Bpos分别指向数组A和数组B的第一个位置,C指向...原创 2020-02-28 22:04:58 · 174 阅读 · 0 评论 -
堆排序
堆排序堆排序的主要思想关于什么是堆,可以看看二叉堆。这里就不在啰嗦了。关于堆,我们知道有个最主要的性质,对于最大堆,堆顶的元素总是最大的,对于最小堆,堆顶的元素总是最小的。所以如果我们将一个数组转化成一个堆,在反复执行删除堆顶元素的操作,那么每次删除的元素必然是有序的,也就实现了我们排序的效果。因此,堆排序的步骤主要两点:构建堆,将一个数组转化成一个堆,我们在MaxHeap.md中有总...原创 2020-02-28 11:41:18 · 100 阅读 · 0 评论 -
快速排序
快速排序快速排序的基本流程快速排序顾名思义是通过实践发现,性能快于其他排序算法的一种算法。他的基本排序思想分为下面几步,假设给定一个待排序的数组arr如果arr中元素的个数是0或者1,则结束程序,因为快速排序是用递归实现的,所以这一步可以看做递归的出口选取数组arr中任一个元素,成为枢纽元(pivot)通过pivot将数组分成两个不想交的子数组arr1和arr2,其中arr1中的元素均...原创 2020-02-27 11:26:49 · 176 阅读 · 0 评论 -
插入排序
插入排序插入排序的基本原则是,将一个待排序的元素,按照排序规则,插入到前面已经排好序的一组元素的适当位置,直到元素全部插入为止。根据寻找插入位置的不同方式,可将插入排序分为直接插入排序和折半插入排序,还有一种对直接插入排序的优化方案希尔排序。直接插入排序直接插入排序的是,将一组待排序的元素第一个元素看做是有序的,然后从第二个元素开始,将他插入到前面排好序的一组元素的合适的位置。结合下面 的一...原创 2020-02-25 18:01:29 · 136 阅读 · 0 评论 -
hashCode方法介绍
hashCode方法介绍hashCode方法的意义JDK官方API给出的解释:public int hashCode()Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by HashMap.Th...原创 2020-02-23 16:44:12 · 371 阅读 · 0 评论 -
堆&优先队列
二叉堆二叉堆的定义二叉堆是一颗完全二叉树完全二叉树:把元素一层一层放,如果每一层都放满,没有空的叶子节点,就是满二叉树,如果有空的叶子节点,那就是完全二叉树。二叉树中每一个节点的值总是小于父节点的值(最大堆)。如下图所示便是一个最大二叉用数组表示表示堆如上二叉堆我们可以用这样一个数组表示,将堆中的元素按顺序依次放入数组中,这样的话,要表示一个节点的父子关系不如定义成树结构...原创 2020-02-23 16:20:47 · 121 阅读 · 0 评论 -
AVL树
AVL树定义AVL树本质上还是一颗二叉搜索树,其特性是对于任意一个节点,左子树和右子树的高度差不能超过1,所以AVL树也称为平衡二叉树平衡二叉树的高度和节点数量之间的关系也是O(logN)平衡因子: 左右子树的高度差为什么需要AVL树当我们顺序将一组从小到大的数据(1,2,3,4,5)插入到一颗空的二叉搜索树,那么你可以发现这个时候二叉搜索树已经完全退化成为了一个链表,他的各操作的...原创 2019-09-04 17:29:41 · 287 阅读 · 2 评论 -
二叉搜索树
什么是二叉查找树树的概念这里不做说明,在假设我们都知道二叉树的情况下,那么二叉查找树就是符合以下情况的一种特殊的二叉树:对于二叉查找树的某个节点X,他的左子树中所有的节点值都小于X节点的值,右子树所有节点的值都大于X节点的值。例如下面这颗树,就是一个二叉搜索树。该树结构中,16左边的节点都小于16,16右边的节点大于16,其他节点同理。那下面我们分别讨论二叉查找树的增删改查几个重要方法。查...原创 2019-07-14 23:31:05 · 151 阅读 · 0 评论 -
03-Redis源码数据结构之跳跃表
介绍跳跃表的查找插入以及C语言实现原创 2018-11-18 20:33:35 · 415 阅读 · 0 评论 -
利用栈实现中缀转化成后缀表达式并求值
后缀表达式假设我们计算一个表达式:4*2+5+6*7=,他的计算顺序可以是将4*2的值存为A1,然后将A1和5相加,在将结果存入A1,然后在将6*7的值存为A2,最后将A1和A2相加,并将结果放入A1。那我们可以将这种操作顺序写成这样:4 2*5+6 7*+。这个写法就叫后缀(postfix)或逆波兰(reverse polish)写法。这种写法的在计算机中可以用一个栈来实现:遇见一个数,把他...原创 2018-09-16 00:41:56 · 16237 阅读 · 10 评论