首页 > 编程问答 >二分模块的相关性

二分模块的相关性

时间:2024-07-24 11:21:55浏览次数:7  
标签:python bisection

在寻找保持列表排序而不考虑插入和删除的方法时,我遇到了 bisect sortedcontainers 模块。

bisect insort 功能是 O(n) 因为它结合了 bisect_left O(log n) 和 || |然而,一个等效的操作 insert O(n)

def insort_left(a, x, lo=0, hi=None, *, key=None):
    """Insert item x in list a, and keep it sorted assuming a is sorted.

    If x is already in a, insert it to the left of the leftmost x.

    Optional args lo (default 0) and hi (default len(a)) bound the
    slice of a to be searched.

    A custom key function can be supplied to customize the sort order.
    """

    if key is None:
        lo = bisect_left(a, x, lo, hi)
    else:
        lo = bisect_left(a, key(x), lo, hi, key=key)
    a.insert(lo, x)

for add from SortedList 模块是 sortedcontainers 由于 O(log n) 这个 原因。 现在据我了解,不包括排序是一个设计决定Python 标准库中的容器 -

来源 . 因此,在这个旨在简化性的设计决策和

旨在提高性能的设计决策之间, SortedList 有何相关性?是否存在 bisect 可能是首选的用例? bisect could be preferred?


你对于 bisect sortedcontainers 的性能分析是正确的。 bisect.insort 的时间复杂度为 O(n),因为它在内部使用 list.insert ,该操作需要 O(n) 的时间来移动元素以维持顺序。另一方面, sortedcontainers.SortedList 使用像 B 树这样的数据结构来实现 O(log n) 的插入时间复杂度。

关于 bisect sortedcontainers 的相关性,这取决于你的具体使用场景:

什么时候应该使用 bisect

  1. 你只需要维护一个已排序的列表,并且插入/删除操作不频繁。 在这种情况下, bisect.insort 的 O(n) 复杂度不会成为性能瓶颈。
  2. 你正在处理相对较小的列表。 对于小列表, bisect 的开销较低,并且可能比 sortedcontainers 更快。
  3. 你想要一个更轻量级的解决方案。 bisect 模块是 Python 标准库的一部分,因此你不需要安装任何额外的依赖项。

什么时候应该使用 sortedcontainers

  1. 你需要对大型列表执行频繁的插入/删除操作。 在这种情况下, sortedcontainers.SortedList 的 O(log n) 复杂度将提供显着的性能优势。
  2. 你需要其他排序容器,例如 SortedDict SortedSet sortedcontainers 模块提供了一系列排序容器,而 bisect 只关注列表。

总结:

bisect 是一个简单、轻量级的解决方案,适用于维护小型排序列表或插入/删除操作不频繁的情况。如果你需要对大型列表执行频繁的插入/删除操作或需要其他排序容器,则 sortedcontainers 是更好的选择。

总的来说, bisect 强调简单性和标准库的包含性,而 sortedcontainers 则优先考虑性能和功能的丰富性。选择哪一个取决于你的特定需求和优先级。

标签:python,bisection
From: 78786238

相关文章

  • 你能对 Python 类型注释进行模式匹配吗?
    你能在Python类型上进行模式匹配吗?我见过简单的例子:importbuiltinsmatchx:casebuiltins.str:print("matchedstr")casebuildins.int:print("matchedint")但我想在嵌套类型上进行模式匹配,比如Annotated[Optional[Literal["a",......
  • python Polars:替换嵌套列表的元素
    有谁知道是否可以有效地替换极坐标中嵌套列表的元素。例如:s=pl.Series('s',[[1,2,3],[3,4,5]])#replace3with10toget[[1,2,10],[10,4,5]]我已经尝试过s.to_frame().with_columns(pl.when(pl.col('s')==3)...)但是pl.when不喜欢List[bo......
  • Python 中的常量应该大写吗?
    在PEP8中,一般规则是在UPPER_CASE字符中声明常量。在现实生活中,可能有多种情况:#!envpythonDATABASE_HOST='localhost'app=Flask('myapp')base_two=partial(int,base=2)通常我们将字符串类型或数字类型变量视为不可变的,因此是常量,而不是对象或函数。问题是......
  • 多重处理会导致 Python 崩溃,并给出一个错误:调用 fork() 时可能已在另一个线程中进行
    我对Python比较陌生,并试图为我的for循环实现一个多处理模块。我在img_urls中存储了一个图像url数组,我需要下载并应用一些Google视觉。if__name__=='__main__':img_urls=[ALL_MY_Image_URLS]runAll(img_urls)print("---%sseconds---"%(......
  • Python编程时输入操作数错误
    我正在用Python编写下面的代码来模拟控制系统。但是,当我调试代码时,我面临以下问题:matmul:输入操作数1没有足够的维度(有0,gufunc核心,签名为(n?,k),(k,m?)->(n?,m?)需要1)文件“D:\ÁreadeTrabalho\GitHub\TCC\CódigosMarcela\SistemaSISO_tres_estados_new.py”,......
  • Python入门知识点 7--散列类型与字符编码
    1、初识散列类型(无序序列)数据类型分为3种:   前面已经学过了两种类型   1.数值类型:int/float/bool只能存储单个数据      2.序列类型:str/list/tuple,有序的存储多个数据--有序类型,有下标,可以进行索引切片步长操作          3.散列类型......
  • Python入门知识点 6--序列类型的方法
    1、初识序列类型方法序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据也可以对数据进行更方便的操作这个操作就是叫增删改查(crud)(增加(Creat),读取查询(Retrieve),更新(Update),删除(Delete)几个单词的首字母简写)增删改查是操作数据最底层的操作(从本质......
  • Python项目流程图
    我有一个由多个文件夹组成的Python项目,每个文件夹包含多个脚本。我正在寻找一个Python库或软件/包,它们可以生成流程图,说明这些脚本如何互连并绘制出从开始到结束的整个过程。自动生成Python项目流程图确实是一个挑战,目前没有完美通用的解决方案。主要原因是:......
  • 使用 mypy 时Python中的继承和多态性不起作用
    我正在寻找用mypy做一些标准的多态性,我以前从未使用过它,而且到目前为止它并不直观。基类classContentPullOptions:passclassTool(Protocol):asyncdefpull_content(self,opts:ContentPullOptions)->str|Dict[str,Any]:...子类classGoogle......
  • Python函数获取匹配和错误记录
    我有一个以下格式的json文件:[{"type":"BEGIN","id":"XYZ123"},{"type":"END","id":"XYZ123",},{"type":&......