
用Python与Java开启算法的神奇之旅
文章平均质量分 75
前期写的是作者看Python算法的奇妙之旅的感悟,部分内容会引用书上原文,其中的算法案例会方便分别以Java、Python来实现。
会分别介绍算法、数据结构、时间复杂度等基础概念,以及十大排序算法,让读者对算法有一个基础概念,后面分别介绍遍历法、迭代法、递归法、回溯法、贪心法和分治法6种算法思想。
忆梦九洲
我们妄想吃掉太阳
展开
-
数字的魅力之卓绝罕有的完美数
我们都知道,6是“溜”的谱音,用于表达人们对于超常能力的感叹。但许多人不知道的是,6也是罕有的完美数!所谓完美数,又称完全数或完备数,它的所有真因子(除了自身以外的约数)之和必须恰好等于它本身。612328124714完美数是一种极其特殊及罕有的自然数,目前仅仅发现了51个。而我们这一篇文章的任务正是输出 1000 以内的所有完美数。原创 2024-02-28 17:20:49 · 1419 阅读 · 0 评论 -
数字的魅力之情有独钟的素数
素数(Prime number)也称为质数,是指在非0自然数中,除了1与其本身之外不拥有其他因数的自然数。原创 2024-02-15 22:38:59 · 1344 阅读 · 0 评论 -
小结与数字的魅力的开篇
通过本系列的学习,我们深入了解了各种排序算法,并了解了它们的思路、时间复杂度和空间复杂度。尽管排序算法本身并不难,但涉及的知识点却广泛而复杂,需要我们不断思考和练习。在接下来的学习中,我们将进一步探索算法的实际应用。通过以实例为基础的讲解,我们将学会使用算法解决实际问题,让学习变得更加有趣且具有实用性。下一个系列以“数字的魅力”为主题,将围绕数字展开讲解。数字作为数学的基础,是想象和灵感的来源,是建立在公理和逻辑上的有趣事实的集合。虽然数字只是简单的符号,但它们构成了一个美妙的“通天塔”,让人陶醉其中。原创 2024-02-14 21:06:24 · 1030 阅读 · 0 评论 -
线性时间非比较类排序之基数排序
基数排序是桶排序的扩展,因此又称“桶子法”,它是通过键值的部分信息,将要排序的元素分配至某些“桶”中,以达到排序的作用。原创 2024-02-12 20:56:48 · 845 阅读 · 0 评论 -
线性时间非比较类排序之桶排序
桶排序也叫箱排序,1956年便开始使用,它可以算是计数排序的一个改进版本。原创 2024-02-08 14:05:11 · 1583 阅读 · 0 评论 -
线性时间非比较类排序之计数排序
计数排序由 HaroldH.Seward 于1954年提出,它是一种非基于比较的排序算法,通过辅助数组来确定各元素的最终位置。因为在排序过程中不存在元素之间的比较和交换操作,所以当待排序数组为整数且数组内数据的范围较小时,其优势是十分明显的。原创 2024-02-07 14:42:09 · 1091 阅读 · 0 评论 -
十大排序算法之线性时间非比较类排序
线性时间比较类排序算法具有高效的执行效率和较低的时间复杂度,适用于处理大规模数据集的排序任务。它们以空间换时间的策略,在一定的限制和要求下,能够快速有效地完成排序操作。然而,需要根据待排序数据的特点来选择合适的算法,以充分发挥线性时间比较类排序算法的优势。原创 2024-02-05 21:55:33 · 1179 阅读 · 0 评论 -
十大排序算法之归并排序
归并排序是包含归并思想的排序方法,它是分治法(Divide and Conquer)的一个典型应用。所谓分治,即将问题“分”(Divide)为更小的问题进行递归求解,再将得到的各个递归结果合并在一起,达到“治”(Conquer)问题的目的,也称“分而治之”。“分”的阶段可一分为二、一分为三⋯⋯,据此我们也将归并排序分为二路归并、三路归并⋯,此处以二路归并为例进行讲解。原创 2024-02-04 23:19:15 · 805 阅读 · 0 评论 -
十大排序算法之堆排序
在简单选择排序文章中,简单选择排序这个“铁憨憨”只顾着自己做比较,并没有将对比较结果进行保存,因此只能一遍遍地重复相同的比较操作,降低了效率。针对这样的操作,Robertw.Floyd 在1964年提出了简单选择排序的升级版——堆排序方法。堆是什么呢?堆是用数组实现的已标号的完全二叉树。原创 2024-02-03 23:42:43 · 1164 阅读 · 0 评论 -
数与抽象之负数和分数
在数学中,减法和除法相对于加法和乘法更具挑战性。然而,通过引入抽象的数学模型,我们可以更好地理解和解释减法和除法的概念。减法可以通过解方程的方式来理解,即找出与给定数相加得到零的数。类似地,除法可以通过解方程的方式来理解,即找出与给定数相乘得到另一个给定数的数。然而,向孩子们解释减法和除法的困难之一是它们并不总是可行的操作,例如从较小的数中减去较大的数,或将一定数量的物品平均分给不等数量的人。为了解决这个问题,我们引入了负数和分数这两个概念,将它们视为数学运算的工具。原创 2024-02-02 21:41:19 · 1092 阅读 · 0 评论 -
十大排序算法之简单选择排序
选择类排序的思想很简单,每次从待排序数据中选择最小的一个放到最前面,直到把所有数据都遍历完,简单选择持排序和直接插入排序一样,“直男”一个,做事踏实、认真,有条有理,但总让人觉得有些死板。原创 2024-02-02 17:17:42 · 483 阅读 · 0 评论 -
十大排序算法之希尔排序
希尔(音同 Shell)排序,也叫缩小增量排序,它通过将原始列表分解多个子列表来改进插入排序。虽然它叫希尔排序,但和命令解析器 Shell 不是一回事,只是因为该算法是由 D.L.shell 提出的而已。原创 2024-02-01 20:38:45 · 1130 阅读 · 0 评论 -
十大排序算法之直接插入排序
前面文章已经讲完了交换类排序,接下来开始学习插入类排序。顾名思义,所谓插入排序指我们会为每一个数据安排一个适合它的位置并将其插入,直到所有数据就位则排序完成。直接插入法便是插入排序的典型方法,完全继承了插入排序的“脾气”:简单、粗暴,逮到就插入,毫无技术可言,耿直得可爱。原创 2024-01-31 22:20:10 · 1469 阅读 · 0 评论 -
十大排序算法之快速排序
快速排序也称为分区交换排序,它采用的是分治思想,是冒泡排序的改良版。冒泡排序需要进行比较并交换的次数较多,因为它是在两个相邻数据之间进行比较并交换的操作,每次只能移动一个位置,而快速排序是在两个分区之间进行比较并交换的操作。原创 2024-01-29 22:55:09 · 1085 阅读 · 0 评论 -
十大排序算法之冒泡排序
冒泡排序是最基础的排序算法之一,但它并不是最优的排序算法。原创 2024-01-28 23:45:29 · 1303 阅读 · 0 评论 -
十大排序算法之非线性时间比较类排序
接下来就开始我们的算法学习之路了,代码会分别使用Java与Python来实现,数据处理的算法很多,排序是最基础且最重要的一类,大多数人都是通过学习排序算法入门的。接下来让我们一起学习闻名遐迩的十大排序算法,它们分别是冒泡排序、快速排序、直接插入排序、希尔排序、简单选择排序、堆排序、归并排序、计数排序、桶排序和基数排序。这十大排序算法可以大致为两类:非线性时间比较类排序和线性时间非比较类排序,如下图所示。所谓线性时间并不是“按照时间顺序讲述故事”的方式,而是与时间复杂度相关的词条。原创 2024-01-28 23:03:35 · 566 阅读 · 0 评论 -
数据结构总结
这里再补充一点:树和图都有更高阶的“玩法”,那就是加权——为每条路径加上权值,然后就变为加权树和加权图了。最后我们对数据结构做一个总结,如下图所示。数据结构系列的文章从基本数据类型到数据结构,涵盖整型、布尔值、字符串、列表、元组、字典、集合、堆、栈、链表、树和图,以及队列和环等相关内容。读者一定要理清各存储结构的异同之处和它们之间的关联,这样也算没有辜负作者的良苦用心了。原创 2024-01-27 17:57:05 · 543 阅读 · 0 评论 -
数据结构之图
图(Graph)是比树还要难以理解和学习的“多对多”数据结构,可以认为树也是图的一种。图的知识点众多,按照存储路径的方向分,可分为无向图和有向图,按照图的存储结构分,可分为完全图与有向完全图、连通图与强连通图、连通分量与强连通分量、无环图与有向无环图,其涉及的算法则包括克鲁斯卡尔算法、普里姆算法、迪杰斯特拉算法和弗洛伊德算法等。如下图所示为图的分类。原创 2024-01-26 18:17:47 · 1444 阅读 · 0 评论 -
数据结构之树
前面文章讲的线性表,不论数组还是链,都是“一对一”的关系,本文章节让我们来认识一下“一对多”关系的数据结构——树(Tree)。树结构分为二叉树和三叉树等,如下图所示。常用的就是二叉树,因此本节以二叉树为主要介绍对象,二叉树之外的树结构暂且统称为非二叉树。树在数据结构中占据重要的地位。对于树结构的学习其实不难,先了解它的概念和性质,然后结合图示去理解,最后亲自动手实现其功能,按照这样的思路去学习,一定可以轻松掌握。注意:一棵树的度,是树内各节点的度的最大值。原创 2024-01-25 12:23:19 · 1624 阅读 · 0 评论 -
数据结构之受限线性表
对于一般线性表,虽然必须通过遍历逐一查找再对目标位置进行增、删和查操作,但至少一般线性表对于可操作元素并没有限制。说到这里,大家应该明白了,所谓的受限线性表,就是可操作元素受到了限制。受限线性表可分为栈(Stack)和队列(Queue),如下图所示,这是比较特珠但很重要的数据结构,一定要掌握。原创 2024-01-24 16:44:27 · 1167 阅读 · 0 评论 -
数据结构之线性表(一般的线性表)
接下来就开始正式进入数据结构环节了,我们先从线性表开始。原创 2024-01-23 16:12:45 · 1258 阅读 · 0 评论 -
数据结构之小结
鉴于前几篇文章所讲的基础内容的重要性,这里再次总结一下几个易混淆的知识点。以上就是几篇文章里最重要的知识点,一定要记住这几点,在以后Python的使用中,根据自己的需求来选择数据类型并进行转化,这样才能实现极优的算法。原创 2024-01-20 16:48:00 · 671 阅读 · 0 评论 -
数据结构之set类
这个类很特别,它是唯一坚决追求“特立独行”的数据类型。在这里,你没办法找到两个一样的值,即使强硬赋予,它也会强硬剔除,也就是去重,一个非常实用的技能,这也是 set 类存在的最大意义。由于 set 类与dict 类一样也使用大括号作为标识符,所以当我们创建一个空集合时必须用 set()而不是{},因为{}用于创建一个空字典。我们发现,两个0不见了一个,确实去重了,而且输出结果是无序的。set 类还是无序的,不像列表和元组那般可以下标指定,同时,set 类的元素需要是不可变类型,就和字典的键一样。原创 2024-01-20 15:55:35 · 496 阅读 · 0 评论 -
数据结构之dict类
在Python 的dict类里,索引就是“键”,对象也叫“值”,二者合起来就叫“键值对”。每个“键值对”之间用逗号(,)隔开,每个“键”和“值”之间用冒号(:)隔开,“键”与“值”之间一 一对应。字典还有fromkeys()、update()等很多十分实用的内置方法,字典还有一个好的特性,就是检索字典的效率非常快,像列表、元组根本不能和它相比,因为字典是一对一检索的,也就是时间复杂度为O(1)。相比之下,列表的时间复杂度则更复杂一些,如下表所示。而“值”是可以随意改变的,也就意味着它可以是任意的数据类型。原创 2024-01-18 09:55:53 · 813 阅读 · 0 评论 -
数据结构之tuple类
tuple 是元组类。tuple 就很有意思了,它和上一篇文章介绍的list 十分相似,都是线性表。最大的不同就是list 可以改变,而tuple 是不可变的。元组就像是列表的补充,我们甚至可以这么理解:元组就是只读的列表。原创 2024-01-17 10:27:07 · 500 阅读 · 0 评论 -
数据结构之list类
list是列表类。从list 类开始,我们就要接触独属于 Python 的数据类型了。Python 简单、易用,很大一部分原因就是它对基础数据类型的设计各具特色又相辅相成。话不多说,让我们开始学习第一个 Python 数据类型一list。list是Python中的一种数据类型,它是有序的并且可以修改。与str类相似,list也具有一些特点,如赋值和索引。通过赋值,我们可以创建一个列表,并在其中存储多个元素。列表中的元素可以是任何类型的数据,包括数字、字符串和其他列表等。原创 2024-01-16 18:16:31 · 673 阅读 · 0 评论 -
数据结构之str类
方法总比困难多。不过在大多时候我们不会用到上面的这些函数,因此这里就不一 一展开讲解了,有兴趣的读者可以自学。原创 2024-01-15 17:02:06 · 3346 阅读 · 0 评论 -
数据结构之bool类
bool 是布尔类。它是最简单的一个类,其取值有两种,1和O,即 True 和 False。可以这样简单地理解,除了1和0以及 True 和 False 的情况之外,但凡有值(非空)即为真,但凡无值(空)即为假。虽说1和0也是 True和 False 的意思,但并不代表赋值为0的test值是bool类,例如下面的输入和输出。如果要用0和1为bool赋值,也不是没有办法,让我们继续往下看。原创 2024-01-14 17:16:22 · 1099 阅读 · 0 评论 -
数据结构之int类
在其他语言中,数字类有很明细的区分,如 int(整型)、unsigned int(无符号整型)、short(短整型)、long(长整型)、longlong(长长整型)、float(单精度浮点型)和 double(双精度浮点型)等。这些类所占用的字节(byte)和内存(memory)均不同,甚至在不同的操作系统上也有细微差异,但在Python 中它们都被称为 int,这样省去了许多类似内存溢出的麻烦。原创 2024-01-13 12:58:33 · 650 阅读 · 0 评论 -
数据结构之基本数据类型(Python)
接下来我们将会先学习Python 的基本数据类型,以及堆、栈、链表、树和图等数据结构,这是学习算法的基础。套用行业内的一句话:数据结构是算法的骨骼。数据结构是一门庞大的学科,远不是一本书就可以讲清楚的。如果想更深入地学习,可以参考类似《数据结构教程》等专门讲解数据结构的书籍。Java的数据类型我准备放在Java专栏进行讲解,不过不影响后面的算法使用Java与Python一起讲解,接下来让我们先学习 Python的数据类型。数据结构是算法的骨骼,是指彼此存在关系的数据的集合。原创 2024-01-12 14:21:26 · 649 阅读 · 0 评论 -
何为算法之算法趣闻
算法的复杂度计算是否让你觉得备受打击?请放轻松,让我们来聊一些算法的有趣事情吧。2016年3月,Google 的人工智能程序 AlphaGo 以4:1的总比分战胜职业九段棋手李世石,从而震惊了世界。紧接着,AIphaGo又横扫中韩围棋高手,60局无一败绩!2017年5月,中国乌镇围棋峰会迎来了历史性的一刻—AIphaGo和围棋世界冠军柯洁的对弈。万众瞩目下,AlphaGo 又以3:0的总比分完胜。柯洁称其为“围棋上帝”,已经完全超过了人类围棋的顶尖水平。原创 2024-01-11 11:02:11 · 981 阅读 · 0 评论 -
何为算法之时间复杂度
了解了空间复杂度和时间复杂度之后,我们便可以据此对一个算法进行衡量。然而,所谓鱼和熊掌不可兼得,空间复杂度和时间复杂度也时常处在此消彼长的状况,这时候就需要我们选取一个平衡点,以达到最佳的效率。原创 2024-01-10 15:16:05 · 1266 阅读 · 0 评论 -
何为算法之空间复杂度
一个算法所占用的存储空间包括三个方面:算法本身所占用的空间、输入/输出数据所占用的空间,以及算法运行所占用的空间。原创 2024-01-08 15:08:16 · 954 阅读 · 0 评论 -
何为算法之什么是算法
很多时候,比自己更了解自己的,不是你的父母和伴侣,也不是你的朋友,而是算法。算法就像一位智者那般,似乎只要我们有还没解决的问题,它便可以为我们提供这个问题的可行解。原创 2024-01-07 22:15:21 · 1445 阅读 · 0 评论