e世博网站

Github 标星 4w+,如何用 Python 实现所有算法

e世博官方网站

几位印度兄弟在GitHub上为各种Python算法构建了一个新的入门指南。从原则到代码,所有这些都清楚地向您解释。为了让新手更直观易懂,有些部分还配备了动画。

0f16f00caa9b4bccac9252137494636b

Python学习交流组:1004391443

这颗恒星达到了2.7W

给Github地址?

该项目主要包括两部分:一部分是各种算法的基本原理说明,另一部分是各种算法的代码实现。

算法的代码实现

除了算法基本原理的Python代码,以及包括神经网络,机器学习,数学等的代码实现外,该算法的代码实现还具有丰富的数据。

941cd962775142aea19c1184e5b214f1

例如,在神经网络部分,给出了BP神经网络,卷积神经网络,全卷积神经网络和感知器。

3ed8e29d7d294e998d280f86bb448bf8

卷积神经网络代码示例

代码以Python文件格式保存在Github上,需要它的学生可以自己保存下载。

再次给出github地址:

算法原理

在算法的原理部分,介绍了排序算法,搜索算法,插值算法,跳跃搜索算法,快速选择算法,禁忌搜索算法和加密算法。

当然,除了文本解释之外,还提供了相应资源的链接以帮助更好地理解算法,包括指向维基百科和动画交互式网站的链接。

例如,在某些算法部分中,给出的动画交互链接非常适合帮助理解算法的操作机制。

a52eb1b9a45c49699f32c99aa8fcafc0

互动动画地址:

排序算法

气泡分拣

2671466da49c4697aeb5a4f6c3cdfa37

气泡排序(有时称为结算排序)是一种相对简单的排序算法。该算法通过遍历要排序的列表,交换不符合排列规则的两个相邻数据项,然后重复遍历列表直到不再出现需要交换的数据项来实现。当不需要交换数据项时,它表示列表已排序。

桶分类算法

891508e4bb904cfabf1a7998b1f2d38e

存储桶排序或所谓的盒子排序是一种排序算法,它通过将组件分组到有限数量的存储桶中来工作。每个桶都单独排序,可以使用另一种排序算法或递归地继续使用桶排序。

鸡尾酒排序

5d889887c29741e0ae88bfa8d903b7e1

鸡尾酒分类,即定向气泡分选,鸡尾酒搅拌分选,搅拌分选(也可以视为分类的变体),涟漪分选,来回分拣或欢乐时光分拣,都是气泡分选的变种。该算法与气泡排序之间的区别在于排序是在序列中的两个方向上完成的。

译者注:

鸡尾酒分类等于气泡分类的轻微变形。差异从低到高,然后从高到低,而气泡分类只比较序列中的每个元素从低到高。他可以获得比冒泡排序更好的性能,因为气泡排序仅从一个方向(从低到高)对齐,每个循环只移动一个项目。

以序列(2,3,4,5,1)为例,鸡尾酒分类只需要访问序列一次即可完成分选,但如果使用气泡分选则需要四次。然而,在随机数序列的状态下,鸡尾酒分类和气泡分选的效率非常差。

插入排序

eb321a8abce0483ea579ea516ee500a9

Insertion Sort是一种简单直观的排序算法。它的工作原理是构造一个有序序列,用于未排序的数据,在排序的序列中向后和向前扫描,找到相应的位置并插入它。在插入排序的实现中,额外空间的排序通常通过就地排序来采用。因此,在从后向前扫描的过程中,需要向后重复移动已排序的元素以提供最新元素的插入空间。

合并排序

9b86e8afdb9b4204b1ef2447c8a6f909

合并排序(或mergesort)是在合并操作上创建的有效排序算法,效率为O(n log n)(大O符号)。最初由John von Neumann在1945年提出。该算法是一个使用Divide and Conquer的非常典型的应用程序,每个递归递归层可以同时执行。

f921d1315ec54ed2975587a061bf389f

堆是基于比较的排序算法。它可以被认为是一种改进的选择。它将其输入分为排序和未排序区域,并通过提取最大元素并将其移动到排序区域来迭代地缩小未排序区域。

译者注:

Heap始于1964年由J._W._J._Williams发布的堆排序,当时他提出二叉树作为算法的数据结构。

在队列中,调度程序重复提取队列中的第一个作业并运行,因为实际情况中的一些较短任务将等待很长时间才能结束,或者某些作业不短,但重要,相同应具有优先级。堆是旨在解决此类问题的数据结构。

基数排序

基数排序是一种非比较整数排序算法。原理是按整数位数将整数切换成不同的数字,然后按每个数字进行比较。由于整数也可以表示特定格式的字符串(如名称或日期)和浮点数,因此基数排序不仅用于整数。基数的发明可以追溯到1887年Herman Hellery对冲床的贡献。

选择排序

2735c21ead9d440e9ba7bfce28598f3d

选择排序是一种简单直观的排序算法。它的工作原理如下。首先找到未排序序列中的最小(大)元素,将其存储在排序序列的开头,然后继续从剩余的未排序元素中找到最小(大)元素,然后将其放到排序序列的末尾。依此类推,直到所有元素都被排序。

Shell排序

dde7426f41734dd8b52af21b0eccfa06

ShellSort是插入排序的一种推广,允许交换相距很远的项目。我们的想法是安排一个元素列表,以便从任何地方开始,因为每个第n个元素都会给出一个排序列表。这样的列表称为h排序。同样地,它可以被认为是一个h隔行列表,每个元素都是单独排序的。

拓扑

有向图的拓扑排序或拓扑排序是它们的顶点的线性排序,使得对于从顶点u到顶点v的每个有向边uv,u在排序中先于v。例如,图的顶点可以表示要执行的任务,边可以表示任务必须在另一个之前执行的约束;在这个应用程序中,拓扑排序只是一个有效的任务序列。当且仅当图形不具有有向循环时,即如果它是有向非循环图,则拓扑排序是可能的(DAG)。任何DAG都具有至少一个拓扑排序,并且已知算法用于在线性时间内构建任何DAG的拓扑排序。

时间复杂折线图

比较排序算法的复杂性(气泡排序,插入排序,排序)

ef77c8e0e13b4dd9881aceef0e558def

比较排序算法:

Quicksort是一种非常快速的算法,但实现起来相当棘手。冒泡排序是一种缓慢的算法,但它很容易实现。为了对小数据集进行排序,气泡排序可能是更好的选择。

搜索算法

线性搜索

09ee0ac586c1442fb0fdce88bcc9e75e

线性搜索或顺序搜索是用于在列表中查找目标值的方法。它按顺序检查列表中每个元素的目标值,直到找到匹配或直到搜索到所有元素。

假设数组中有N个元素,最好的情况是在数组中找到特定值,这样只需要进行一次比较。最糟糕的情况是要查找的特定值不在此数组中或数组中的最后一个元素,这需要N次比较。

二进制二进制搜索

674321263b4e44008d803c05aa1009de

二进制搜索(也称为半间隔搜索或对数搜索)用于查找已排序数组中目标值的位置。它将目标值与数组的中间元素进行比较。如果它们不相等,则目标的一半被消除,搜索继续到下一半。

插值搜索

插值搜索是一种用于搜索已按键值的值排序的数组中的键的算法。

WW 目的关键值):在每个步骤中,算法计算剩余搜索空间中的位置,基于搜索空间边界上的键值和搜索键的值,通常通过线性插值来查找项目。

相反,二进制搜索总是选择剩余搜索空间的中间,丢弃一半或另一半,这取决于在估计位置找到的密钥与所寻找的密钥之间的比较。剩余的搜索空间减少到估计位置之前或之后的部分。线性搜索仅使用相等,因为它从一开始就逐个比较元素,忽略任何排序。

平均插值搜索使log(log(n))比较(如果元素均匀分布),其中n是要搜索的元素的数量。在最坏的情况下(例如,密钥的值呈指数增加),它可以构成O(n)比较。

在插值顺序搜索中,插值用于查找正在搜索的项目附近的项目,然后使用线性搜索来查找确切的项目。

跳转搜索

跳转搜索是指有序列表的搜索算法。它首先检查所有项目的Lkm,其中K∈N,并且m是块大小,直到找到大于搜索关键字的项目。为了在列表中找到搜索关键字的确切位置,对子列表L [(k-1)m,km]执行线性搜索。

m的最优值是√n,其中n是列表L的长度。由于算法的两个步骤最多为√n,算法在O(√n)时间内运行。这比线性搜索更好,但比二分搜索更糟糕。优于后者的优点是跳转搜索只需要向后跳跃,而二进制文件可以跳回记录n次。

可以通过在最终执行线性搜索之前在子列表上执行多级跳转搜索来修改算法。对于k级跳跃搜索,第一级的最佳块大小ml(从1开始计数)是n(k1)/k。修改后的算法将执行k个向后跳转并在O(kn1 /(k + 1))时间内运行。

快速选择算法

d5c499fa08f946379551429d22b49c06

Quicksort是一种选择算法,可以从无序列表中找到第k个小元素。它原则上与快速分类有关。与快速排序一样,它由Tony Hall提出,因此也称为霍尔选择算法。同样,它在实际应用中是一种有效的算法,具有良好的平均时间复杂度,但最差的时间复杂度并不理想。快速选择及其变体是实际应用中使用的最有效的选择算法。

快速选择的一般思想与快速排序一致,选择元素作为分区元素的基线,并将小于和大于基线的元素划分为基线左侧和右侧的两个区域。不同之处在于快速选择不会递归地访问双边,而只是递归地输入一侧的元素以继续搜索。这将平均时间复杂度从O(n log n)降低到O(n),但最坏的情况仍然是O(n2)。

禁忌搜索

Tabu搜索(TS),也称为禁忌搜索,是1986年左右由美国科罗拉多大学的Fred Glover教授提出的一种现代启发式算法。它是一种用于逃避局部最优解的搜索方法。它首先创建一个初始化方案;基于此,算法“移动”到相邻的方案。在许多连续移动过程之后,解决方案的质量得到改善。

密码

凯撒密码

凯撒密码,也称为凯撒密码,移位密码,凯撒代码或凯撒移位,是最简单和最知名的加密技术之一。

它是一个替换密码,其中明文中的每个字母都被字母表中某些固定位置的字母替换。例如,向左移动3,D将被替换为A,E将被替换为B,依此类推。

该方法以Julius Caesar命名,最初由他在私人通信中使用。由Caesar密码执行的加密步骤通常是更复杂的解决方案的一部分,例如Vigenère密码,并且仍然在ROT13系统中具有现代应用。与所有单字母替换密码一样,凯撒密码很容易破解,现代实践中基本没有通信安全性。

Vigenère密码

Vigenère密码是一种通过使用基于关键字字母的一系列隔行扫描凯撒密码来加密字母文本的方法。这是一个多字母替代品。

Vigenère代码这种方法最初是由Giovan Battista Bellaso在其1553年出版的“La cifra del”中提出的。然而,该计划后来在19世纪的BlaisedeVigenère被滥用,现在被广泛称为“Vigenère代码”。

尽管密码易于理解和实施,但它已经抵制了三个世纪以来破解密码的所有尝试,因此它也被称为lechiffreindéchiffrable(法语是“难以理解的密码”)。 Friedrich Kasiski是1863年第一个破译Vigenère代码的通用方法。

转置密码

转置密码是一种加密方法,通过该加密方法,明文单元保持的位置(通常是字符或一组字符)根据传统系统移位,使得密文构成明文排列。也就是说,单位的顺序改变(明文被重新排序)。

在数学上,两个字符的函数用于加密字符的位置和用于解密的反函数。

RSA(Rivest-Shamir-Adleman)

RSA加密算法是非对称加密算法。 RSA广泛用于公钥加密和电子商务。 RSA由Ron Rivest,Adi Shamir和Leonard Adleman于1977年提出。当时,他们三人都在麻省理工学院工作。 RSA由三个名字的三个名字组成。

1973年,在英国政府通信总部工作的数学家Clifford Cocks在内部文件中提出了一种等效算法,但该算法在1997年之前被归类为机密。公开。

ROT13

f09f353f12844b8fbfa789359efde78e

ROT13(“旋转13个位置”,有时使用连字符ROT-13)是一个简单的字母替换密码,用字母后面的第13个字母替换一个字母。 ROT13是古罗马开发的凯撒代码的特例。

由于基本拉丁字母中有26个字母(2×13),因此ROT13是它自己的反转,即撤消ROT13需要相同的算法,因此可以使用相同的动作进行编码和解码。该算法提供很少或没有加密安全性,并且经常被引用作为弱加密的典型示例。