除了上述内容,请注意以下事项:
- 您可以通过在构造函数中的括号中传递初始大小来{Pre}初始化字典对象中的哈希桶数组。例如:301?
Dictionary<string, string> dictionary = new Dictionary<string, string>( 301 );
根据你需要更快的是add
还是get
,你可能还需要关注优化Add/Remove
或者只是Retrieve
。这意味着有时需要更快地定位和检索而不是添加或删除它们。在你的例子中,你提到了dictionary.Add
方法,但问题也被问及整个类Dictionary<TKey, TValue>
中更快的替换。因此我假设,你不仅对add
方法感兴趣,也希望get
方法更快。在这种情况下,下一个项目可以考虑作为特定键数据模式的更快解决方案。
比Dictionary
和SortedList(int)
更快的只能是纯粹的静态/动态泛型数组Array<String>
... 但这是时间/空间的大O(N)权衡。
解释:
a.1)Dictionary
可以在O(1)内获取值(如果哈希值没有太多冲突!)
a.2)Dictionary
的add
有时是O(1),有时是O(n)。因此,如果你一个接一个地添加元素,那么大致上对于每个下一个元素索引等于下一个质数,你会获得O(n)的时间复杂度,这比0(1)大。来源:深入理解泛型字典
b.1)Array
元素通过预先分配的内存段中的int
索引值简单访问...
Array[Index]
(时间复杂度=O(1))。
因此,在dictionary
的情况下,它总是比以下操作更快: LoopSearchInEntryListTargetElement(TransformToBucketArrayIndex(GetHashCode()))
在发生冲突的情况下,条目列表可能需要迭代1到100次。
b.2)将值设置为Array
也只是内存中的int
类型值分配操作(时间复杂度O(1))。
在dictionary
的情况下,这有时需要调整大小和/或重新组织。
在您的情况下:如果您知道所有密钥字符串的不同值都不超过某个
uint.MaxValue
(32位无符号整数)(在32位环境中),并且任何密钥的最大字符串长度都不超过
4(假定字符集是从char(0)到char(255))- > 您可以轻松地将此类型的任何字符串转换为相应的
int
值(用作我们的
Array<string>
中的索引)以最快的方式编写或读取
String
值。
这将始终是O(1)的时间复杂度,用于获取和/或分配数组中的值。 (
Contains(TKey)
可以编写为
TKeyValueArray [index]!= NULL
!注意:如果TValues在您的情况下也可以为空,则创建类似于KeyValuePair的自定义类或通用类型的结构,但具有附加的
boolean
字段 - Flag Set或NotSet)
粗略示例(提示):获取字节代码并对字符串索引[0、1、2、3]中的每个字符字节代码进行简单的数学运算。
(
index =
SomeKeyString [ 0 ] * 256 * 256 * 256
+ SomeKeyString [ 1 ] * 256 * 256
+ SomeKeyString [ 2 ] * 256
+ SomeKeyString [ 3 ]
)
公式和方法可以根据情况进行优化(如果字符串仅包含拉丁字母表字符,则无需使用太多内存或者您可以在数组中表示更长的
TKey
字符串)。这是在迫切需要性能的情况下。
* 拉丁字母表使用 191 个字符
ISO 8859-1 对其称为“第一拉丁字母表”的 191 个字符进行编码,由拉丁字母表组成... *
抱歉只提供了未经详细解释的提示,如果感兴趣,我会尽力提供更详细的答案。
此外,请阅读此文
Initial capacity of collection types, e.g. Dictionary, List