算法基础知识

算法基础

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)随着输入大小的增加而线性增长。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
算法:C语言实现 (第1-4部分)基础知识数据结构、排序及搜索(原书第3版) 本书是Sedgewick彻底修订和重写的C算法系列的第一本。全书分为四部分,共16章。第一部分“基础知识”(第1—2章)介绍基本算法分析原理。第二部分“数据结构”(第3~5章)讲解算法分析中必须掌握的数据结构知识,主要包括基本数据结构、抽象数据结构、递归和树。第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,并比较了各种排序方法的性能特征。第四部分“搜索”(第12~16章)在进一步讲解符号表、树等抽象数据类型的基础上,重点讨论散列方法、基数搜索以及外部搜索方法。 书中提供了用C语言描述的完整算法源程序,并且配有丰富的插图和练习。作者用简洁的实现将理论和实践成功地结合了起来,这些实现均可在真实应用上测试,使得本书自问世以来备受程序员的欢迎。 本书可作为高等院校计算机相关专业算法数据结构课程的教材和补充读物,也可供自学之用。 目录 出版者的话 译者序 前言 第一部分 基础知识  第1章 引言   1.1 算法   1.2 典型问题——连通性   1.3 合并一查找算法   1.4 展望   1.5 主题概述  第2章 算法分析的原理   2.1 实现和经验分析   2.2 算法分析   2.3 函数的增长   2.4 大O符号   2.5 基本递归方程   2.6 算法分析示例   2.7 保证、预测及局限性 第二部分 数据结构  第3章 基本数据结构   3.1 构建组件   3.2 数组   3.3 链表   3.4 链表的基本处理操作   3.5 链表的内存分配   3.6 字符串   3.7 复合数据结构  第4章 抽象数据类型   4.1 抽象对象和对象集   4.2 下推栈ADT   4.3 栈ADT客户示例   4.4 栈ADT的实现   4.5 创建一个新ADT   4.6 FIFO队列和广义队列   4.7 复制和索引项   4.8 一级ADT   4.9 基于应用的ADT示例   4.10 展望  第5章 递归与树   5.1 递归算法   5.2 分治法   5.3 动态规划   5.4 树   5.5 树的数学性质   5.6 树的遍历   5.7 递归二叉树算法   5.8 图的遍历   5.9 综述 第三部分 排序  第6章 基本排序方法   6.1 游戏规则   6.2 选择排序   6.3 插入排序   6.4 冒泡排序   6.5 基本排序方法的性能特征   6.6 希尔排序   6.7 对其他类型的数据进行排序   6.8 索引和指针排序   6.9 链表排序   6.10 关键字索引统计  第7章 快速排序   7.1 基本算法   7.2 快速排序算法的性能特征   7.3 栈大小   7.4 小的子文件   7.5 三者取中划分   7.6 重复关键字   7.7 字符串和向量   ……  第8章 归并与归并排序  第9章 优先队列和堆排序  第10章 基数排序  第11章 特殊用途的排序方法 第四部分 搜索  第12章 符号表和二叉搜索树  第13章 平衡树  第14章 散列  第15章 基数搜索  第16章 外部搜索
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

度假的小鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值