
数据结构和算法
数据结构和算法学习笔记
码农奥德彪
看似我拉了无数次代码,其实是代码拉了无数次我的生活
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
二叉树详解-Java实现二叉树数据结构
树的由来我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是 想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据 项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据 也是。然后我们介绍了另外一种数据结构——链表,链表的插入和删除很快,我们只需要改变一些引用值 就行了,但是查找数据却很慢了,因为不管我们查找什么数据,都需要从链表的第一个数据项开始,遍 历到找到所需数据项为止,这个查找也是平均需要比较N/2次。那么原创 2020-08-26 16:01:31 · 1848 阅读 · 0 评论 -
链表-Java实现链表数据结构
链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向上 一个/或下一个节点的位置的链接(“links”)链表(Linked list):是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数 据,而是在每一个节点里存到下一个节点的指针(Pointer)。使用链表结构可以克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较.原创 2020-06-08 19:08:07 · 2684 阅读 · 0 评论 -
分治法思想递归解决汉诺塔问题
分治思想当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。汉诺塔问题汉诺塔问题是由很多放置在三个塔座上的盘子组成的一个古老的难题。如下图所示,所有盘子的直 径是不同的,并且原创 2020-06-08 18:43:13 · 1313 阅读 · 0 评论 -
LRU算法缓存淘汰策略
LRU算法是什么?按照英文的直接原义就是Least Recently Used,最近最久未使用法,它是按照一个非常著名的计算机操作系统基础理论得来的:最近使用的页面数据会在未来一段时期内仍然被使用,已经很久没有使用的页面很有可能在未来较长的一段时间内仍然不会被使用基于这个思想, 会存在一种缓存淘汰机制,每次从内存中找到最久未使用的数据然后置换出来,从而存入新的数据!它的主要衡量指标是使用的时间,附加指标是使用的次数。在计算机中大量使用了这个机制,它的合理性在于优先筛选热点数据,所谓热点数据,就是最近最原创 2020-05-29 14:53:30 · 2024 阅读 · 1 评论 -
分布式唯一Id:snowflake雪花算法
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0为什么使用snowflake?其实呢如果只是想保证分布式id的唯一性,那么使用UUID是完全可以没问题的,UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,它是由以太网卡地址、原创 2020-05-28 18:21:40 · 3102 阅读 · 0 评论 -
BitMap算法及实现点赞功能
BitMap简介bitmap听起来是位图的意思,其实就一种基于位的映射,bitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此可以大大节省存储空间。为什么要使用bitmap?举个例子,有一个无序有界int数组{1,2,5,7},初步估计占用内存44=16字节,这倒是没什么奇怪的;但是假如有10亿个这样的数呢,10亿4/(102410241024)=3.72G左右。如果这样的一个大的数据做查找和原创 2020-05-27 16:35:30 · 2511 阅读 · 2 评论 -
队列-Java实现队列数据结构
1、队列的基本概念队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一...原创 2020-03-18 18:05:37 · 1355 阅读 · 0 评论 -
栈-Java实现栈数据结构
1、栈的基本概念栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操...原创 2020-03-18 17:40:11 · 893 阅读 · 0 评论 -
插入排序
插入排序1、从数组第2个元素开始抽取元素。2、把它与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边。3、继续选取第3,4,….n个元素,重复步骤 2 ,选择适当的位置插入如图所示:代码如下: /** * 插入排序 */ @Test public void insertSo...原创 2020-02-27 16:33:47 · 1354 阅读 · 0 评论 -
选择排序
选择排序首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法我们称之为选择排序,其实总结就是每一轮只进行一次交换,每一轮的多次比较是记录最小值的下标索引如图所示:代码如下/** *选择排序 */ ...原创 2020-02-27 16:27:00 · 1326 阅读 · 0 评论 -
冒泡排序
冒泡排序把第一个元素与第二个元素比较,如果第一个比第二个大,则交换他们的位置。接着继续比较第二个与第三个元素,如果第二个比第三个大,则交换他们的位置….我们对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样一趟比较交换下来之后,排在最右的元素就会是最大的数。除去最右的元素,我们对剩余的元素做同样的工作,如此重复下去,直到排序完成如图所示:代码如下: /** ...原创 2020-02-27 16:17:52 · 1177 阅读 · 0 评论 -
算法时间复杂度
算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,比如排序就有前面的十大经典排序和几种奇葩排序,虽然结果相同,但在过程中消耗的资源和时间却会有很大的区别,比如快速排序与猴子排序:)。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是指执行当前算法所消耗...原创 2020-02-26 23:16:36 · 1382 阅读 · 0 评论