算法基础知识

简介: 算法基础知识

1.算法概述

数据结构是一种组织数据以便有效使用数据的系统方法。以下术语是数据结构的基础术语。

  • 接口 - 每个数据结构都有一个接口。 Interface表示数据结构支持的操作集。接口仅提供支持的操作列表,它们可以接受的参数类型以及返回这些操作的类型。
  • 实现 - 实现提供数据结构的内部表示。 实现还提供了数据结构操作中使用的算法的定义。

数据结构的特征

  • 正确性 - 数据结构实现应正确实现其接口。
  • 时间复杂度 - 数据结构的运行时间或操作的执行时间必须尽可能小。
  • 空间复杂性 - 数据结构操作的内存使用应尽可能少。

需要数据结构

随着应用程序越来越复杂且数据越来越丰富,应用程序现在面临三个常见问题。

  • 数据搜索 - 考虑 一个商店的100万(10 6)件商品的库存。如果应用程序要搜索项目,则每次减慢搜索速度时,它必须搜索100万(10 6)个项目中的项目。随着数据的增长,搜索速度会变慢。
  • 处理器速度 - 处理器速度虽然非常高,但如果数据增长到数十亿条记录,则会受到限制。
  • 多个请求 - 由于成千上万的用户可以在Web服务器上同时搜索数据,因此即使快速服务器在搜索数据时也会失败。

为了解决上述问题,数据结构得以解决。可以在数据结构中组织数据,使得可以不需要搜索所有项目,并且几乎可以立即搜索所需数据。

执行时间案例

有三种情况通常用于以相对方式比较各种数据结构的执行时间。

  • 最坏情况 - 这是特定数据结构操作占用最多时间的情况。 如果操作的最坏情况时间是ƒ(n),那么此操作将不会超过ƒ(n)时间,其中ƒ(n)表示n的函数。
  • 平均情况 - 这是描述数据结构操作的平均执行时间的方案。 如果操作在执行中花费ƒ(n)时间,那么m次操作将花费mƒ(n)时间。
  • 最佳案例 - 这是描述数据结构操作的最少可能执行时间的场景。 如果操作在执行中花费ƒ(n)时间,则实际操作可能花费时间作为最大的随机数作为f(n)。

基本术语

  • 数据 - 数据是值或值集。
  • 数据项 - 数据项是指单个值单位。
  • 组项目 - 分为子项目的数据项称为组项目。
  • 基本项目 - 不能分割的数据项称为基本项目。
  • 属性和实体 - 实体是包含某些属性或属性的实体,可以为其指定值。
  • 实体集 - 类似属性的实体形成实体集。
  • Field - Field是表示实体属性的单个基本信息单元。
  • 记录 - 记录是给定实体的字段值的集合。
  • 文件 - 文件是给定实体集中实体的记录的集合。

2.算法基础

算法是一个逐步的过程,它定义了一组指令,这些指令按特定顺序执行以获得所需的输出。算法通常独立于底层语言创建,即算法可以用一种以上的编程语言实现。

从数据结构的角度来看,以下是一些重要的算法类别 -

  • 搜索 - 搜索数据结构中的项目的算法。
  • 排序 - 特定顺序对项目进行 排序的 算法。
  • 插入 - 在数据结构中插入项的算法。
  • 更新 - 更新数据结构中现有项目的算法。
  • 删除 - 从数据结构中删除现有项目的算法。

3.算法的特征

并非所有过程都可以称为算法。算法应具有以下特征 -

  • 明确 - 算法应清晰明确。 它的每个步骤(或阶段)及其输入/输出应该是清楚的,并且必须只有一个含义。
  • 输入 - 算法应具有0个或更多明确定义的输入。
  • 输出 - 算法应具有1个或多个明确定义的输出,并且应与所需的输出匹配。
  • 有限性 - 算法必须在有限数量的步骤之后终止。
  • 可行性 - 利用现有资源应该可行。
  • 独立 - 算法应具有逐步指导,这应该独立于任何编程代码。

4.如何编写算法?

编写算法没有明确定义的标准。相反,它是问题和资源依赖的。永远不会编写算法来支持特定的编程代码。

我们知道所有编程语言都共享基本代码结构,如循环(do,for,while),流控制(if-else)等。这些常用结构可用于编写算法。

我们一步一步地编写算法,但情况并非总是如此。算法编写是一个过程,在问题域定义明确后执行。也就是说,我们应该知道我们正在设计解决方案的问题域。

实例

让我们尝试通过一个例子学习算法编写。

问题 - 设计一个算法来添加两个数字并显示结果。

**Step 1** − START
**Step 2** − declare three integers **a** , **b**  & **c**
**Step 3** − define values of **a**  & **b**
**Step 4** − add values of **a**  & **b**
**Step 5** − store output of _step 4_ to **c**
**Step 6** − print **c**
**Step 7** − STOP

算法告诉程序员如何编写程序代码。或者,算法可以写成 -

**Step 1** − START ADD
**Step 2** − get values of **a**  & **b**
**Step 3** − c ← a + b
**Step 4** − display c
**Step 5** − STOP

在算法的设计和分析中,通常使用第二种方法来描述算法。它使分析人员可以轻松分析算法,忽略所有不需要的定义。他可以观察正在使用的操作以及流程如何流动。

编写 步骤编号 是可选的。

我们设计了一种算法来获得给定问题的解决方案。问题可以通过多种方式解决。

因此,可以针对给定问题导出许多解算法。下一步是分析那些提出的解决方案算法并实施最合适的解决方案。

5.算法分析

算法的渐近分析是指定义其运行时性能的数学边界/框架。使用渐近分析,我们可以很好地得出算法的最佳情况,平均情况和最坏情况。

渐近分析是输入界限,即,如果算法没有输入,则结论是在恒定时间内工作。除了“输入”之外,所有其他因素都被认为是不变的。

渐近分析是指以数学计算单位计算任何操作的运行时间。例如,一个操作的运行时间计算为 f (n),并且可以用于另一个操作,其计算为 g (n 2)。这意味着第一操作运行时间将随着 n 的增加而线性增加,并且当 n 增加时第二操作的运行时间将指数地增加。类似地,如果 n 非常小,则两个操作的运行时间几乎相同。

通常,算法所需的时间分为三种类型 -

  • 最佳案例 - 程序执行所需的最短时间。
  • 平均情况 - 程序执行所需的平均时间。
  • 最坏情况 - 程序执行所需的 长时间。

渐近符号

以下是计算算法运行时间复杂度的常用渐近符号。

  • Ο符号
  • Ω表示法
  • θ表示法

大哦符号,Ο

符号Ο(n)是表示算法运行时间上限的正式方式。它测量最坏情况下的时间复杂度或算法可能需要完成的最长时间。

例如,对于函数 *f* (n)

Ο( _f_ (n)) = { _g_ (n) : there exists c > 0 and n0 such that _f_ (n) ≤ c. _g_ (n) for all n > n0. }

Omega表示法,Ω

符号Ω(n)是表示算法运行时间下限的正式方式。它测量最佳案例时间复杂度或算法可能需要完成的最佳时间量。

例如,对于函数 *f* (n)

Ω( _f_ (n)) ≥ { _g_ (n) : there exists c > 0 and n0 such that _g_ (n) ≤ c. _f_ (n) for all n > n0. }

Theta Notation,θ

符号θ(n)是表示算法运行时间的下限和上限的形式方式。它表示如下 -

θ( _f_ (n)) = { _g_ (n) if and only if _g_ (n) =  Ο( _f_ (n)) and _g_ (n) = Ω( _f_ (n)) for all n > n0. }

常见的渐近符号

以下列出了一些常见的渐近符号

不变 - Ο(1)
对数的 - Ο(log n)
线性 - Ο(n)的
n log n - Ο(n log n)
二次 - Ο(n 2)
立方体 - Ο(n 3)
多项式 - n (1)
指数 - 2 Ο(n)的

算法分析

算法的效率可以在实现之前和实现之后的两个不同阶段进行分析。他们是以下 -

  • *先验* 分析 - 这是对算法的理论分析。通过假设所有其他因素(例如,处理器速度)是恒定的并且对实现没有影响来测量算法的效率。
  • *后验* 分析 - 这是一种算法的实证分析。所选算法使用编程语言实现。然后在目标计算机上执行此操作。在此分析中,收集了所需的运行时间和空间等实际统计数据。

我们将学习 先验 算法分析。算法分析处理所涉及的各种操作的执行或运行时间。操作的运行时间可以定义为每个操作执行的计算机指令的数量。

算法复杂度

假设 X 是算法, n 是输入数据的大小,算法X使用的时间和空间是决定X效率的两个主要因素。

  • 时间因素 - 时间是通过计算关键操作的数量来测量的,例如排序算法中的比较。
  • 空间因子 - 通过计算算法所需的最大内存空间来测量空间。

算法 f(n) 的复杂性给出算法所需的运行时间和/或存储空间,以 n 为输入数据的大小。

空间复杂性

算法的空间复杂度表示算法在其生命周期中所需的存储空间量。算法所需的空间等于以下两个组件的总和 -

  • 固定部分,是存储某些数据和变量所需的空间,与问题的大小无关。例如,使用的简单变量和常量,程序大小等。
  • 变量部分是变量所需的空间,其大小取决于问题的大小。例如,动态内存分配,递归堆栈空间等。

任何算法P的空间复杂度S§是S§= C + SP(I),其中C是固定部分,S(I)是算法的可变部分,它取决于实例特征I.是一个试图解释这个概念的简单例子 -

Algorithm: SUM(A, B)
Step 1 -  START
Step 2 -  C ← A + B + 10
Step 3 -  Stop

这里我们有三个变量A,B和C以及一个常数。因此,S§= 1 + 3.现在,空间取决于给定变量和常量类型的数据类型,并且它将相应地相乘。

时间复杂性

算法的时间复杂度表示算法运行完成所需的时间量。时间要求可以定义为数值函数T(n),其中T(n)可以作为步数来测量,条件是每个步骤消耗恒定的时间。

例如,添加两个n位整数需要 n 步。因此,总计算时间是T(n)= c * n,其中c是添加两个比特所花费的时间。在这里,我们观察到T(n)随着输入大小的增加而线性增长。

相关文章
|
缓存 openCL 算法
关于实现Halcon算法加速的基础知识(2)(多核并行/GPU)
关于实现Halcon算法加速的基础知识(多核并行/GPU)
3213 0
关于实现Halcon算法加速的基础知识(2)(多核并行/GPU)
|
6月前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
86 0
|
数据采集 存储 算法
【基础知识】一文看懂深度优先算法和广度优先算法
图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。 我们根据访问节点的顺序与方式(根据搜索方法),可以分为广度优先(BFS)和深度优先(DFS),这是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等。
|
算法 容器
算法-蓝桥基础知识-持续更新中....
算法-蓝桥基础知识-持续更新中....
|
机器学习/深度学习 算法 自动驾驶
强化学习的基础知识和6种基本算法解释
本文将涉及强化学习的术语和基本组成部分,以及不同类型的强化学习(无模型、基于模型、在线学习和离线学习)。本文最后用算法来说明不同类型的强化学习。
340 0
|
机器学习/深度学习 文字识别 算法
算法及数据结构基础知识汇总(下)
算法及数据结构基础知识汇总(下)
算法及数据结构基础知识汇总(下)
|
存储 缓存 算法
算法及数据结构基础知识汇总(上)
算法及数据结构基础知识汇总(上)
算法及数据结构基础知识汇总(上)
|
存储 算法 数据处理
算法和数据结构基础知识
计算机二级必考的知识,选择题前十题是不管考任何计算机都要学的基础知识,这篇文章写的是公共基础知识的算法和数据结构。算法、数据结构的知识。
|
算法 安全 程序员
关于实现Halcon算法加速的基础知识(1)(多核并行/GPU)
关于实现Halcon算法加速的基础知识(多核并行/GPU)
1279 0
关于实现Halcon算法加速的基础知识(1)(多核并行/GPU)
|
机器学习/深度学习 存储 算法
【入门必看-算法基础知识讲解】小白都也能看得懂
【入门必看-算法基础知识讲解】小白都也能看得懂
764 0
【入门必看-算法基础知识讲解】小白都也能看得懂