列表操作复杂度

2024-03-27

我一直认为List<T> in C#是一个经典的链表,但最近我读到它实际上是由数组内部支持的。

这是否意味着当我们插入到列表的开头时,它是 O(n) 操作,因为其他元素需要像简单数组一样进一步移动一个位置?每次我们添加一个新项目时,都会创建容量更大的新数组吗?或者它是某种混合体,例如ArrayList in Java?

如果有人对 C# 列表操作的复杂性有一些联系,那就太好了。


你的假设是正确的。您可以在 MSDN 上找到记录的操作的复杂性:

List<T>.Insert https://msdn.microsoft.com/en-us/library/sey5k5z4(v=vs.110).aspx:

此方法是一个 O(n) 操作,其中 n 是 Count。

List<T>.Add https://msdn.microsoft.com/en-us/library/3wcytfd1(v=vs.110).aspx:

如果Count已经等于Capacity,则通过自动重新分配内部数组来增加List的容量,并且在添加新元素之前将现有元素复制到新数组中。

如果 Count 小于 Capacity,则此方法的操作时间复杂度为 O(1)。如果需要增加容量以容纳新元素,则此方法变为 O(n) 操作,其中 n 是 Count。

是的,容量会根据需要增加,但是不会,容量不会增加every添加操作。正如我们在参考源中构造函数的文档 http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,49,列表有一定的基础容量,容量为doubled每次超过时:

// Constructs a List. The list is initially empty and has a capacity
// of zero. Upon adding the first element to the list the capacity is
// increased to 16, and then increased in multiples of two as required.
public List() {
    ...
}

因此,简而言之,选择正确的列表取决于您的需求。这个答案比较了基于数组的列表中常见操作的复杂性(例如List<T>)和链表(例如LinkedList<T>):

  • .NET 集合类的渐近复杂度 https://stackoverflow.com/a/851972/87698
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

列表操作复杂度 的相关文章

随机推荐

  • r 两个方向都有误差条的散点图

    如何创建在两个方向上带有误差线的散点图 通常误差线位于垂直方向 即 y 值的不确定性 但是我的数据的 x 值也存在不确定性 X ErrX Y ErrY 1 0 0 1 3 0 0 2 1 5 0 3 4 2 0 1 etc Using gg
  • Golang 中的 Shell 扩展(命令替换)

    Go 支持变量扩展 例如 os ExpandEnv 测试 USER gt gt 测试 MyName 但有没有办法扩展可执行文件 就像 shell 的行为方式一样 就像是 os ExpandExecutable 测试 日期 H M gt gt
  • Javascript 获取 PHP 变量中的屏幕宽度

    我有一个响应式网站 其中有简单的下拉登录菜单 http www red team design com simple and effective dropdown login box当网站处于其他导航链接旁边的 桌面 视图 屏幕可用宽度 g
  • 何时使用 RabbitMQ 铲子以及何时使用 Federation 插件?

    对于我工作的公司 我们希望使用 RabbitMQ 作为我们的主要消息总线 我们的想法是 每个应用程序都使用自己的虚拟主机进行内部通信 并且通过 shovel 或联合插件 我们可以在多个虚拟主机 甚至可能是多台机器 非集群 之间共享某些类型的
  • Android 中的图像数组

    我正在尝试使用图像数组 然后将 ImageView 设置为数组中的图像之一 我的第一反应是使用带有图像名称的字符串数组 但这不起作用 我该如何做到这一点 制作一个可绘制数组 其中图像名称不带引号或什么 取决于你的图像在哪里 但如果 R dr
  • 如何使用 SSIS 包中的变量值加载新表?

    我在 SSIS 包 Var1 和 Var2 中有两个变量 这两个变量都有值 有什么方法可以将这两个变量的值放入新表中吗 例如 在新表 col1 中 其值为 Var1 col2 的值为 Var2 Thanks 有几种方法可以做到这一点 一种是
  • 即使使用复制本地,也无法加载文件或程序集“Microsoft.SqlServer.Types”

    我的网络应用程序有一份内部报告 当我在本地浏览该报告时 该报告会按预期显示 我正在使用一个rdlc and xsd有标准的apsx用于呈现报告的网页 我现在已部署到我的临时服务器 当我尝试浏览显示我收到的报告的页面时 An unexpect
  • 如何在 PDO fetchAll 中正确使用 while 循环

    请对我宽容一些 我刚刚开始学习 PDO 并且仍在寻找如何将 mysqli 转换为 PDO 的方法 所以我有一个函数可以从数据库中获取内容 function getContent db PDOconn query SELECT FROM po
  • DI 容器如何知道构造函数需要什么(ASP.NET Core)?

    我读过很多关于什么是 DI 以及如何使用它的文档 与 ASP NET Core 相关 据我了解 当框架为我实例化某个控制器时 它以某种方式知道该控制器的类需要传递给构造函数 是反射还是什么 有人可以告诉我在 ASP NET Core Git
  • 在 Rails + MySQL 中存储百分比

    我需要在 Rails 应用程序中使用百分比 在任何视图中 包括用户输入时 格式都需要是百位格式 100 000 在计算中使用时 需要以百分位的格式表示 1 00000 我的迁移 我将该列添加到现有表中 具有以下行 add column wo
  • 停止执行另一代码的代码

    我有一个R进行一些数据分析并返回的代码TRUE FALSE 有时 输入数据太大 代码就继续运行 我想要一个脚本来监视我的数据分析代码 如果它没有返回任何内容 比如说600 seconds 然后它会停止正在运行的代码并执行其他操作 就会像按S
  • C++ if 语句中的多个条件

    我对 C 编程的概念非常陌生 我想要使 用多条件 if 语句 或 和 和 在一份声明中 当我向我的大学教授询问此事时 她告诉我这是可能的 然后侮辱了我在这个问题上有限的知识 我有权访问的所有示例都显示了多个 语句 并且只有一个显示了 它没有
  • HTML - 如何在提交按钮上弹出确认窗口,然后发送请求?

    我正在学习网络开发Django并且在哪里放置负责是否提交请求的代码方面存在一些问题HTML code 例如 有一个网页包含form 博客 由用户填写 点击保存按钮后 会弹出一个窗口询问是否要confirm或不 如果点击confirm 然后发
  • 我如何用 es6(不带打字稿)开玩笑地模拟 Prisma 客户端?

    Prisma 文档提供了模拟客户端以及使用 jest 和 typescript 进行单元测试的示例 有没有办法在不使用 TypeScript 的情况下开玩笑地嘲笑客户端 如果您能举一个简单的例子 我将不胜感激 需要补充的小事情 我在项目中使
  • Python Selenium 通过链接循环

    我对 python 或编码很陌生 这部分代码允许我找到我想要单击的所有元素 单击链接打开一个新选项卡 from selenium import webdriver import time driver webdriver Chrome dr
  • 无法在 Postgres 中使用交叉表

    OSX 10 9 2 上的 Postgres 9 2 1 如果我运行以下交叉表示例查询 CREATE EXTENSION tablefunc CREATE TABLE ct id SERIAL rowid TEXT attribute TE
  • MVVM:如何将参数传递给 ViewModel 的构造函数

    我正在使用 L Bugnion 的 MVVM Light 框架 将参数 例如 Customers IS 传递给 ViewModel 构造函数的推荐方法有哪些 编辑 每个 ViewModel 所需的参数不是跨模型共享的参数 它对于每个视图模型
  • 如何在 MVC 6 beta7 中插入自定义视图引擎?

    在 beta6 中 我们能够像这样插入自定义视图引擎 services AddMvc AddViewOptions options gt options ViewEngines Clear options ViewEngines Add t
  • 如何查看交易是通过模拟账户购买还是通过真实账户购买?

    我正在使用测试帐户进行应用内购买测试 但谷歌的响应与从真实帐户进行的购买相同 如何根据谷歌的响应检查购买是否是测试 是的 您可以从Google的Purchases subscriptions API响应的purchaseType字段中检查这
  • 列表操作复杂度

    我一直认为List