数据结构与算法
文章平均质量分 91
Archie_java
求知若饥,虚心若愚(stay hungry,stay foolish)
好记性不如烂笔头
展开
-
数据结构与算法学习笔记
散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。原创 2023-10-08 21:48:00 · 265 阅读 · 0 评论 -
LinkedBlockingDeque详解,源码,原理和常用方法,使用场景介绍
【1】一个链表阻塞双端无界队列,可以指定容量,默认为 Integer.MAX_VALUE【2】数据结构:链表(同LinkedBlockingQueue,内部类Node存储元素)【3】锁:ReentrantLock(同ArrayBlockingQueue)存取是同一把锁,操作的是同一个数组对象【4】阻塞对象(notEmpty【出队:队列count=0,无元素可取时,阻塞在该对象上】,notFull【入队:队列count=capacity,放不进元素时,阻塞在该对象上】)原创 2023-06-03 17:40:39 · 755 阅读 · 0 评论 -
Java并发容器LinkedBlockingDeque、ArrayBlockingQueue、DelayQueue、LinkedTransferQueue、SynchronousQueue
* —这样服务器支持并发的量会大一点,所以LinkedTransferQueue是用在更高得并发的情况下。 * --是一种特殊的transferQueue,里面装的任何东西都必须立刻交给消费者去消费。* 无界队列,塞进去的数据有规定的时间在什么时候才可以取,默认是排好顺序的,等待时间最长的排在前面,先往外拿。 * 生产者送来的产品,消费者必须马上消费掉,如果不消费会出问题。*有界队列,在线程池里装的就是一个一个的任务。* 实现生产者消费者。原创 2023-06-03 00:52:23 · 163 阅读 · 0 评论 -
[内排序]八大经典排序合集
所谓排序,就是整理表中的元素,使之按关键字递增或递减的顺序排列。(1)若 n 较小(如 n原创 2022-11-21 17:54:27 · 764 阅读 · 0 评论 -
时间复杂度和空间复杂度的计算方法
既然算法是解决问题的描述,那么就像一千个人眼中有一千个阿姆雷特他大姨夫一样,解决同一个问题的办法也是多种多样的,只是在这过程中我们所使用/消耗的时间或者时间以外的代价(计算机消耗的则为内存了)不一样。该程序段中频度最大的语句是(5),内循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量取值有关,而最外层循环的次数直接与n有关,因此可以从内层循环向外层分析语句(5)的执行次数: 则该程序段的时间复杂度为T(n)=O(n3/6+低次项)=O(n3)此类算法的时间复杂度是O(1)。原创 2022-09-21 23:23:35 · 266 阅读 · 0 评论 -
Common Sort - 排序 - Java
文章目录排序概念稳定性(重要)应用 - 举例1.、各大商城的价格从低到高等2、中国大学排名常见的排序算法(8 种)- 总览直接插入排序模拟实现 - 插入排序稳定性分析结论希尔排序思考原理科学家的分组思维模拟实现 - 希尔排序总结选择排序直接选择排序 - 原理优化代码如下附图双向选择排序 (了解)代码如下堆排序代码冒泡排序代码如下 - 未优化代码优化思维代码如下 - 优化未优化 和 优化代码 运行速度比较快速排序 - 重点原理总结程序框架完善 partition 部分代码细节部分总程序 - 未优化快速排序 的转载 2022-02-27 10:37:26 · 198 阅读 · 0 评论 -
五大常用算法学习笔记
一、分治算法:快速排序、归并排序、大整数乘法、二分查找、递归(汉诺塔)基本概念:把一个复杂的问题分成若干个相同或相似的子问题,再把子问题分成更小的子问题… , 知道最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。看上去有点类似Fork/Join框架,或map-reduce。排序算法中的快速排序、归并排序都是使用的分治算法。分治算法的适用场景:1)当问题规模缩小到一定的程度就可以很容易解决2)该问题可以分解为若干个规模较小的相同问题3)该问题分解出的若干子问题的解可以合并为该问原创 2021-12-30 23:57:13 · 376 阅读 · 0 评论 -
史上最全的五大算法总结
分治算法一、基本概念在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当n=1时,不需任何计算。n=2时,只要作一次比较即可排好序。n=3时只要作3次比较即可,…。而当n较大时,问题就不那原创 2021-12-31 00:02:32 · 409 阅读 · 0 评论 -
十大经典排序算法动画与解析(配代码完全版)
排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:关于时间复杂度:平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;O(n1+原创 2021-10-01 17:32:15 · 404 阅读 · 0 评论 -
java实现简单二叉树
二叉树基本知识:一、树的定义树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。树具有的特点有:(1)每个结点有零个或多个子结点(2)没有父节点的结点称为根节点(3)每一个非根结点有且只有一个父节点(4)除了根结点外,每个子结点可以分为多个不相交的子树。树的基本术语有:若一个结点有子树,那么该结点称为子树根的“双亲”,子树的根称为该结点的“孩子”。有相同双亲的结点互为“兄弟”。一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点的路径上的所有结原创 2021-10-01 17:21:11 · 336 阅读 · 0 评论 -
十分钟搞定时间复杂度(算法的时间复杂度)
十分钟搞定时间复杂度(算法的时间复杂度)我们假设计算机运行一行基础代码需要执行一次运算。int aFunc(void) { printf("Hello, World!\n"); // 需要执行 1 次 return 0; // 需要执行 1 次}那么上面这个方法需要执行 2 次运算int aFunc(int n) { for(int i = 0; i<n; i++) { // 需要执行 (n + 1) 次 pr原创 2021-10-01 15:41:25 · 355 阅读 · 1 评论 -
时间复杂度到底怎么算
时间复杂度到底怎么算算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂原创 2021-10-01 15:34:04 · 3103 阅读 · 0 评论 -
红黑树 —— 原理和算法详细介绍
红黑树 —— 原理和算法详细介绍R-B Tree简介R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树的特性:每个节点或者是黑色,或者是红色。根节点是黑色。每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]如果一个节点是红色的,则它的子节点必须是黑色的。从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点原创 2021-10-01 11:13:40 · 310 阅读 · 0 评论 -
平衡二叉树
一、AVL树简介AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。一棵AVL树有如下必要条件:条件一:它必须是二叉查找树。条件二:每个节点的左子树和右原创 2021-09-29 21:11:29 · 307 阅读 · 0 评论 -
深入学习二叉树(四) 二叉排序树
深入学习二叉树(四) 二叉排序树1 前言数据结构中,线性表分为无序线性表和有序线性表。无序线性表的数据是杂乱无序的,所以在插入和删除时,没有什么必须遵守的规则,可以插入在数据尾部或者删除在数据尾部。但是在查找的时候,需要遍历整个数据表,导致无序线性表的查找效率低。有序线性表的数据则相反,查找数据时的时候因为数据是有序的,可以用二分法、插值法、斐波那契查找法来实现。但是,当进行插入和删除操作时,需要维护表中数据的有序性,会耗费大量的时间。那么,我们希望找到一种数据结构,既可以有较高的插入和删除效率,原创 2021-09-29 00:04:41 · 334 阅读 · 0 评论 -
深入学习二叉树(三) 霍夫曼树
深入学习二叉树(三) 霍夫曼树1 前言霍夫曼树是二叉树的一种特殊形式,又称为最优二叉树,其主要作用在于数据压缩和编码长度的优化。2 重要概念2.1 路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。图2.1所示二叉树结点A到结点D的路径长度为2,结点A到达结点C的路径长度为1。2.2 结点的权及带权路径长度若将树中结点赋给一个有着某种含义的数值,则这个数值称为原创 2021-09-28 23:57:10 · 1588 阅读 · 0 评论 -
深入学习二叉树(二) 线索二叉树
深入学习二叉树(二) 线索二叉树1 前言在上一篇简单二叉树的学习中,初步介绍了二叉树的一些基础知识,本篇文章将重点介绍二叉树的一种变形——线索二叉树。2 线索二叉树2.1 产生背景现有一棵结点数目为n的二叉树,采用二叉链表的形式存储。对于每个结点均有指向左右孩子的两个指针域,而结点为n的二叉树一共有n-1条有效分支路径。那么,则二叉链表中存在2n-(n-1)=n+1个空指针域。那么,这些空指针造成了空间浪费。例如:图2.1所示一棵二叉树一共有10个结点,空指针^有11个。此外,当对二叉树进行原创 2021-09-28 23:51:35 · 369 阅读 · 0 评论 -
深入学习二叉树(一) 二叉树基础
深入学习二叉树(一) 二叉树基础前言树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。一直以来,对于树的掌握都是模棱两可的状态,现在希望通过写一个关于二叉树的专题系列。在学习与总结的同时更加深入的了解掌握二叉树。本系列文章将着重介绍一般二叉树、完全二叉树、满二叉树、线索二叉树、霍夫曼树、二叉排序树、平衡二叉树、红黑树、B树。希望各位读者能够关注专题,并给出相应意见,通过系列的学习做到心中有“树”。1 重点概念1.1 结点概念结点是数据结构中的基础,是构成复杂数据结构的基本组成单位。1.2原创 2021-09-28 23:43:27 · 356 阅读 · 0 评论