Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以设计一个比.NET字典性能更一致的数据结构?_C#_.net_Data Structures_Dictionary_Hashtable - Fatal编程技术网

C# 是否可以设计一个比.NET字典性能更一致的数据结构?

C# 是否可以设计一个比.NET字典性能更一致的数据结构?,c#,.net,data-structures,dictionary,hashtable,C#,.net,Data Structures,Dictionary,Hashtable,正如Simon Cooper在这篇优秀的文章中所讨论的那样,.NET字典的内部结构和流程是一个高度优化的设计 MSDN文档声明,Add(TKey,TValue)为O(1)——除非字典的元素计数已满,否则必须首先执行动态调整大小操作,从而在这些接合处使Add()为O(n) 随着字典的增长,调整大小的操作变得越来越不频繁,因此可以说,在较大的n上平均,Add()接近O(1) 这一点由Cooper在n/2 add操作中的总运行时间作为n的函数来证明 但是,Add()的平均最坏情况性能为O(n) 我的问

正如Simon Cooper在这篇优秀的文章中所讨论的那样,.NET
字典的内部结构和流程是一个高度优化的设计

MSDN文档声明,
Add(TKey,TValue)
为O(1)——除非字典的元素计数已满,否则必须首先执行动态调整大小操作,从而在这些接合处使Add()为O(n)

随着字典的增长,调整大小的操作变得越来越不频繁,因此可以说,在较大的n上平均,Add()接近O(1)

这一点由Cooper在n/2 add操作中的总运行时间作为n的函数来证明

但是,Add()的平均最坏情况性能为O(n)

我的问题是:是否有可能设计一个比.NET字典性能更一致的数据结构

具体来说,我希望添加、删除和检索操作的平均最坏情况性能都是O(1)

请注意,性能一致性(“大O”)是唯一相关的设计标准。内存利用率和绝对性能(包括群集程度和缓存性能)不是相关的设计标准


选择一个比预期容量大得多的初始容量是一种选择,但这是一个初始化步骤,我正在寻找一种数据结构设计。

您是否尝试过创建一个足够大的字典

泛型O(1)基本上是一个数组。通过索引访问。或分层数组(4字节键,数组指向数组,数组指向数组指向数组,以节省空间)

还有别的吗?不,对不起


很多高性能的东西都使用预分配的数组。

您是否尝试过(没有双关语)
SortedDictionary
?在每次插入时保证O(1)的唯一数据结构是链表。您是否有一些特殊的需求决定了这种需求?选择一个初始容量>>
n
;-)@波托斯塔:如果有这样的结构,我们都会使用它,而不是费心去选择您可以向每个方法调用添加
睡眠(5000000)
;然后,分期偿还,每次调用都将
O(1)
…?我想到的一个解决方案是预先分配
字典
,使其大小远远大于预期需要。但我所追求的实际上是一个数据结构设计,它的添加、检索、删除平均最坏情况性能都是O(1)。根据定义。使用线性索引到位置转换的基于索引的访问是关于我所知道的一件事,它提供了总O(1)-没有插入/删除项的能力,也没有让其他项改变位置的能力。