数据结构算法 DS Algorithm

什么是算法?

算法是执行计算或其他一些解决问题的操作(尤其是计算机)所需的过程或一组规则。算法的正式定义是它包含有限的指令集,这些指令以特定的顺序执行以执行特定的任务。它不是完整的程序或代码;它只是问题的解决方案(逻辑),可以使用流程图或伪代码表示为非正式描述。

算法的特点

以下是算法的特点:

  • 输入:算法有一些输入值。我们可以将 0 或某个输入值传递给算法。
  • 输出:在算法结束时我们将得到 1 个或多个输出。
  • 明确性:算法应该是明确的,这意味着算法中的指令应该清晰且简单。
  • 有限性:算法应该具有有限性。这里,有限性是指算法应该包含有限数量的指令,即指令应该是可数的。
  • 有效性:算法应该有效,因为算法中的每条指令都会影响整个过程。
  • 语言无关:算法必须与语言无关,以便算法中的指令可以用任何语言实现并具有相同的输出。

算法的数据流

  • 问题:问题可以是现实世界的问题,也可以是现实世界问题中我们需要为其创建程序或指令集的任何实例。该指令集称为算法。
  • 算法:将针对一个问题设计一个算法,该算法是一步一步的过程。
  • 输入:设计算法后,向算法提供所需的和期望的输入。
  • 处理单元:输入将被给予处理单元,处理单元将产生所需的输出。
  • 输出:输出是程序的结果或结果。

为什么我们需要算法?

我们需要算法是因为以下原因:

  • 可扩展性:它帮助我们理解可扩展性。当我们遇到一个现实世界的大问题时,我们需要将其缩小为一个个小步骤,以便轻松分析问题。
  • 性能:现实世界不容易分解为更小的步骤。如果问题可以很容易地分解为更小的步骤,则意味着该问题是可行的。

让我们通过一个现实世界的例子来理解该算法。假设我们想要制作柠檬汁,那么制作柠檬汁所需的步骤如下:

步骤1:首先,我们将柠檬切成两半。

第二步:将柠檬尽量挤干,然后将汁液放入容器中。

第三步:加入两汤匙糖。

第四步:搅拌容器直至糖溶解。

第五步:当糖溶解后,加入一些水和冰块。

第6步:将果汁存放在冰箱中5至分钟。

第7步:现在就可以喝了。

上述现实世界可以直接与算法的定义进行比较。我们不能在步骤2之前执行步骤3,我们需要按照特定的顺序来制作柠檬汁。算法还规定,每条指令都应按照特定的顺序执行以执行特定的任务。

现在我们将看一个编程算法的示例。

我们将编写一个算法来将用户输入的两个数字相加。

以下是将用户输入的两个数字相加所需的步骤:

第 1 步:开始

步骤2:声明三个变量a、b和sum。

步骤 3:输入 a 和 b 的值。

步骤4:将a和b的值相加,并将结果存储到sum变量中,即sum=a+b。

第5步:打印总和

第 6 步:停止

算法的因素

以下是我们设计算法时需要考虑的因素:

  • 模块化:如果给定任何问题,我们可以将该问题分解为小小模块或小小步骤,这是算法的基本定义,则意味着该功能已经为该算法完美设计。
  • 正确性:算法的正确性定义为当给定的输入产生期望的输出时,这意味着该算法是已设计的算法。算法分析已正确完成。
  • 可维护性:这里的可维护性是指算法应该以非常简单的结构化方式设计,这样当我们重新定义算法时,算法不会发生重大变化。
  • 功能:它考虑解决现实世界问题的各种逻辑步骤。
  • 鲁棒性:鲁棒性意味着算法如何清楚地定义我们的问题。
  • 用户友好:如果算法不是用户友好的,那么设计者将无法向程序员解释它。
  • 简单性:如果算法简单,那么就很容易理解。
  • 可扩展性:如果任何其他算法设计者或程序员想要使用您的算法,那么它应该是可扩展的。

算法的重要性

  1. 理论重要性:当任何现实世界的问题交给我们时,我们将问题分解成小模块。要分解这个问题,我们应该了解所有的理论方面。
  2. 实践重要性:众所周知,没有实际实施,理论就不可能完成。因此,算法的重要性可以被认为是理论和实践上的。

算法问题

以下是设计算法时遇到的问题:

  • 如何设计算法:我们知道算法是一个循序渐进的过程,因此我们必须遵循一些步骤来设计算法。
  • 如何分析算法效率

算法方法

以下是在考虑设计算法的理论和实践重要性后使用的方法:

  • 暴力算法:应用通用逻辑结构来设计算法。它也被称为穷举搜索算法,可以搜索所有可能性以提供所需的解决方案。此类算法有两种类型:
    1. 优化:找到问题的所有解,然后取出最佳解,或者如果已知最佳解的值,则在已知最佳解的情况下终止。
    2. 牺牲:一旦找到最佳解决方案,就停止。
  • 分而治之:这是一种算法的非常实现。它允许您逐步设计算法。它分解算法以不同的方法解决问题。它允许您将问题分解为不同的方法,并为有效输入生成有效的输出。这个有效的输出被传递给其他一些函数。
  • 贪心算法:是一种在每次迭代中做出最优选择,希望得到最佳解决方案的算法范式。它易于实现并且执行时间更快。但是,在极少数情况下它会提供最佳解决方案。
  • 动态规划:通过存储中间结果使算法更加高效。它遵循五个不同的步骤来找到问题的最佳解决方案:
    1. 它将问题分解为子问题以找到最优解。
    2. 分解问题后,它会从这些子问题中找到最佳解决方案。
    3. 存储子问题的结果称为记忆。
    4. 重用结果,以便无法针对相同的子问题重新计算结果。
    5. 最后,它计算复杂程序的结果。
  • 分支定界算法:分支定界算法只能应用于整数规划问题。这种方法将所有可行解集划分为更小的子集。进一步评估这些子集以找到最佳解决方案。
  • 随机算法:正如我们在常规算法中所看到的,我们有预定义的输入和所需的输出。那些具有一些定义的输入和所需输出集并遵循一些描述的步骤的算法称为确定性算法。当随机算法中引入随机变量时会发生什么?在随机算法中,算法引入一些随机位并将其添加到输入中以产生输出,该输出本质上是随机的。随机算法比确定性算法更简单、更高效。
  • 回溯:回溯是一种递归解决问题的算法技术,如果不满足问题的约束,则删除该解决方案。

算法的主要类别如下:

  • 排序:为按特定顺序对项目进行排序而开发的算法。
  • 搜索:为搜索数据结构内的项目而开发的算法。
  • 删除:为从数据结构中删除现有元素而开发的算法。
  • 插入:为在数据结构中插入项目而开发的算法。
  • 更新:为更新数据结构内的现有元素而开发的算法。

算法分析

算法可以分两个层次进行分析,一是算法创建前,二是算法创建后。下面是两个算法的分析:

  • 先验分析:这里,先验分析是在实现算法之前对算法进行的理论分析。在实现算法之前可以考虑各种因素,例如处理器速度,这对实现部分没有影响。
  • 后验分析:这里,后验分析是算法的实际分析。通过使用任何编程语言实现算法来实现实际分析。这个分析基本上评估了算法占用了多少运行时间和空间。

算法复杂度

算法的性能可以通过两个因素来衡量:

  • 时间复杂度:算法的时间复杂度是完成执行所需的时间量。算法的时间复杂度用大O符号表示。这里,大O表示法是表示时间复杂度的渐近表示法。时间复杂度主要通过计算完成执行的步骤数来计算。让我们通过一个例子来理解时间复杂度。
sum=0;  
// 假设我们要计算n个数字的总和。
for i=1 to n  
sum=sum+i;  
// 当循环结束时 sum 保存 n 个数字的和   
return sum;  

在上面的代码中,循环语句的时间复杂度至少为n,如果n的值增加,那么时间复杂度也会增加。虽然代码的复杂性,即返回总和将是恒定的,因为它的值不依赖于n的值并且仅在一步中提供结果。我们通常考虑最坏时间复杂度,因为它是任何给定输入大小所需的最大时间。

  • 空间复杂度:算法的空间复杂度是解决问题并产生输出所需的空间量。与时间复杂度类似,空间复杂度也用大O表示法来表示。

对于算法来说,需要空间用于以下目的:

  1. 存储程序指令
  2. 存储常量值
  3. 存储变量值
  4. 跟踪函数调用、跳转语句等。

辅助空间:算法所需的额外空间(不包括输入大小)称为辅助空间。空间复杂度考虑了空间(即辅助空间)和输入使用的空间。

所以,

空间复杂度=辅助空间+输入大小。

算法类型

以下是算法的类型:

  • 搜索算法
  • 排序算法

搜索算法

每一天,我们都在日常生活中寻找某些东西。类似地,对于计算机来说,大量数据存储在计算机中,每当用户请求任何数据时,计算机就会在存储器中搜索该数据并将该数据提供给用户。主要有两种技术可用于搜索数组中的数据:

  • 线性搜索
  • 二分查找

线性搜索

线性搜索是一种非常简单的算法,从数组的开头开始搜索元素或值,直到找不到所需的元素。它将要搜索的元素与数组中的所有元素进行比较,如果找到匹配,则返回该元素的索引,否则返回-1。该算法可以在未排序列表上实现。

二分查找

二进制算法是最简单的算法,可以非常快速地搜索元素。它用于从排序列表中搜索元素。元素必须按顺序或排序方式存储才能实现二进制算法。如果元素以随机方式存储,则无法实现二分查找。它用于查找列表的中间元素。

排序算法

排序算法用于按升序或降序重新排列数组或给定数据结构中的元素。比较运算符决定元素的新顺序。

为什么我们需要排序算法?

  • 为了优化其他算法(如二分搜索算法)的效率,需要有效的排序算法,因为二分搜索算法需要按特定顺序(主要是升序)对数组进行排序。
  • 它按排序顺序生成信息,这是一种人类可读的格式。
  • 在排序列表中搜索特定元素比未排序列表更快。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值