Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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# 实现简单的字符串实习 问题_C#_Arrays_String_Dictionary_Int - Fatal编程技术网

C# 实现简单的字符串实习 问题

C# 实现简单的字符串实习 问题,c#,arrays,string,dictionary,int,C#,Arrays,String,Dictionary,Int,我有一个巨大的字符串集合,这些字符串在一些对象之间重复。我们需要的是字符串实习。这些对象通过protobuf-net进行序列化和反序列化。我知道它应该能够处理.NET字符串插入,但我的测试表明,自己使用所有这些字符串并创建一个字典(值与其唯一标识符之间的映射),用int替换原始字符串值,可以获得更好的结果 但问题在于映射。它只是单向可搜索的(我的意思是O(1)-可搜索的)。但我想在O(1)中按键或按值搜索。不仅仅是钥匙 方法 这组字符串是固定的。这听起来像一个数组。按值搜索是O(1),速度很快。

我有一个巨大的字符串集合,这些字符串在一些对象之间重复。我们需要的是字符串实习。这些对象通过
protobuf-net
进行序列化和反序列化。我知道它应该能够处理.NET字符串插入,但我的测试表明,自己使用所有这些字符串并创建一个
字典
(值与其唯一标识符之间的映射),用int替换原始字符串值,可以获得更好的结果

但问题在于映射。它只是单向可搜索的(我的意思是O(1)-可搜索的)。但我想在O(1)中按键或按值搜索。不仅仅是钥匙

方法 这组字符串是固定的。这听起来像一个数组。按值搜索是O(1),速度很快。甚至没有像字典中那样摊销——只是按指数固定

数组的问题是按键搜索。这听起来像散列。但是,嘿,
n
散列并不是均匀地分布在
n
元素数组的
n
单元中。使用模,这可能会导致碰撞。那太糟糕了

比如说,我可以创建一个
n*1.1
长度的数组,然后尝试随机散列函数,直到没有冲突,但是。。。那个只是感觉。。。错

问题: 如何通过键(字符串)和值(整数)来解决问题并实现O(1)查找时间


两个字典不是一个选项;)

两本字典就是答案。我知道您说过这不是一个选项,但如果没有理由,很难看出两个字典如何不能完美地回答您的场景,使用易于理解、快速、内存高效的代码

从这里开始,您似乎希望执行两个基本操作

myStore.getString(int); // O(1)
myStore.getIndexOf(string); // O(1)

您很高兴其中一个被实现为字典,但另一个却不是。是什么让您暂停?

您可以使用数组存储字符串,并使用哈希表将字符串与数组中的索引关联起来吗


您的
n*1.1
length数组思想可以通过阅读完美哈希和动态完美哈希来改进。维基百科有一篇关于后者的好文章。不幸的是,所有这些解决方案似乎都涉及包含哈希表的哈希表。这可能会打破您只使用一个哈希表的要求,但这里使用哈希表的方式可能不同。

为什么两个字典都没有选择?您可以将其隐藏在泛型中,并且可以随时更改实现,如果您认为有更好的方法的话。如果您预先知道它们,则很容易将它们放入一个数组中,而不会发生冲突。