“警惕时间复杂度陷阱”

“警惕时间复杂度陷阱”

警惕时间复杂度陷阱

写在这里

一个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]

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

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2196721.html

(0)
上一篇 2025年2月25日 21:56:48
下一篇 2025年2月25日 21:57:03

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 软件开发的坚实原则

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

    2025年2月25日
    000
  • 在 Python 中使用 SQLAlchemy 创建关系

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

    2025年2月25日
    200
  • Python – 列表和任务

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

    2025年2月25日
    200
  • Python:全面介绍

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

    2025年2月25日
    200
  • 使用 CDK v 探索 AWS 无服务器部署从 RSS 到 X Posts – Odyssey 的一部分

    欢迎来到“使用 cdk v2 探索 aws 无服务器部署”的第 3 部分。首先,我要感谢您的耐心等待,因为自第 2 部分以来一直存在一些差距。我在工作中深入研究和从事无服务器项目,这让我无法继续工作,但我很高兴能回到正轨并继续我们的探索。 …

    2025年2月25日
    200
  • python如何新建一个窗口

    在 Python 中创建一个窗口的步骤如下:导入 Tkinter 库。创建 Tkinter 根窗口。设置窗口属性,包括标题和大小。添加小部件(可选)。进入事件循环。 如何在 Python 中创建一个窗口 创建一个窗口是使用 Python 进…

    2025年2月25日
    200
  • 生产准备清单

    我一直致力于多个项目,我已将应用程序从 PoC 转移到生产环境。这些是我为自己和我的团队准备的清单,以确保我们为生产做好准备。这里检查表是重点,因为应用程序采用 Python 编程语言并通过 Kubernetes 部署到 AWS。并非所有这…

    2025年2月25日
    200
  • python官方下载哪里有

    Python 官方下载可在 Python 官网(https://www.python.org/),具体步骤:访问 Python 官网悬停“下载”选项选择与操作系统对应的链接点击下载链接获取安装程序推荐下载最新稳定版 Python 官方下载 …

    2025年2月25日
    200
  • pycharm配置python环境变量是什么

    Python环境变量是管理Python解释器路径的变量,其配置步骤因操作系统而异:Windows:在环境变量中添加Python解释器安装路径。MacOS:在 ~/.bash_profile 中添加导出路径的命令。Linux:在 /etc/e…

    2025年2月25日
    200
  • python安装详细步骤2024

    如何安装 Python 2024 版本?下载适用于您操作系统的 Python 安装程序。运行安装程序并进行自定义安装。选择安装位置、将 Python 添加到 PATH 和关联 .py 文件。完成安装。检查安装是否成功。可选:安装其他软件包以…

    2025年2月25日
    200

发表回复

登录后才能评论