AI必备八大算法内功心法秘籍

12988208-2da80903451e38b8.png

如果各种编程语言都是程序员的技巧,那么数据结构和算法就等同于程序员的内部技能。

编写一个不受恒定回火调节的精致优秀代码是非常困难的。

件。

1,排序的概念

排序是通常在计算机中执行的操作,以将一组“无序”记录序列调整为“有序”记录序列。

排序分为内部排序和外部排序。

如果整个排序过程不需要访问外部存储器,则此排序问题称为内部排序。

相反,如果参与排序的记录数量很大并且整个序列的排序过程无法在内存中完成,则排序问题称为外部排序。

2,排序分类

八种排序算法都是内部排序。如果根据策略进行分类,则可以大致分为:交换排序,插入排序,选择排序,合并排序和基数排序。如下图所示:

12988208-6cf6b527321899e8.png

3.算法分析

下表给出了各种类型的基本性能。有关详细分析,请参阅每种类型的详细说明:

12988208-08e990cf6d7cb49b.png

1.气泡分选

冒泡排序是一种交换排序。

什么是交换分类?

答案:要对要排序的关键字进行成对比较,并且交换不满足订单的对数,直到整个表满足订单要求为止。

算法思考

它反复访问要排序的序列,一次比较两个元素,如果它们的顺序错误则交换它们。重复访问该系列的工作,直到不需要再次交换,这意味着序列已被分类。

这个算法的名称来自这样一个事实:元素越小通过交换缓慢“浮动”到系列的顶部,因此名称冒泡排序。

动态效果图:

12988208-a233df6c6a48824f.gif

假设存在大小为N的无序序列。以上升气泡分类为例,气泡分类是在每个分拣过程中将相邻元素比较两个或两个,在前面放置小数字,在后面放置大数字。

2.直接插入排序

插入排序顺序是最简单的插入排序之一。为了简化问题,我们将仅讨论下面的升序排序。

算法思考

插入排序:每个记录将根据其关键字的大小插入到有序队列的适当位置,知道所有插入都已完成。

动态效果图:

12988208-ba93f499d1f42619.gif

上述过程实际上是典型的直接插入排序,每次将新数据插入有序队列中的适当位置。

非常简单,接下来,我们必须将此算法转换为编程语言。

假设存在一组无序序列R0,R1,RN-1。

(1)我们首先将该序列中下标为0的元素视为有序的元素序列。

(2)然后,我们将依次将R1,R2,RN-1插入到这个有序序列中。因此,我们需要一个从下标1到N-1扫描的外环。

(3)接下来,将描述插入过程。假设这是将Ri插入先前排序的序列中。从上述内容可以看出,当插入Ri时,必须先订购第一个i-1号码。

所以我们需要将Ri与R0~Ri-1进行比较以确定要插入的正确位置。这需要一个内部循环,我们通常从后面到前面比较,从下标i-1开始并扫描到0。

3.希尔排序

Shell排序,也称为缩小增量排序,是一种插入排序。它是直接插入排序算法的强大版本。

Hill排序,也称为降序递增排序算法,以其设计师Donald Shell命名,该设计于1959年出版。

算法思考

让我们举一个例子来描述算法流程(这里来自维基百科):

假设有一组数字{13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10},如果我们从步长开始5:

C ++

1:13 14 94 33 82

2:25 59 94 65 23

3:45 27 73 25 39

4:10

然后我们对每一列进行排序:

C ++

1:10 14 73 25 23

2:13 27 94 33 39

3:25 59 94 65 82

4:45

当我们将上述四行数字放在一起时,得到:{10,14,73,25,23,13,27,94,33,39,25,59,94,65,82,45},然后采取3个步骤:

C ++

1:10 14 73

2:25 23 13

3:27 94 33

4:39 25 59

5:94 65 82

6:45

排序后变为:

C ++

1:10 14 13

2:25 23 33

3:27 25 59

4:39 65 73

5:45 94 82

6:94

最后,按1步排序(这是一个简单的插入排序)。

可以想象,步长的选择是Hill排序的重要部分。该算法最初按特定步长排序,然后继续以较小的步骤排序。最终算法按步长1排序。当步长为1时,算法将直接插入到排序中,从而确保数据将全部排序。

4.快速排序

快速分类是交换分类,由C. A. R. Hoare于1962年提出。

算法思考

快速排序的基本思想是通过排序将要排序的数据分成两个单独的部分:分割点的左侧比数字小,而右侧是比它大的数字。

然后,根据该方法,分别对数据的两部分进行排序,并且可以递归地进行整个排序处理,使得整个数据变为有序序列。

动态效果图:

12988208-b5e1653bf58cbea8.gif

详细的插图通常比大量的文字更具说明性,因此直接在上面:

12988208-1567f2b59fd9d66e.png

在上图中,演示了快速排序的过程:

初始状态是一组无序数组:2,4,5,1,3。

完成上述步骤后,第一个排序完成,并获得一个新数组:1,2,5,4,3。

在新数组中,分割点为2,左侧是小于2的数字,右侧是大于2的数字。

由于2在阵列中找到了合适的位置,因此无需移动它。

左边部分必须小于右边,如果不是,则不进行排序。)

对于右侧的阵列5,4和3,将左侧设置为点5,并指向3,并开始重复图形中的第一,第二,第三和第四步骤以对新阵列进行排序。

5.简单的选择和排序

简单的选择排序是一种选择。

选择排序:每次从要排序的记录中选择具有最小关键字的记录,并将顺序放在排序记录序列的末尾,直到所有排序结束。

二,算法思路

简单排序很简单,其一般处理流程为:

从要排序的序列中找到具有最小关键字的元素;

如果最小元素不是要排序的序列的第一个元素,则将其与第一个元素交换;

从剩余的?N-1个元素中,找到具有最小关键字的元素,并重复步骤(1)和(2)直到排序结束。

动态效果图:

12988208-cd37dc9a034d9c6e.gif

例如,流程图如下:

12988208-2eb6ae40dd4bf975.png

如图所示,在每个排序中,第一个i的当前元素?被放在位置?i?

6.堆排序

堆排序是一种排序。

选择排序:每次从要排序的记录中选择具有最小关键字的记录,并将顺序放在排序记录序列的末尾,直到所有排序结束。

算法思考

堆排序是一种利用堆本质的选择。

动态效果图:

12988208-f7bc96e4e45d23d1.gif

堆是按顺序存储的完整二叉树。

每个节点的关键字不大于其子节点的关键字。这样的堆称为小根堆。

每个节点的关键字不小于其子节点的关键字。这种堆称为大型根堆。

例如,当且仅当满足以下关系之一时,n个元素的序列{R0,R1,Rn}称为堆:

RI<=R2I + 1?和?Ri?<=R2i + 2?(小根堆)

Ri>=R2i + 1且Ri>=R2i + 2(大根堆叠)

其中i=1,2,n/2向下舍入;

12988208-c8b8dc1c78e51e5d.png

如上图所示,序列R {3,8,15,31,25}是典型的小根堆栈。

堆中有两个节点,元素3和元素8.

元素3由数组中的R [0]表示,其左子节点为R [1],右子节点为R [2]。

元素8由数组中的R [1]表示,其左子节点为R [3],右子节点为R [4],其父节点为R [0]。可以看出它们满足以下规则:

让当前元素由数组中的R [i]表示,然后,

(1)?它的左子节点是:R [2 * i + 1];

(2)?它的右子节点是:R [2 * i + 2];

(3)?其父节点是:R [(i-1)/2];

(4)R [i]<=R [2 * i + 1]?和ΔR[i]<=R [2i + 2]。

首先,将数组R [0.n]调整为堆定义的堆(此过程称为创建初始堆),交换R [0]和R [n];

然后,将R [0.n-1]调整为堆,并交换R [0]和R [n-1];

重复这一过程,直到交换R [0]和R [1]。

上述想法可归纳为两个操作:

(1)基于初始数组构造初始堆(构建完整的二叉树,确保所有父节点都大于其子节点)。

(2)每次交换第一个和最后一个元素时,输出最后一个元素(最大值),然后将剩余的元素重新调整为大的根堆栈。

输出最后一个元素时,数组已按升序排列。

让我们看一下详细的示例图,看看如何构建初始堆。

有一个无序的序列? {1,3,4,5,2,6,9,7,8,0}。

12988208-253e682d46c48e78.png

构建初始堆之后,让我们看一下完整的堆排序过程:

或者对于上述无序序列? {1,3,4,5,2,6,9,7,8,0}?

12988208-e23f6d85c1bcd8f3.png

我相信通过以上两个图表,它应该能够非常直观地演示堆排序的操作。

如何确定最后一个非叶节点?

事实上,有一个公式。设二进制树节点的总数为n,则最后一个非叶节点为第一个n/2。

7.排序和合并

合并和排序是基于合并操作的有效排序算法。该算法是使用Divide and Conquer的非常典型的应用程序。

算法思考

该算法采用经典的分治策略(将问题分解为小问题,然后递归解决它们,征服阶段将在分阶段得到答案。'补丁'在一起,划分和统治)。

动态效果图:

12988208-12e98d51da6b0718.gif

分而治之:

1.上演

12988208-531dbf2bd784c48e.png

可以看出,该结构与完整的二叉树非常相似。本文的合并顺序是通过递归实现的(也可以以迭代的方式实现)。分阶段可以理解为递归地破坏分子序列的过程,并且递归深度是logn。

2.治疗阶段

看一下治理阶段,我们需要将两个有序子序列合并为一个有序序列,例如上图中的最后一个合并,到[4,5,7,8]和[1,2,3,6]两个有序子序列,合并到最终序列[1,2,3,4,5,6,7,8],以查看实现步骤。

12988208-d9b691be431887e7.png

12988208-031911c2f0e45c7f.png

8.基本订购

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

算法思考

基本思想是将要比较的所有值(正整数)统一到相同的数字长度,并且具有较短数字的数字前面带有零。然后,从最低位开始,逐个进行排序。因此,在从最低阶到最高阶排序之后,序列变为有序序列。

算法步骤:

要比较的所有值(正整数)统一为相同的数字长度,具有较短位数的数字前面为零。

从最低位置开始,逐个进行排序。

因此,在从最低阶排序到最高阶完成之后,序列变为有序序列。

基数排序方法可以采用LSD(最低有效数字)或MSD(最高有效数字)。 LSD的排序方式从键值的最右侧开始,MSD从键值的最左侧开始反转。

让我们举一个具体的例子来说明基数排序是如何工作的。初始序列为: R {50,123,543,187,49,30,0,2,11,100}。

我们知道任何阿拉伯数字,每个数字的基数用0~9表示,所以我们可以认为0~9为10个桶。

我们首先根据序列的单个数字对数字进行分类,并将它们分配给指定的存储桶。例如:R [0]=50,位数为0,并将此数字存储在编号为0的存储桶中。

12988208-93810e09826ad13c.png

排序后,我们从数字0到数字9按顺序从每个桶中取出所有数字。此时,结果序列是一个数字递增的序列。

按单个数字排序:{50,30,0,100,11,2,123,543,187,49}。

接下来,您可以通过这种方式对数十位和数百位进行排序,最后您可以获得排序的序列。

动态效果图:

12988208-6e91923435df8692.gif

AI本身在大量数据中处理以获得更准确的数据值,但这些基本的八种算法应该更好地掌握。我们还将详细解释人工智能课程研究中对算法思维和代码操作的理解。

为了帮助每个人轻松高效地学习,为每个人分享大量信息,以便人工智能变得越来越流行。如果您不明白,可以添加QQ群:交流讨论,学会沟通,共同进步。

当你真正开始学习时,你不知道从哪里开始,这会导致低信心,影响你继续学习的能力。

但最重要的是,您不知道需要掌握哪些技术。当你学习时,你经常踩到坑,最后浪费了很多时间。因此,有必要拥有有效的资源。