![](https://img-blog.csdnimg.cn/1d781a9eb19a4535bc1b2dcba1abe470.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法
文章平均质量分 75
讲解编程的基础:数据结构与算法
提供常见数据结构、5+查找算法、12+的排序算法、其它常用算法的原理讲解及示例代码
示例代码可以直接使用,可根据实际情况稍微调整下可用。
enjoy编程
Stay hungry, stay foolish.(求知若饥,虚心若愚。)10+IT行业老兵,熟悉大数据处理,分布式编程, 喜欢使用java、python解决工作、生活中的问题
展开
-
DB-GPT:强强联合Langchain-Vicuna的应用实战开源项目,彻底改变与数据库的交互方式
DB-GPT是一个实验性的开源项目,它使用本地化的GPT大型模型与数据和环境进行交互。使用此解决方案,没有数据泄露的风险,数据是100%私密和安全的。DB-GPT使用FastChat创建了一个庞大的模型操作系统,并提供了一个由Vicuna驱动的大型语言模型。此外,还提供了私有领域知识库问答功能、对其他插件的支持、支持Auto-GPT插件。DB-GPT愿景是使围绕数据库和llm构建应用程序变得更容易、更方便。原创 2023-07-25 22:15:00 · 4739 阅读 · 1 评论 -
如何评价一个算法的效率--时空复杂度概念及常用查找、排序算法复杂度
常见的时间复杂度量级有:常数阶O(1): 消耗的时候并不随着某个变量的增长而增长,没有循环等复杂结构, 无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度线性阶O(n): 消耗的时间是随着n的变化呈线性变化,典型的就是循环(for,while)对数阶O(logN): 消耗的时间是随着n的变化呈平方根变化线性对数阶O(nlogN): 将时间复杂度为O(logn)的代码循环N遍的话平方阶O(n²): 把 O(n) 的代码再嵌套循环一遍,如冒泡排序,需要进行交换的次数是 n*原创 2021-11-06 11:17:01 · 936 阅读 · 0 评论 -
spark支持的machine learning 算法汇总及pipelines简介
本文针对spark支持的machine learning 算法进行汇总,并针对各类算法、ml pipeline的使用提供一个简单的入门介绍。machine learning 算法汇总spark支持的machine learning 算法汇总如下机器学习的流程机器学习流程拿到一个机器学习问题时,通常处理的机器学习的流程一般如下:ML PipelinesML Pipelines: 提供了基于DataFrame上统一的高等级API,可以帮助使用者创建和调试机器学习工作流MLlib标准化了用于机原创 2021-11-03 19:26:42 · 553 阅读 · 0 评论 -
查找树--RadixTree【基数树】原理图解及示例代码
基数树概念RadixTree:基数树,或称压缩前缀树,是一种更节省空间的Trie。基数树是Trie的压缩版本【compact version】。在空间利用上更有效Trie因为通常在一条边中只存储1个字符,所以空间利用效率低下。基数树利用了这一点,将在边中存储多个字符/文本字符串,以减少所需的额外边和节点的数量,同时仍然保持相同的表示意义和Trie的性能。在最坏的情况下一个基数树将是一个Trie。基数树示例如下:树操作插入过程注意:如果插入的字符串和已经有边有共同的前缀,则需原创 2021-11-01 17:04:06 · 4979 阅读 · 0 评论 -
查找树-- 基于后缀字典树实现字符串的模式查找
模式查找问题给定文本txt[0…N-1] 和 模式pat[0…M-1],假设是n > m。写一个函数search(char pat[], char txt[]),打印txt[]中所有出现的pat[]如查找一段核苷酸序列的片段在基因组中的位置实现思路基于后缀字典树实现字符串的模式查找查找的时间复杂度为O(m+k),其中m为模式的长度,k为模式在文本中出现的次数如何构建树生成给定字符串的所有后缀。把所有的后缀作为一个字符串,构建Trie示例如下图,如构建字符串banana的后缀字典原创 2021-11-01 20:00:00 · 302 阅读 · 0 评论 -
查找树-- Trie【前缀树】原理图解及示例代码
Trie,即字典树、单词查找树、键树,是一种高效的信息检索数据结构,是一种哈希树的变种。典型应用:用于统计,排序和保存大量的字符串(但不仅限于字符串),经常被搜索引擎系统用于**文本词频统计**。优点:最大限度地减少无谓的字符串比较,查询效率比哈希树高,核心思想:空间换时间。利用字符串的**公共前缀**来降低查询时间的开销以达到提高效率的目的。原创 2021-10-30 10:20:42 · 469 阅读 · 0 评论 -
查找树-- 2-3-4树原理图解及与红黑树的关系
2-3-4 树概念2-3-4 树 是一棵4阶的B树。大体上同B树一样,2-3-4 树是可以用做字典的一种自平衡数据结构。它可以在O(logn)时间内查找、插入和删除,这里的n是树中元素的数目。2-3-4树和红黑树是完全等价的,且性能上并不比红黑树好,由于绝大多数编程语言直接实现2-3-4树会非常繁琐,所以一般是通过实现红黑树来实现替代2-3-4树,而红黑树本也同样保证在O(lgn)的时间内完成查找、插入和删除操作。主要性质所有叶子节点都拥有相同的深度。节点只能是 2-节点、3-节点、4-节原创 2021-10-29 20:30:00 · 692 阅读 · 0 评论 -
查找树-- Red Black Tree 【红黑树】原理图解及示例代码
红黑树概念红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组红黑树是一种特化的AVL树(自平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。但红黑树的左右子树高差有可能大于 1,所以红黑树不是严格意义上的平衡二叉树(AVL),但对之进行平衡的代价较低, 其平均统计性能要强于 AVL Tree。红黑树的插入删除比AVL树更便于控制操作,整体性能略优于AVL树查找时不需要使用颜色信原创 2021-10-28 18:49:17 · 333 阅读 · 0 评论 -
查找树-- Binary Search Tree 【二叉查找树】原理图解及示例代码
1 Binary Search Tree1.1 概念二叉查找树,又称二叉排序树(Binary Sort Tree)定义如下:一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;左、右子树也分别为二叉排序树;没有键值相等的结点。源码示例package org.cloud.algorithm.sort;public class BinarySearchTree<T ext原创 2021-10-27 21:05:37 · 2147 阅读 · 0 评论 -
查找树-- AVLTree 【 自平衡二叉查找树 】 的原理图解及示例代码
1 AVL 树1.1 概念AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它AVL 树 = Adelson-Velsky Landis Tree1.2 AVL原创 2021-10-26 19:58:28 · 492 阅读 · 0 评论 -
经典数据结构与算法面试题总结--持续更新中...
算法如何设计一个高效的企业级Hash表?参考HashMap的设计思路,主要关注点如下:必须高效:插入、删除、查找必须要快,主要考虑性能内存:不能占用太多的内存空间,根据情况,决定是否要采用空间换时间Hash函数: 根据实际情况考虑,如h = key.hashCode() 下标位置是:(h ^ (h>>>16) ) & (capacity-1), 主要考虑降低hash冲突扩容Hash冲突后怎么解决: 开放寻址【线性探测、平方探测】、再Hash、链地址、建立公共溢出原创 2021-10-25 07:25:28 · 252 阅读 · 0 评论 -
B-Tree、B+Tree的异同及用途
产生的背景二叉查找树的查找的时间复杂度是O(log N),查找效率已经足够高,那为什么还有B树和B+树的出现呢?原因是:树和B+树的出现是因为磁盘IO。当在大量数据存储中,二叉查找树查询时不能将所有数据加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点,造成大量磁盘IO操作(最坏情况下为树的高度)。平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。所以,为了减少磁盘IO的次数,就你必须降低树的深度,将“瘦高”的树变得“矮胖”。一个基本的想法就是:每个节点存储多个元素摒原创 2021-07-26 14:51:26 · 628 阅读 · 0 评论 -
LSM Tree介绍及其应用
1. LSM Tree介绍1.1 概念B+树读效率高而写效率差;log型文件操作写效率高而读效率差;因此要在排序和log型文件操作之间做个折中,于是就引入了log-structed merge tree模型,通过名称可以看出LSM既有日志型的文件操作,提升写效率,又在每个sstable中排序,保证了查询效率主要发展阶段如下:LSM-tree起源于 1996 年的一篇论文《The Log-Structured Merge-Tree (LSM-Tree)》,后续发展如下:FAST’16 的《Wis原创 2021-07-26 10:28:34 · 1001 阅读 · 0 评论 -
JAVA集合--解决哈希冲突的寻址算法及代码示例
1. 相关知识1.1. 概念哈希表(Hash table,也叫散列表),是根据Key-value而直接进行访问的数据结构。也就是说,它通过把key映射到表中一个位置【哈希地址】来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希冲突:不同的Key值经过哈希函数Hash(Key)处理以后可能产生相同的值,导致不同的key对应相同的哈希地址,产生冲突1.2. 解决哈希冲突的方法解决哈希冲突常用的两种方法是:开放定址法和链地址法1.2.1. 开放定址法.原创 2021-06-16 17:14:03 · 711 阅读 · 0 评论 -
排序算法--循环排序(CycleSort)的原理、排序思路、适用场景及代码示例
循环排序(CycleSort)概念介绍循环排序是一种原地排序算法,一种不稳定的排序算法,一种比较排序,从对原始数组的总写入次数来看理论上是最优的。它在内存写入数量方面是最优的。它最小化了要排序的内存写入次数【每个值要么被写入0次(如果它已经在正确的位置),要么被写入1次(写到正确的位置)】。排序思路基本思想是将待排序的数组划分为多个循环。循环可以用图表来表示,有n个节点和一条从节点i到节点j的边如果元素在第i下标处必须存在于已排序数组的第j下标处。见如下示意图一个接一个地考虑所有循环。首原创 2021-10-24 08:17:27 · 2343 阅读 · 0 评论 -
排序算法--鸽巢排序(PigeonholeSort)的原理、排序思路、适用场景及代码示例
鸽子洞排序是一种适合于元素列表排序的排序算法,其中元素的数量和可能的键值的数量大致相同。它需要O(n + Range)时间,其中n是输入数组中元素的数量,而’ Range '是数组中可能的值的数量。在数组中查找最小值和最大值。设最小值为“min”,最大值为“max”。也可以找到range为’ max-min+1 '。设置一个初始为空的“鸽子洞”数组,其大小与范围相同。访问数组中的每个元素,然后将每个元素放到它的鸽子洞中。一个元素arr[i]被放入索引arr[i] - min的洞中。按顺序在所有鸽子原创 2021-10-20 20:38:52 · 2579 阅读 · 0 评论 -
排序算法--梳排序(CombSort)的原理、排序思路及代码示例
梳排序(CombSort)概念介绍梳排序(CombSort):是一种由Wlodzimierz Dobosiewicz于1980年所发明的不稳定排序算法,并由Stephen Lacey和Richard Box于1991年四月号的Byte杂志中推广。梳排序是改良自泡沫排序和快速排序,其要旨在于消除乌龟,亦即在阵列尾部的小数值,这些数值是造成泡沫排序缓慢的主因。相对地,兔子,亦即在阵列前端的大数值,不影响泡沫排序的效能。冒泡排序总是比较相邻的值。所以一次交换中只能删除一个逆序计数。梳式排序通过使用大于1原创 2021-10-20 20:37:35 · 857 阅读 · 1 评论 -
排序算法--希尔排序(ShellSort)的原理、排序思路、适用场景及代码示例
希尔排序(ShellSort)概念介绍希尔排序(ShellSort): 是插入排序的变种,又称缩小增量排序(Diminishing Increment Sort), 是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。希尔排序是基于插入排序的以下两点性质而提出改进方法的,通过减少了其复制的次数,提高排序效率插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。但插入排序一般来说是低效的,因为插入排序原创 2021-10-20 20:36:24 · 2427 阅读 · 0 评论 -
排序算法--桶排序(BucketSort)的原理、排序思路、适用情况及代码示例
桶排序(BucketSort)概念介绍桶排序主要适用于输入均匀分布在一个范围内的情况。例如:对范围从0.0到1.0并且均匀分布在整个范围内的大量浮点数,如何进行高效地排序?使用基于比较的排序算法?基于比较排序算法的下界(合并排序,堆排序,快速排序…等)是Ω(nLogn),也就是说,他们不能做得比nLogn更好。使用计算排序?计数排序在这里不能应用,因为在计数排序中使用键作为索引,但这里的键是浮点数。针对这种情况,可以使用桶排序。桶排序(BucketSort) 是计数排序的扩展版本,计数排原创 2021-10-20 20:35:39 · 1782 阅读 · 0 评论 -
排序算法--基数排序(RadixSort)的原理、排序过程及代码示例
基数排序(RadixSort)概念介绍基于比较排序算法的下界(合并排序,堆排序,快速排序…等)是Ω(nLogn),也就是说,他们不能做得比nLogn更好。计数排序是一种线性时间排序算法,当元素在1到k的范围内时,以O(n+k)时间排序。如果元素在1到n2的范围内呢?这种情况不能使用计数排序,因为计数排序将花费O(n2),这比基于比较的排序算法更差。如何在线性时间内对这样一个数组进行排序呢?基数排序(RadixSort)能解决此问题。基数排序的思想是从最低有效位数到最高有效位数逐个数字排序。基原创 2021-10-20 07:22:11 · 1005 阅读 · 0 评论 -
排序算法--计数排序(CountSort)的原理、排序过程、注意点及代码示例
计数排序(CountSort)概念介绍计数排序是一个不是基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。计数排序是一种基于特定范围内的键的排序技术。它的工作原理是计算具有不同键值的对象的数量(类似于散列)。然后做一些算术来计算每个对象在输出序列中的位置。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如基于比原创 2021-10-19 16:09:38 · 880 阅读 · 0 评论 -
排序算法--堆排序(HeapSort)的原理、优点、应用及代码示例
堆排序(HeapSort)基本概念堆排序是一种基于二叉堆(binary heap)数据结构的基于比较的排序技术。它类似于选择排序,先找到最小的元素,然后把最小的元素放在最开始, 然后对其余元素重复相同的过程。堆的介绍详见数据结构–Heap介绍及Java代码的实现示例由于二叉堆是一棵完整的二叉树,所以它可以很容易地表示为数组,而基于数组的表示方式非常节省空间。如果父节点存储在索引I,左边的子节点可以用2 * I + 1计算,右边的子节点可以用2 * I + 2计算(假设索引从0开始)。堆排序是一种i原创 2021-10-19 11:06:19 · 1624 阅读 · 0 评论 -
排序算法--快速排序(QuickSort)、 3区快速排序(3 Way QuickSort)原理、适用场景及代码示例
快速排序概念介绍QuickSort快速和归并排序一样,是采用分治法解决问题的一个典型应用。它选择一个元素作为基准元素,并围绕选定的基准元素对给定数组进行分区。quickSort有很多不同的版本,它们以不同的方式选择基准元素。选择第一个元素作为基准元素。选择最后一个元素作为基准元素选择一个随机元素作为基准元素选择中值作为基准元素QuickSort中的关键进程是partition()。目标分区:给定一个数组和数组的一个元素x作为基准元素,将x放在已排序数组中正确的位置,并将所有较小的元素(原创 2021-10-18 17:15:30 · 799 阅读 · 0 评论 -
排序算法--归并排序(MergeSort)原理、适用场景及代码示例
集合排序算法归并排序和快速排序一样,归并排序也是一种分治算法。它将输入数组分成两半,为这两半调用自己,然后合并已排序的两半。merge函数的作用是合并两个部分。合并merge(arr, l, m, r)是一个关键过程,它假设arr[l…m] 和 arr[m+1…r] 已经排好序,并将两个已排序的子数组合并为一个。分治【 Divide and Conquer 】算法介绍Divide : 将问题划分为更小的子问题。Conquer: 通过递归调用来解决子问题,直到解决为止。combine 或 mer原创 2021-10-18 15:15:04 · 3298 阅读 · 0 评论 -
排序算法--冒泡排序、选择排序、稳定的选择排序、插入排序、折半插入排序原理介绍及代码示例
冒泡排序最简单的排序算法,它通过重复比较相邻元素,如果它们的顺序错误,则交换位置选择排序算法从未排序部分反复寻找最小元素(考虑升序),并将其放在数组的开头。该算法在给定数组中维护两个子数组。已经排序的子数组。剩余未排序的子数组。在选择排序的每次迭代中,从未排序的子数组中选取最小元素(考虑升序)并移动到已排序的子数组中。O(n2) as there are two nested loops.插入排序插入排序是一种简单的排序算法,工作原理类似于对手中的扑克牌进行排序。数组实际上被分成了已排原创 2021-10-17 12:00:41 · 306 阅读 · 1 评论 -
查找算法--跳跃查找(JumpSearch)、插值查找、指数查找及无界二分查找原理介绍及源码示例
集合查找算法Jump Search 跳点查找原理介绍和二分查找类似,跳点查找也是一种排序数组的查找算法。基本思想是通过 向前跳过固定个元素【跳过的块】 达到检查更少的元素的目的,注意:不是线性查找,不需要查找所有元素。集合必须排序时间复杂度在 线性查义 和 二分查找之间二分查找比跳点查找性能更好,但跳点查找有一个优势,即只返回一次(二分查找可能需要最多O(Log2n)次跳转,考虑要查找的元素是最小的元素或比最小的元素更小的情况)。所以在二分查找代价高昂的系统中,可以使用跳点查找例如假设原创 2021-10-15 16:44:19 · 964 阅读 · 0 评论 -
查找算法--线性查找、二分查找和三分查找的原理及适用场景
集合查找算法线性查找特征:从第一个元素开始,采用逐个比较的方式进行查询,类似下图前提:没有限制使用场景:大部分场景,但性能低时间复杂度: O(n)二分查找特征:每次取中点进行判断,待查找集合减半;线性函数;不断逼近前提:集合必须有序适用场景:大部分场景实现原理: 对于一个有序序列,每次选择中间的那个元素,与欲找出的元素进行比较,若比该元素大,则查找范围变为序列的前一半;反之,若中位元素比查找元素小,则将下一次的查找范围变为序列的后一半;若中位元素与想要查找的元素相等,返回中位元素在序列原创 2021-10-15 14:04:41 · 1259 阅读 · 0 评论 -
数据结构--Heap介绍及Java代码的实现示例
Heap 堆介绍概念堆是一种特殊的基于树的数据结构,其中树是一个完整的二叉树。一般来说,堆可以有两种类型:Max-Heap 大顶堆: 在Max-Heap中,根节点上的键必须是所有子节点上的键中最大的。同样的属性必须递归地适用于该二叉树中的所有子树。Min-Heap 小顶堆: 在Min-Heap中,根节点上的键必须是它所有子节点上的键中最小的。同样的属性必须递归地适用于该二叉树中的所有子树堆的特点堆满足如下性质:参见heap-data-structure堆是一棵完全二叉树, 也被称为二叉原创 2021-10-14 11:55:34 · 429 阅读 · 0 评论 -
层次分析法(AHP)及源代码实现
1 层次分析法简介1.1 概念层次分析法(Analytic Hierarchy Process,AHP):是一种定性和定量相结合的、系统的、层次化的分析方法。这种方法的特点就是在对复杂决策问题的本质、影响因素及其内在关系等进行深入研究的基础上,利用较少的定量信息使决策的思维过程数学化,从而为多目标、多准则或无结构特性的复杂决策问题提供简便的决策方法。是对难以完全定量的复杂系统做出决策的模型和方法。1.2 原理层次分析法的原理:层次分析法根据问题的性质和要达到的总目标,将问题分解为不同的组成因素,并原创 2021-08-19 18:51:06 · 3132 阅读 · 0 评论