Big O示例与Python数据结构的Big O

news2024/12/24 8:56:36

在Big-O示例部分的第一部分,我们将介绍各种Big-O函数的各种迭代。
让我们从一些简单的例子开始,探索大O是什么。

O(1) Constant

def func_constant(values):
    '''
    Prints first item in a list of values.
    '''
    print(values[0])
    
func_constant([1,2,3])

# 1

请注意,这个函数是恒定的,因为不管列表大小如何,该函数将只采用恒定的步长,在本例中为1,打印列表中的第一个值。因此,我们可以在这里看到,一个100个值的输入列表将只打印1个项目,一个10,000个值的列表将只打印1个项目,一个n个值的列表将只打印1个项目!

O(n) Linear

def func_lin(lst):
    '''
    Takes in list and prints out all values
    '''
    for val in lst:
        print(val)
        
func_lin([1,2,3])

'''
1
2
3
'''

这个函数的运行时间为O(n)。这意味着发生的操作数量与n成线性比例,所以我们可以在这里看到,一个100个值的输入列表将打印100次,一个10,000个值的列表将打印10,000次,一个n个值的列表将打印n次。

O(n^2) Quadratic

def func_quad(lst):
    '''
    Prints pairs for every item in list.
    '''
    for item_1 in lst:
        for item_2 in lst:
            print(item_1,item_2)
            
lst = [0, 1, 2, 3]

func_quad(lst)

'''
0 0
0 1
0 2
0 3
1 0
1 1
1 2
1 3
2 0
2 1
2 2
2 3
3 0
3 1
3 2
3 3
'''

注意我们现在有两个循环,一个嵌套在另一个内部。这意味着对于n个项目的列表,我们必须对列表中的每个项目执行n个操作!这意味着我们总共将执行n次n次赋值,即n^2。
因此,一个包含10个项目的列表将有10^2或100个操作。你可以看到这对于非常大的输入来说是多么危险!这就是为什么大O是如此重要的意识!

Big-O的规模计算

在本节中,我们将讨论不重要的术语是如何从Big-O符号中消失的。
当涉及到大O符号时,我们只关心最重要的项,记住,随着输入量的增加,只有增长最快的项才重要。如果你以前上过微积分课,这会提醒你对无穷大的极限。让我们看看如何删除常量的示例:

def print_once(lst):
    '''
    Prints all items once
    '''
    for val in lst:
        print(val)
print_once(lst)

'''
0
1
2
3
'''

print_once()函数是O(n),因为它将随着输入线性缩放。下一个例子呢?

def print_3(lst):
    '''
    Prints all items three times
    '''
    for val in lst:
        print(val)
        
    for val in lst:
        print (val)
        
    for val in lst:
        print (val)
print_3(lst)

'''
0
1
2
3
0
1
2
3
0
1
2
3
'''

我们可以看到第一个函数将打印O(n)个项,第二个函数将打印O(3n)个项。但是对于n去极小化,常数可以被删除,因为它不会有很大的影响,所以两个函数都是O(n)。
让我们看一个更复杂的例子:

def comp(lst):
    '''
    This function prints the first item O(1)
    Then is prints the first 1/2 of the list O(n/2)
    Then prints a string 10 times O(10)
    '''
    print(lst[0])
    
    midpoint = len(lst) // 2
    
    for val in lst[:midpoint]:
        print(val)
        
    for x in range(10):
        print('number')
lst = [1,2,3,4,5,6,7,8,9,10]

comp(lst)

'''
1
1
2
3
4
5
number
number
number
number
number
number
number
number
number
number
'''

让我们来分解一下这里的操作。我们可以联合每个操作来得到函数的总Big-O:
在这里插入图片描述
我们可以看到,当n变大时,1和10项变得无关紧要,当n走向无穷大时,1/2项乘以n也不会有太大的影响。这个函数是O(n)!

最差情况vs最佳情况

很多时候,我们只关心算法可能出现的最坏情况,但在面试中,重要的是要记住,最坏情况和最好情况可能是完全不同的Big-O时间。例如,考虑以下函数:

def matcher(lst,match):
    '''
    Given a list lst, return a boolean indicating if match item is in the list
    '''
    for item in lst:
        if item == match:
            return True
    return False
lst

'''
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
'''
matcher(lst,1)

'''
True
'''
matcher(lst,11)

'''
False
'''

注意,在第一个场景中,最好的情况实际上是O(1),因为匹配是在第一个元素处找到的。在没有匹配的情况下,必须检查每个元素,这导致最坏情况下的时间为O(n)。稍后,我们还将讨论平均案例时间。
最后,让我们引入空间复杂度的概念。

空间复杂度

很多时候,我们也关心算法使用了多少内存/空间。空间复杂度的符号是相同的,但我们不是检查操作的时间,而是检查内存分配的大小。
让我们看几个例子:

def printer(n=10):
    '''
    Prints "hello world!" n times
    '''
    for x in range(n):
        print('Hello World!')
printer()

'''
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
'''

请注意我们如何只分配’hello world!'变量一次,不是每次打印时。该算法的空间复杂度为O(1),时间复杂度为O(n)。
这是一个复杂度为O(n)的例子:

def create_list(n):
    new_list = []
    
    for num in range(n):
        new_list.append('new')
    
    return new_list
print(create_list(5))

'''
['new', 'new', 'new', 'new', 'new']
'''

注意new_list对象的大小如何随着输入n而缩放,这表明它是一个关于空间复杂度的O(n)算法。

列表

在Python中,列表充当动态数组,并通过调用它们的方法支持许多常见操作。对列表执行的两个最常见的操作是索引和分配索引位置。这些操作都被设计为在恒定时间O(1)内运行。
让我们想象一下,您想要测试不同的方法来构造一个列表,该列表是[0,1,2… 10000]。让我们继续比较各种方法,比如在列表末尾追加、连接列表,或者使用诸如强制转换和列表理解之类的工具。
例如:

def method1():
    l = []
    for n in range(10000):
        l = l + [n]

def method2():
    l = []
    for n in range(10000):
        l.append(n)

def method3():
    l = [n for n in range(10000)]

def method4():
    l = list(range(10000))

现在让我们使用timeit魔术函数测试这些方法:

%timeit method1()
%timeit method2()
%timeit method3()
%timeit method4()

'''
184 ms ± 9.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
829 µs ± 125 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
574 µs ± 134 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
194 µs ± 11.8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
'''

我们可以清楚地看到,最有效的方法是Python中内置的range()函数!
在编写高效的代码时,记住这些因素很重要。更重要的是开始思考如何使用O(1)索引。我们将在讨论数组的一般性时更详细地讨论这一点。现在,请查看下表,了解Big-O效率的概述。

用于常见列表操作的Big-O表

在这里插入图片描述

字典

Python中的字典是哈希表的实现。它们使用键和值进行操作,例如:

d = {'k1':1,'k2':2}

d['k1']

# 1

令人惊讶的是,在字典中获取和设置项的时间复杂度是O(1)!哈希表的设计考虑到了效率,我们将在课程的后面更详细地探讨它们,作为最重要的数据结构之一。同时,请参阅下表了解常见字典操作的Big-O效率:
在这里插入图片描述

结论

在本节结束时,您应该了解Big-O是如何在算法分析中使用的,并且能够计算出您开发的算法的Big-O。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/652914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

避雷器计数器测试仪

原理 图1所示为JS动作记数器的原理接线图。图1(a)为JS动作记数器的基本结构,即所谓的双阀片式结构。当避雷器动作时,放电电流流过阀片R1,在R1上的压降经阀片R2给电容器C充电,然后C再对电磁式记数器的电感线…

easyX基本概念(注释版)

0.前言 本次我给您带来easyX库系列的博文,本系列博文目的在于对原easyX库文档进行一个补充和注解,重在补充测试样例和实践。 easyX库本身并不值得过于学习,但是作为有C语言基础的C爱好者,学习easyX能让您对IT技术更加感兴趣。用…

AI完成音频创作,击败99%作者

使用AI完成音频创作 ,击败99%同类创作者 ,享受持续广告变现收益 ,下面我们来看下如何使用把~ 音频生成和投放可以分为以下两步骤: 使用AI效能公众号完成内容创作;利用喜马拉雅云剪辑发布内容 1. 内容生成 打开AI效能公…

Altium Designer 15 (AD15)新建元件库

1. 连接线 1.1 设置连接线的默认颜色,宽度:点击图标 --》按Tab键 1.2 默认使用蓝色,通用 2. 调出来元件库,然后按照元件的英文名字搜元件,拖到左边画图区域就可以了 3. 自己画一个元器件,自定义元器件 3.1…

6.14 消息队列

目录 消息队列 消息队列结构 消息队列使用步骤 消息队列创建/打开-msgget 消息队列创建/打开 - 示例 消息发送 – msgsnd 消息格式 消息发送 - 示例 笔记 消息队列 消息队列是System V IPC对象的一种 消息队列由消息队列ID来唯一标识 消息队列就是一个消息的列表。…

解决Idea中日志文件log4j.xml中http//jakarta.apache.org/log4j爆红,报错此 uri is not registered

在Idea中&#xff0c;配置log4j.xml出现“http //jakarta.apache.org/log4j/ uri is not registered”的错误信息&#xff0c;解决步骤如下&#xff1a; 1、原始的log4j.xml配置文件&#xff1a; <?xml version"1.0" encoding"GB2312" ?> <!…

ESP32(Micro Python)LVGL 四路ADC

本程序布局与上一个程序相同&#xff0c;引脚不重合&#xff0c;可以在不更换外设的情况下切换程序。由于仪表盘显示的数值范围不可调&#xff0c;实际显示的值为测量值占量程的百分比。 代码如下 import lvgl as lv import time from espidf import VSPI_HOST from ili9XX…

chatgpt赋能python:Python如何在输入之前等待30秒

Python如何在输入之前等待30秒 作为一名编程工程师&#xff0c;程序的性能和用户体验都是非常重要的。在用户输入数据之前等待一段时间可以帮助我们避免不必要的错误和提高程序的稳定性。本文将介绍如何使用Python等待30秒在输入数据。 使用Python的time模块 Python的time模…

【强烈推荐】 十多款2023年必备国内外王炸级AI工具 (免费 精品 好用) 让你秒变神一样的装逼佬感受10倍生产力 (4) AI办公

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

SLAM实战项目(2) — ROS下运行ORB-SLAM2稠密地图重建

目录 1 运行步骤 (1) 创建工作空间 (2) 修改CmakeList.txt (3) 编译 (4) 下载bag文件 (4) 编写roslaunch文件 2 运行报错 报错1&#xff1a; 报错2&#xff1a; 报错3&#xff1a; 报错4&#xff1a; ROS学习文档&#xff1a;Introduction Autolabor-ROS机器人入门…

Bert模型精讲

1.Autoregressive语言模型与Autoencoder语言模型 1.1 语言模型概念介绍 Autoregressice语言模型&#xff1a;指的是依据前面(或后面)出现的单词来预测当前时刻的单词&#xff0c;代表有ElMo, GPT等。 Autoencoder语言模型&#xff1a;通过上下文信息来预测被mask的单词&…

Linux GCC,GDB,Shell脚本,Vim的简单使用

这里写目录标题 GCC命令GDB命令Shell脚本VIM指令 GCC命令 GCC&#xff08;GNU Compiler Collection&#xff0c;GNU编译器套件&#xff09;是由GNU开发的编程语言译器 编译一个简单的.c程序&#xff1a; 四步分开写&#xff1a; gcc -E -o hello.i hello.c // 预处理 gcc -…

chatgpt赋能python:Python怎么绕过登录爬取数据

Python怎么绕过登录爬取数据 在进行网站爬取时&#xff0c;经常会发现需要登录才能访问所需要的数据&#xff0c;这给我们的爬虫程序带来了一定的难度。本文就介绍一些Python绕过登录的方法&#xff0c;让你获取到所需的数据。 1. Session维持登录状态 当我们登录一个网站时…

运维实践 | 运维打工人必备 CentOS-Linux/Stream-8 服务器系统基础安装与配置实践...

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; 专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享 “ 花开堪折直须折&#xf…

【LeetCode】python 主要元素 摩根投票法

目录 题目&#xff1a; 题解&#xff1a; 1.纯暴力&#xff08;字典&#xff09; 2. 摩根投票法 题目&#xff1a; 数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组&#xff0c;找出其中的主要元素。若没有&#xff0c;返回 -1 。请设计时间复杂度为 O(N) 、空…

电脑中的个人私密视频该怎么加密?

因为电脑内存空间较大&#xff0c;所以很多人喜欢将拍摄的视频存放在电脑中&#xff0c;这其中就会有一些比较私密&#xff0c;不适合被其他人看到的视频。为了保护这些视频的安全&#xff0c;我们需要合适的方法对其进行加密保护。下面我们就一起来了解一下电脑中的个人私密视…

GAMES101笔记 Lecture 01

目录 Overview of Computer Graphics图形学的应用场景Video GamesMoviesAnimationsDesignVisualizationVirtual RealityDigital IllustrationSimulationGraphical User InterfacesTypography 为什么要学习计算机图形学&#xff1f;Fundamental Intellectual Challenges(图形学很…

Opencv-C++笔记 (5) : opencv-形态学

文章目录 1、形态学运算与结构2、腐蚀膨胀运算3、膨胀4、自定义结构元素5、开闭运算开运算闭运算 6、形态学梯度7、其他形态学-顶帽、黑帽、击中不击中8、核函数矩形核十字形核椭圆核 1、形态学运算与结构 形态学运算是针对二值图像依据数学形态学(Mathematical Morphology)的集…

Prefix-Tuning: Optimizing Continuous Prompts for Generation

《Prefix-Tuning: Optimizing Continuous Prompts for Generation》阅读笔记 论文题目&#xff1a;Prefix-Tuning: Optimizing Continuous Prompts for Generation论文链接&#xff1a;https://arxiv.org/pdf/2101.00190论文来源&#xff1a;Arxiv &#xff08;2021&#xff0…

CentOS 7安装 Postgre

零、前置条件 系统CentOS 7&#xff0c;并已联网&#xff0c;已安装gcc或者g编译器&#xff0c;GNU make版本3.80或以上&#xff0c;系统有至少一个除root之外的普通用户user gcc安装-参考链接查看make命令的版本——make --version更新make版本-参考链接postgresql的使用一般…