如标题所示。我知道它可能会合并删除项目之前和之后的 2 个子列表,但是在删除 LAST 元素时该方法的行为如何?换句话说:它是否以某种方式复制了删除索引之前的所有元素?我只是好奇在一个巨大的列表(假设有 5000 个元素)上使用 RemoveRange 来删除 f.e. 的性能。只有最后 2 个。
如果它进行复制,有没有办法更改一些设置列表大小的内部变量(并将其余分配的元素视为垃圾)?
我只设法找到一个信息,它是一个 O(n) 复杂度算法,但我不确定这种情况下的“n”是列表大小还是要删除的项目数。
会很高兴得到任何提示。
它将执行的操作是取出要删除的项目范围末尾之后的每个项目,并将其在列表中向上移动已删除项目的数量。就性能影响而言,在移动的项目范围结束后,每个项目都会有一个副本。这意味着从末尾删除时性能最佳(O(1)),从开头删除时性能最差(O(n))。
例如,请考虑以下列表:
index - value
0 - A
1 - B
2 - C
3 - D
4 - E
5 - F
6 - G
如果我们打电话RemoveRange(2, 2)
然后我们要删除从索引 2 开始的两项,因此我们要删除 C 和 D。
这意味着E需要复制到索引2,然后F需要复制到索引3,G需要复制到索引4。在删除最后一项后,每一项都有一次复制操作。
请注意,由于您可以将整个内存块“向上”移动两次,因此实际上比单独复制每个项目更有效。对于计算机内存来说,将整个内存块向上移动某个固定数量的字节比将内存的许多小部分移动到不同的任意位置要容易得多。但它将具有相同的渐近复杂性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)