使用Python可视化O(n)。

介绍

在计算机科学和编程领域中,了解算法的效率是至关重要的,因为它有助于创建既优化又快速执行的软件。时间复杂度在这个背景下是一个重要的概念,因为它衡量了算法的运行时间随着输入规模增长的变化情况。常用的时间复杂度类O(n)表示输入规模和执行时间之间的线性关系。

定义

计算机科学中的算法复杂性是根据算法的输入大小评估所需的资源,如时间和空间利用率。更进一步地说,它支持我们理解算法在考虑其输入大小时执行的速度。用于描述算法复杂性的主要符号是大O符号(O(n))。

语法

for i in range(n):
   # do something

一个`for`循环,根据从0到`n-1`的范围运行特定的一组指令,并在每次迭代中执行一个操作或一组操作。其中'n'表示迭代次数。

在O(n)时间复杂度下,随着输入规模'n'的增加,执行时间成比例增长。随着'n'的增加,循环的迭代次数和完成循环所需的时间将成比例增加。线性时间复杂度表现出输入规模和执行时间之间的直接比例关系。

可以在循环中执行任何任务或任务序列,而不考虑输入大小'n'。这里需要注意的主要方面是循环执行'n'次迭代,导致线性时间复杂度。

算法

  • 步骤1:将一个变量sum初始化为0

  • 步骤2:遍历提供的列表中的每个元素

  • 步骤3:将该元素合并到当前的总和值中。

  • 第四步:循环结束后应返回总和。

  • 步骤 5:结束

方法

  • 方法1:绘制时间与输入大小的关系

  • 方法二:绘制操作与输入规模之间的关系

方法1:绘制时间与输入大小的关系图

Example

import time
import matplotlib.pyplot as plt

def algo_time(n):
    sum = 0
    for i in range(n):
        sum += i
    return sum

input_sizes = []
execution_times = []

for i in range(1000, 11000, 1000):
    start_time = time.time()
    algo_time(i)
    end_time = time.time()
    input_sizes.append(i)
    execution_times.append(end_time - start_time)

plt.plot(input_sizes, execution_times)
plt.xlabel('Input Size')
plt.ylabel('Execution Time (s)')
plt.show()

输出

这段代码是用来测量`algo_time()`算法在不同输入大小下的运行时间。我们将把希望测试的输入大小以及它们相应的执行时间存储在这些列表中。

使用'for'循环来迭代一系列的输入大小。在这种情况下,循环将从1000运行到接近11000之前,每次增加1000。进一步说明,我们计划通过改变从1000到10000的'n'值来评估算法,增量为1000。

在循环内部,我们针对每个输入大小测量`algo_time()`函数的执行时间。为了开始跟踪时间,我们在调用函数之前使用`time.time()`,并在函数完成运行后立即停止。然后,我们将持续时间存储在名为'execution_time'的变量中。

我们将每个给定输入大小的输入值('n')及其相应的执行时间添加到它们各自的列表('input_sizes'和'execution_times')中。

循环完成后,我们拥有生成绘图所需的数据。'plt.plot(input_sizes, execution_times)' 使用我们收集到的数据生成一个基本的折线图。x轴显示的是代表不同输入大小的 'input_sizes' 值。

'plt.xlabel()'和'plt.ylabel()'最后用于分别标记坐标轴的含义,而调用'plt.show()'函数使我们能够呈现图形。

通过运行这段代码,我们可以通过绘制图表来可视化执行时间随着输入大小('n')的增加而增加。假设算法的时间复杂度为O(n),我们可以近似认为当绘制图表时,输入大小和执行时间之间存在几乎直线的相关性。

方法二:绘制操作与输入大小的关系

Example

import matplotlib.pyplot as plt

def algo_ops(n):
    ops = 0
    sum = 0
    for i in range(n):
        sum += i
        ops += 1
    ops += 1  # for the return statement
    return ops

input_sizes = []
operations = []

for i in range(1000, 11000, 1000):
    input_sizes.append(i)
    operations.append(algo_ops(i))

plt.plot(input_sizes, operations)
plt.xlabel

plt.xlabel('Input Size')
plt.ylabel('Number of Operations')
plt.show()

输出

这段代码旨在分析`algo_ops()`算法在不同输入大小下执行的操作次数。通过利用`algo_ops()`函数,可以计算从零到给定输入参数'n'范围内所有数值的求和结果,并同时跟踪和记录每次计算过程中执行的每个操作。

我们首先导入'matplotlib.pyplot'模块,该模块允许我们创建诸如图形之类的可视化。

接下来,我们定义 algo_ops() 函数,该函数接受一个输入数字 'n'。在函数内部,我们初始化两个变量:'ops' 用于计算操作次数,'sum' 用于存储数字的累积和。

这些数组将存储我们希望检查的维度及其相应的执行持续时间。

我们利用迭代循环的一种方式是在多个输入尺度内进行循环。在这种情况下,循环执行范围从1000到10000(除了11000)。这意味着我们将评估变量'n'在1000到10000之间以100为增量的技术。

在循环中,我们计算所有输入大小的`algo_time()`过程的性能。我们在调用该过程之前使用`time.time()`开始一个秒表,并在子程序执行结束后直接结束它。接下来,我们将时间间隔保存在一个名为'execution_period'的变量中。

对于每个输入的大小,我们将输入的值('n')包含在名为'input_sizes'的列表中。此外,我们还将相应的处理时间附加在'execution_times'集合中。

循环完成后,我们已经累积了制作图表所需的基本数据。语句 'plt.plot(input_sizes, execution_times)' 使用收集到的数据创建了一个基本的折线图。'input_sizes' 的值显示在 x 方向轴上,表示不同的输入大小。'execution_times' 的值显示在垂直轴上,表示执行 `algo_time()` 函数所需的时间,其输入大小各不相同。

最后,我们通过 'plt.xlabel()' 和 'plt.ylabel()' 来标记坐标系,以展示每个轴的含义。接下来,执行 'plt.show()' 函数来呈现图形。

一旦我们执行程序,图表将向我们展示当输入的规模('n')增长时,处理时间如何上升。

结论

总之,掌握使用Matplotlib在Python中的时间复杂度和可视化是任何寻求创建高效和优化软件解决方案的程序员的宝贵技能。了解算法在不同输入规模下的行为,使我们能够解决复杂问题并构建健壮的应用程序,以及及时高效地提供结果。

以上就是使用Python可视化O(n)。的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

Gemini API市场调研报告生成:如何自动搜集海量数据并生成可视化分析图表【指南】

用Gemini API可将10竞品5指标市场报告全流程压缩至15分钟,关键在于配置搜索工具、分步采集数据、清洗标准化字段、生成双Y轴图表及自动打包Word。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 你需要在2小时内完成一份覆盖10个竞品、含5类核心指标、带趋势图与对比柱状图的市场调研报告,但手动爬取、清洗、绘图至少要耗掉一整天——用G...

Edge浏览器怎么开启性能中心的内存与CPU释放数据看板_Edge浏览器资源消耗实时可视化

edge://performance页面空白或显示0 MB/0%,说明效率模式未生效,需确认:①设置中效率模式开关已开启;②Edge版本≥124;③未被组策略禁用(edge://policy中EfficiencyModeEnabled为True);④Windows电源模式设为“最佳能效”或“节能”。 edge://performance 页面打不开或数据为空怎么办 直接访问 edge://perf...

如何在 MiniMax 智能体中加入数据图表?可视化插件使用建议

MiniMax智能体嵌入动态图表需启用对应插件或集成前端库:一、启用Chart.js插件并规范JSON数据格式;二、通过OpenClaw桥接Leaflet/D3生成GeoJSON;三、调用Office JS API注入Excel图表引擎;四、使用AI Ping工作流节点转为ECharts/Plotly交互图表。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1...
· AI · 87109

ClawBot怎么快速生成数据可视化代码?ECharts和D3.js图表辅助

ClawBot可通过三种方式生成数据可视化代码:一、用chart-gen-agent自动生成ECharts配置及HTML;二、通过echarts-code-skill转换自然语言为D3.js代码;三、启用GLM-4.7-Flash双引擎同步输出ECharts与D3.js代码。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您希望借助Cl...

智谱清影怎么做那种数据图表从静态变成动态增长的数据可视化视频?

智谱清影支持将静态图表转化为动态增长可视化视频,需按五步操作:一、上传高清PNG/JPEG格式图表;二、用五段式提示词明确起始、增长、终止状态及动效;三、嵌入不超过3处动态标注;四、分帧提示词控制节奏;五、导出前添加时间轴与智能匹配音效。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您希望将静态数据图表转化为具有动态增长效果的数据可视...

如何在Python中为测试用例添加自定义标记_通过pytest.mark进行分类执行

pytest.mark 必须作为装饰器直接作用于测试函数或类,不可写在函数外部;可叠加多个标记,执行时用 -m "mark1 and mark2" 等布尔表达式筛选;未注册标记会触发警告,需在 pytest.ini 或 pyproject.toml 中声明以避免。 pytest.mark 能不能直接用在函数外面 不能。所有 pytest.mark 必须装饰在测试函数或类上,写在函数定义之外会报 S...
· Python · 204691

如何在Python中构建树状结构的递归生成器_使用yield from简化递归代码

yield from 在树遍历中省去了手动展开子生成器的繁琐与风险,自动处理委托调用、异常传播、StopIteration 捕获及协程方法转发,确保扁平化输出和行为一致性。 yield from 在树遍历中到底省了什么 直接说结论:yield from 不是语法糖,它把递归生成器的“委托调用”从手动循环 + yield 拆解成一条语句,避免了中间迭代器被提前耗尽、异常传播断裂、或 StopIter...
· Python · 262106

如何解决Python中的UnboundLocalError局部变量引用错误_使用global或nonlocal关键字声明

Python函数内同名变量报UnboundLocalError,因编译期将赋值变量标记为局部,读取在赋值前则出错;global用于模块级变量,nonlocal用于最近外层函数变量,二者不可混用且需提前声明。 为什么在函数里修改同名变量会报 UnboundLocalError Python 在编译函数时,只要看到某个变量在函数体内有赋值操作(哪怕只在 if 分支里),就会把它标记为局部变量。之后如果...
· Python · 233863