“警惕时间复杂度陷阱”

“警惕时间复杂度陷阱”

警惕时间复杂度陷阱

写在这里

一个bilibili视频也展示了这个:[bilibili视频][https://www.bilibili.com/video/bv16u4m1c7cu/?spm_id_from=333.999.0.0] 我觉得这是一个很好的视频,但它的语言是中文。

时间复杂度

时间复杂度是什么意思?

时间复杂度是算法运行所需时间的度量,作为其输入大小的函数。它是描述算法效率的一种方式,用于比较不同的算法并确定哪种算法最有效。

如何计算时间复杂度?

为了计算时间复杂度,我们需要将算法执行的操作数视为输入大小的函数。测量操作次数的最常见方法是计算特定操作执行的次数。

计算时间复杂度时有哪些常见陷阱?

不考虑输入大小:如果我们只考虑算法执行的操作数量,我们可能会低估时间复杂度。例如,如果我们计算循环运行的次数,但不考虑输入的大小,那么时间复杂度可能会太高。不考虑算法的效率:有些算法即使输入量很小也可能会执行很多操作,这会导致时间复杂度很高。例如,冒泡排序和选择排序等排序算法具有二次时间复杂度,即使它们可能只需要交换小数组中的两个元素。不考虑算法的最坏情况:某些算法具有最好情况,其中执行的操作比最坏情况要少。例如,像二分搜索这样的搜索算法有一个最好的情况,即它们在对数时间内找到目标元素,但它们有一个最坏的情况,即它们需要检查数组中的所有元素。

让我们看一些时间复杂度的例子

这里有一个问题:
找出列表中最多 10 个整数。

import randomls = [random.randint(1, 100) for _ in range(n)]

这是测试功能:

import timedef benchmark(func, *args) -> float:    start = time.perf_counter()    func(*args)    end = time.perf_counter()    return end - start

解决方案1:使用堆

这是使用 heapq 模块的解决方案:

def find_max_n(ls, n):    import heapq    return heapq.nlargest(n, ls)

或者我们用python的方式来写:

def find_largest_n(nums, n):    if n <= 0:        return []    max_heap = []    for num in nums:        if len(max_heap)  max_heap[0]:            max_heap[0] = num            _sift_down(max_heap, 0)    return max_heapdef _sift_down(heap, index):    left = 2 * index + 1    right = 2 * index + 2    largest = index    if left  heap[largest]:        largest = left    if right  heap[largest]:        largest = right    if largest != index:        heap[index], heap[largest] = heap[largest], heap[index]        _sift_down(heap, largest)

解决方案2:使用排序

这是使用排序功能的解决方案:

def find_max_n(ls, n):    return sorted(ls, reverse=true)[:n]

几乎所有人都知道,堆的时间复杂度是 o(n log k),排序函数的时间复杂度是 o(n log n)。

看来第一个解决方案比第二个更好。但在python中却不是这样。

看最终代码:

import timedef benchmark(func, *args) -> float:    start = time.perf_counter()    func(*args)    end = time.perf_counter()    return end - startdef find_max_n_heapq(ls, n):    import heapq    return heapq.nlargest(n, ls)def find_max_n_python_heap(nums, n):    if n <= 0:        return []    max_heap = []    for num in nums:        if len(max_heap)  max_heap[0]:            max_heap[0] = num            _sift_down(max_heap, 0)    return max_heapdef _sift_down(heap, index):    left = 2 * index + 1    right = 2 * index + 2    largest = index    if left  heap[largest]:        largest = left    if right  heap[largest]:        largest = right    if largest != index:        heap[index], heap[largest] = heap[largest], heap[index]        _sift_down(heap, largest)def find_max_n_sorted(ls, n):    return sorted(ls, reverse=True)[:n]# testimport randomfor n in range(10, 10000, 100):    ls = [random.randint(1, 100) for _ in range(n)]    print(f"n = {n}")    print(f"Use    Heapq: {benchmark(find_max_n_heapq, ls, n)}")    print(f"Python Heapq: {benchmark(find_max_n_python_heap, ls, n)}")    print(f"Sorted      : {benchmark(find_max_n_sorted, ls, n)}")

我在python3.11 vscode中运行,结果如下:

n 不大

使用heapq:0.002430099993944168
python 堆:0.06343129999004304
排序:9.280000813305378e-05
n = 910
使用堆:9.220000356435776e-05
python 堆:0.07715500006452203
排序:9.360001422464848e-05
n = 920
使用堆:9.440002031624317e-05
python 堆:0.06573969998862594
排序:0.00012450001668184996
n = 930
使用堆:9.689992293715477e-05
python 堆:0.06760239996947348
排序:9.66999214142561e-05
n = 940
使用堆:9.600003249943256e-05
python 堆:0.07372559991199523
排序:9.680003859102726e-05
n = 950
使用堆:9.770004544407129e-05
python 堆:0.07306570000946522
排序:0.00011979998089373112
n = 960
使用堆:9.980006143450737e-05
python 堆:0.0771204000338912
排序:0.00022829999215900898
n = 970
使用堆:0.0001601999392732978
python 堆:0.07493270002305508
排序:0.00010840001050382853
n = 980
使用堆:9.949994273483753e-05
python 堆:0.07698320003692061
排序:0.00010300008580088615
n = 990
使用堆:9.979994501918554e-05
python 堆:0.0848745999392122
排序:0.00012620002962648869

如果n很大?

n = 10000
使用堆:0.003642000025138259
python 堆:9.698883199947886
排序:0.00107999995816499
n = 11000
使用heapq:0.0014836000045761466
python 堆:10.537632800056599
排序:0.0012236000038683414
n = 12000
使用heapq:0.001384599949233234
python 堆:12.328411899972707
排序:0.0013226999435573816
n = 13000
使用heapq:0.0020017001079395413
python 堆:15.637207800056785
排序:0.0015075999544933438
n = 14000
使用heapq:0.0017026999266818166
python 堆:17.298848500009626
排序:0.0016967999981716275
n = 15000
使用堆:0.0017773000290617347
python 堆:20.780625900020823
排序:0.0017105999868363142

我发现了什么以及如何改进它

当n很大时,sorted会花费一点时间(有时甚至比使用heapq更好),但python heapq会花费很多时间。

为什么sorted花费的时间很少,而python heapq花费的时间却很多? 因为sorted()是python中的内置函数,你可以找到关于它的python官方文档。

bulit-in 函数比 heapq 更快,因为它是用 c 编写的,c 是一种编译语言。

如何改善?您可以使用内置函数sorted()代替heapq.sort()来提高代码的性能。 sorted() 函数是 python 中的内置函数,它是用 c 实现的,因此比 heapq.sort() 快得多

脑震荡

当我们处理大数据时,我们应该使用内置函数而不是 heapq.sort() 来提高代码的性能。在处理大数据时,我们必须警惕时间复杂度陷阱。有时时间复杂度陷阱是不可避免的,但我们应该尽量避免它们。

关于我

大家好,我是梦沁园。我是一名学生。我喜欢学习新事物。
你可以看我的github:[mengqinyuan的github][https://github.com/mengqinyuan]

以上就是“警惕时间复杂度陷阱”的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 12:14:57
下一篇 2025年12月13日 12:15:09

相关推荐

  • 软件开发的坚实原则

    在软件开发领域,solid 原则是一组五个设计原则,旨在创建健壮、可维护和可扩展的软件系统。这些原则由 robert c. martin(也称为 bob 叔叔)提出,为开发人员提供了遵循的指南,以确保他们的代码库干净且可扩展。在这里,我们将探索每个 solid 原则,并通过 python 示例演示如…

    好文分享 2025年12月13日
    000
  • 在 Python 中使用 SQLAlchemy 创建关系

    当尝试创建 sql 表时,sqlalchemy 可以帮助完成 python 中所需的许多任务,其中之一就是创建关系。 使用 sqlalchemy 创建关系比仅使用 sql 容易得多。它通过更易于遵循的语法和更少的步骤来简化流程。 sqlalchemy 已导入 python,所有快捷语法都可以使用。 …

    2025年12月13日
    000
  • Python – 列表和任务

    学习索引和切片之后,我们开始更多地了解列表和内置方法。方法有 不返回 追加插入删除排序反转清晰 返回整数 索引数数 返回str 立即学习“Python免费学习笔记(深入)”; 流行 对于交付列表的较小更改,内置功能本身就足够了。但是当我们想要对列表进行更多操作时,就需要for循环、if循环。 例如,…

    2025年12月13日
    000
  • Python:全面介绍

    Python 是一种高级解释型编程语言,以其简单性、可读性和多功能性而闻名。 Python 由 Guido van Rossum 创建并于 1991 年首次发布,现已成为世界上最流行的编程语言之一。其设计理念强调代码可读性和显着缩进的使用,使其成为初学者和经验丰富的开发人员的理想选择。Python …

    2025年12月13日
    000
  • python怎么加入库

    Python 中导入库有两种方法:使用 import 语句导入整个库。使用 from … import … 语句导入特定模块或函数。选择导入方法时,考虑代码的可读性和性能:需要导入大量模块或函数时使用 import,需要一个或几个特定模块或函数时使用 from ……

    2025年12月13日
    000
  • python怎么更改安装路径

    Python 的安装路径可以根据系统进行更改:Windows:在自定义安装中指定目标文件夹。macOS:在自定义安装中选择安装位置。Linux:在配置安装时使用 –prefix 选项指定自定义路径。 如何在 Python 中更改安装路径 引言Python 的默认安装路径通常是各个操作系统…

    2025年12月13日
    000
  • python怎么调颜色

    Python中调整图像颜色的方法:使用Pillow库进行亮度、对比度和饱和度调节。使用NumPy和OpenCV进行颜色空间转换和掩蔽。使用PIL库进行逐像素颜色调整和滤镜应用。使用recolor()函数进行颜色量化重新着色。使用colorcet库提供高质量颜色图进行自定义配色。 Python中调整颜…

    2025年12月13日
    000
  • python怎么修改代码

    修改 Python 代码分为以下步骤:识别需要修改的代码部分。完成所需的修改,包括更正错误、添加功能或优化代码。保存更改并测试程序以验证修改。提交更改至版本控制系统(团队项目)。持续检查代码并进行改进。 如何修改 Python 代码 修改 Python 代码至关重要,以修复错误、添加新功能或提升性能…

    2025年12月13日
    000
  • python怎么换字体颜色

    Python 中更改字体颜色有两种方法:使用 ANSI 转义序列和使用 colorama 等第三方库。通过 ANSI 转义序列,可以使用控制台终端的特殊字符序列更改颜色,例如 “33[1;31m” 表示红色。colorama 库提供了更方便的 API,如 Fore.RED 表…

    2025年12月13日
    000
  • python怎么把图片放进窗口

    通过使用 Tkinter 库,可以将图片放入 Python 窗口中。具体步骤包括:导入 Tkinter 库;创建一个窗口;创建一个图像对象;创建一个标签并设置图像;启动主事件循环。 如何在 Python 中将图片放入窗口 在 Python 中,可以通过使用 Tkinter 库将图片放入窗口中。以下是…

    2025年12月13日
    000
  • python怎么打开白色窗口

    可以使用 Tkinter、Pyglet 或 PyQt 在 Python 中创建白色背景的窗口。具体方法包括:使用 Tkinter 的 config(background=”white”) 方法;使用 Pyglet 的 set_clear_color(255, 255, 255…

    2025年12月13日
    000
  • python怎么改成白色

    Python 终端默认背景色为黑色,要更改为白色,可执行以下步骤:通过命令行安装 colorlog 并在 shell 中设置环境变量。打开 IDLE 并配置“终端 Shell”部分的背景颜色。使用其他终端仿真器(如 Cmder 或 iTerm2)调整背景色选项。 如何将 Python 终端改成白色 …

    2025年12月13日
    000
  • python怎么把背景改为黑色

    要在 Python 中将图表背景颜色更改为黑色,请执行以下步骤:导入 Matplotlib 库。创建 Matplotlib Figure。使用 set_facecolor() 方法设置背景颜色。绘制图表数据。使用 show() 方法显示图表。 如何将 Python 图表的背景颜色更改为黑色 在 Py…

    2025年12月13日
    000
  • python怎么读出txt文件

    Python 中读取 txt 文件的方法:使用 open() 函数读取整个文件的内容。使用 readlines() 函数将文件按行读取,存储在列表中。使用 readline() 函数逐行读取文件,每次返回一行。 如何使用 Python 读取 txt 文件 Python 中读取 txt 文件非常简单,…

    2025年12月13日
    000
  • python怎么把背景换成黑色

    可以使用 OpenCV 库将图像背景设为黑色,步骤为:导入 OpenCV。读取图像。创建与图像大小相同的黑色背景。分离前景,使用二值化阈值分离图像中的前景与背景。查找前景区域的轮廓。将前景区域绘制到黑色背景上。保存结果。 如何在 Python 中将图像背景设为黑色 在 Python 中,可以使用 O…

    2025年12月13日
    000
  • python怎么改白色背景

    Python GUI 中的背景颜色通常为白色,但可以通过更改窗口、控件或画布背景来更改。更改窗口背景:使用 configure() 方法设置背景颜色。更改控件背景:使用 config() 方法配置控件背景。自定义画布背景:使用 Canvas 控件创建自定义图形并控制背景颜色。 如何更改 Python…

    2025年12月13日
    000
  • python怎么读写txt

    如何用 Python 读写 TXT 文件?读取 TXT 文件:导入库:import os打开文件:with open(“text.txt”, “r”) as f: content = f.read()写入 TXT 文件:导入库:import os创建文…

    2025年12月13日
    000
  • idlepython怎么运行

    在 Windows 或 Mac 系统上,通过以下步骤在 IDLE 中运行 Python 代码:打开 IDLE。创建新文件(可选)。输入 Python 代码。使用 F5 快捷键或“运行”菜单运行代码。使用调试器(可选)查找并修复错误。 如何运行 idlepython 打开 IDLE 在 Windows…

    2025年12月13日
    000
  • idle python怎么安装

    要安装 IDLE Python,请访问官方网站、选择与您操作系统匹配的版本、按照提示进行安装,然后验证安装是否成功。IDLE 是一个轻量级的 Python 集成开发环境,非常适合初学者和脚本编写。 如何安装 IDLE Python 步骤 1:访问官方网站 前往 Python 官方网站 https:/…

    2025年12月13日
    000
  • python怎么下载到d盘

    在D盘下载Python的步骤:1.访问Python官网;2.选择Windows下载;3.选择D盘保存;4.运行安装程序并选择D盘安装;5.验证安装版本。 如何在 D 盘下载 Python 下载 Python 到 D 盘是一个简单的过程,可以分以下几个步骤进行: 1. 访问 Python 官方网站 访…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信