算法分析 | 第二套(最差、平均和最佳情况)

简介: 算法分析 | 第二套(最差、平均和最佳情况)

上一篇文章中,我们讨论了渐近分析如何克服算法分析方法幼稚的问题。在这篇文章中,我们将以线性搜索为例,并使用渐近分析对其进行分析。 我们可以用三种情况来分析算法:

  1. 最坏情况
  2. 平均情况
  3. 最好情况 让我们考虑以下线性搜索的实现。


该方法的 C++ 实现

#include <bits/stdc++.h>
using namespace std;
// 在 arr[] 中线性搜索 x。
// 如果 x 存在则返回索引,否则返回 -1
int search(int arr[], int n, int x)
{
  int i;
  for (i = 0; i < n; i++) {
    if (arr[i] == x)
      return i;
  }
  return -1;
}
// 驱动程序代码
int main()
{
  int arr[] = { 1, 10, 30, 15 };
  int x = 30;
  int n = sizeof(arr) / sizeof(arr[0]);
  cout << x << " is present at index "
    << search(arr, n, x);
  getchar();
  return 0;
}

该方法的C实现

#include <stdio.h>
// 在 arr[] 中线性搜索 x。
// 如果 x 存在则返回索引,否则返回 -1
int search(int arr[], int n, int x)
{
  int i;
  for (i = 0; i < n; i++) {
    if (arr[i] == x)
      return i;
  }
  return -1;
}
/* 测试上述功能的驱动程序*/
int main()
{
  int arr[] = { 1, 10, 30, 15 };
  int x = 30;
  int n = sizeof(arr) / sizeof(arr[0]);
  printf("%d is present at index %d", x,
    search(arr, n, x));
  getchar();
  return 0;
}

该方法的Java实现

public class HY {
  // 在 arr[] 中线性搜索 x。
        // 如果 x 存在则返回索引,否则返回 -1
  static int search(int arr[], int n, int x)
  {
    int i;
    for (i = 0; i < n; i++) {
      if (arr[i] == x) {
        return i;
      }
    }
    return -1;
  }
  /* 测试上述功能的驱动程序*/
  public static void main(String[] args)
  {
    int arr[] = { 1, 10, 30, 15 };
    int x = 30;
    int n = arr.length;
    System.out.printf("%d is present at index %d", x,
            search(arr, n, x));
  }
}

该方法的 Python 3 实现

// 在 arr[] 中线性搜索 x。
// 如果 x 存在则返回索引,否则返回 -1
def search(arr, x):
  for index, value in enumerate(arr):
    if value == x:
      return index
  return -1
#驱动程序代码
arr = [1, 10, 30, 15]
x = 30
print(x, "is present at index",
  search(arr, x))

输出: 

30 is present at index 2

最坏情况分析(通常已完成)


在最坏情况分析中,我们计算算法运行时间的上限。我们必须知道导致最大操作数被执行的情况。对于线性搜索,最坏的情况发生在数组中不存在要搜索的元素(上面代码中的 x)时。当 x 不存在时,search() 函数将其与 arr[] 的所有元素一一比较。因此,线性搜索的最坏情况时间复杂度为 Θ(n)。


平均案例分析(有时完成)


在平均案例分析中,我们获取所有可能的输入并计算所有输入的计算时间。将所有计算值相加并将总和除以输入总数。我们必须知道(或预测)病例的分布。对于线性搜索问题,让我们假设所有情况都是均匀分布的(包括 x 不在数组中的情况)。所以我们对所有情况求和并将总和除以 (n+1)。以下是平均案例时间复杂度的值。  


image.png

最佳案例分析(虚假)


在最佳案例分析中,我们计算算法运行时间的下限。我们必须知道导致执行最少操作数的情况。在线性搜索问题中,最好的情况发生在 x 出现在第一个位置时。最佳情况下的操作次数是恒定的(不依赖于 n)。所以最好情况下的时间复杂度是 Θ(1)


大多数时候,我们会做最坏情况分析来分析算法。在最坏的分析中,我们保证算法的运行时间有一个上限,这是一个很好的信息。


在大多数实际案例中,平均案例分析并不容易进行,而且很少进行。在平均情况分析中,我们必须知道(或预测)所有可能输入的数学分布。


最佳案例分析是假的。保证算法的下限不会提供任何信息,因为在最坏的情况下,算法可能需要数年才能运行。


对于某些算法,所有情况都是渐近相同的,即没有最坏和最好的情况。例如合并排序。归并排序在所有情况下都执行 Θ(nLogn) 操作。大多数其他排序算法都有最坏和最好的情况。例如,在快速排序的典型实现中(其中枢轴被选为角元素),最坏的情况发生在输入数组已经排序时,而最好的情况是枢轴元素总是将数组分成两半。对于插入排序,最坏的情况发生在数组反向排序时,最好的情况发生在数组按与输出相同的顺序排序时。


目录
相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
57 4
|
3月前
|
数据采集 机器学习/深度学习 算法
|
3月前
|
人工智能 算法 BI
第一周算法设计与分析 D : 两面包夹芝士
这篇文章介绍了解决算法问题"两面包夹芝士"的方法,通过找出两个数组中的最大最小值,计算这两个值之间的整数个数,包括特判不存在整数的情况。
|
19天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
26天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
53 4
|
1月前
|
算法
PID算法原理分析及优化
【10月更文挑战第6天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
40 1
|
2月前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
115 19
|
3月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业