C# 从哈希表c中检索值的键#
我有一个包含^j值的哈希表。j是键,a^j是值。 我现在正在计算另一个值a^m。我基本上想看看a^m是否在哈希表中。 我使用了ContainsValue fn。找到价值。我该如何找到值的键 下面是我想在哪里实现对值的搜索的一个小片段C# 从哈希表c中检索值的键#,c#,hashtable,C#,Hashtable,我有一个包含^j值的哈希表。j是键,a^j是值。 我现在正在计算另一个值a^m。我基本上想看看a^m是否在哈希表中。 我使用了ContainsValue fn。找到价值。我该如何找到值的键 下面是我想在哪里实现对值的搜索的一个小片段 Dictionary<BigInteger, BigInteger> b = new Dictionary<BigInteger, BigInteger>(); ***add a bunch of BigIntegers i
Dictionary<BigInteger, BigInteger> b = new Dictionary<BigInteger, BigInteger>();
***add a bunch of BigIntegers into b***
for(int j=0; j < n; j++)
{
z = q* BigInteger.ModPow(temp,j,mod);
***I want to implement to search for z in b here****
}
Dictionary b=newdictionary();
***把一堆大整数加到b中***
对于(int j=0;j
这会改变什么吗?我在for循环中搜索的事实?最快的方法可能是遍历哈希表的
字典entry
项来查找值,从而获得键。我不知道怎么做。首先,你绝对应该使用字典而不是哈希表
——如果你使用的是.NET 4中的大整数
,没有理由不在任何地方使用泛型集合。在大多数情况下,您可能会发现它的使用方式没有什么不同-只需使用以下工具创建它:
private object GetKeyByValue(object searchValue)
{
foreach (DictionaryEntry entry in myHashTable)
{
if (entry.Value.Equals(searchValue))
{
return entry.Key;
}
}
return null;
}
Dictionary<BigInteger, BigInteger> map =
new Dictionary<BigInteger, BigInteger>();
但这将遍历整个字典,直到找到匹配项,因此这是一个O(n)操作
如果您想有效地执行此操作,您应该保留两个词典-一个从a
到a^j
,另一个从a^j
到a
。当您添加条目时,请将其前后添加。在堆栈溢出的某个地方,我有一个类的示例代码,可以为您实现这一点,但我怀疑我是否能够轻松找到它。编辑:有一个可以处理多个映射;“单一映射”版本在该版本下面的答案中
无论如何,一旦你有了两个字典,每个方向一个,就很容易了——显然你只需要在第二个字典中查找a^m
作为一个键,就可以找到创建它的原始值
注意,你需要考虑两个原密钥是否可能以相同的值结束——在这一点上,显然你不能在一个反向字典中同时拥有这两个映射(除非它是<代码>字典/代码>或类似的东西)。< > P> <强>编辑:< /强>改为使用<代码>字典< /代码>
Dictionary
是一个IEnumerable
。如果直接对每个条目执行foreach
,则可以获得每个条目的键和值
class SomeType
{
public int SomeData = 5;
public override string ToString()
{
return SomeData.ToString();
}
}
// ...
var blah = new Dictionary<string, SomeType>();
blah.Add("test", new SomeType() { SomeData = 6 });
foreach (KeyValuePair<string, SomeType> item in blah)
{
if(e.Value.SomeData == 6)
{
Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}
}
类SomeType
{
公共数据=5;
公共重写字符串ToString()
{
返回SomeData.ToString();
}
}
// ...
var blah=新字典();
Add(“test”,newsometype(){SomeData=6});
foreach(blah中的KeyValuePair项)
{
if(e.Value.SomeData==6)
{
WriteLine(“键:{0},值:{1}”,item.Key,item.Value);
}
}
如果您有较新版本的.Net framework,则可以使用Linq查找匹配项,并将它们放在它们自己的集合中。下面是一个代码示例,展示了一点Linq语法:
using System;
using System.Collections;
using System.Linq;
class SomeType
{
public int SomeData = 5;
public override string ToString()
{
return SomeData.ToString();
}
}
class Program
{
static void Main(string[] args)
{
var blah = new Dictionary<string, SomeType>();
blah.Add("test", new SomeType() { SomeData = 6 });
// Build an enumeration of just matches:
var entriesThatMatchValue = blah
.Where(e => e.Value.SomeData == 6);
foreach (KeyValuePair<string, SomeType> item in entriesThatMatchValue)
{
Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}
// or: ...
// Build a sub-enumeration of just keys from matches:
var keysThatMatchValue = entriesThatMatchValue.Select(e => e.Key);
// Build a list of keys from matches in-line, using method chaining:
List<string> matchingKeys = blah
.Where(e => e.Value.SomeData == 6)
.Select(e => e.Key)
.ToList();
}
}
使用系统;
使用系统集合;
使用System.Linq;
类SomeType
{
公共数据=5;
公共重写字符串ToString()
{
返回SomeData.ToString();
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var blah=新字典();
Add(“test”,newsometype(){SomeData=6});
//生成仅匹配项的枚举:
var entriesThatMatchValue=blah
其中(e=>e.Value.SomeData==6);
foreach(entriesThatMatchValue中的KeyValuePair项)
{
WriteLine(“键:{0},值:{1}”,item.Key,item.Value);
}
//或:。。。
//根据匹配项生成仅关键帧的子枚举:
var keystatmatchvalue=entriesThatMatchValue.Select(e=>e.Key);
//使用方法链接,从内联匹配项生成密钥列表:
列表匹配键=废话
.其中(e=>e.Value.SomeData==6)
.选择(e=>e.Key)
.ToList();
}
}
Y你不用Dictionary
?我不知道如何使用Dictionary,我已经知道如何使用哈希表,至少在大多数情况下是这样。把我的大整数哈希表转换成字典容易吗?如果你的键是指数,为什么不检查一下键m
?请看:@NullUser我已经创建了一个包含所有值(j,a^j)的哈希表。然后我使用for循环来计算数字z=r*biginger.ModPow(a,j,mod)。在for循环中,值a^m正是我为问题输入的值。在程序中,它是q=j*BigInteger.ModPow(a(逆),j,mod),for循环从0开始。我想你之前的答案是:@Nook:这真的不相关-基本上你有键,它们映射到值。如果您想要一种有效的方法,则需要构建另一个映射。如果你不在乎这个查找是O(n),你可以迭代代替。我从哈希表改为字典,就像…几乎每个人建议的那样。那么现在我会改变在字典b中搜索值v的方式吗?找到了v的钥匙吗?@Nook:你仍然可以使用这个答案中的答案,你只需要去掉这些石膏Dictionary
是一个IEnumerable
,而Hashtable
是一个普通的IEnumerable
(它返回对象
类型DictionaryEntry
的实例)。我将编辑答案以反映此更改…谢谢!但我也在想,既然我已经在运行for循环,那么对我来说什么是最好的方法呢o@Nook:除了对原始表执行O(N)
操作外,无法对其进行转换。关联数组/哈希表/字典不是为解决这个问题而设计的。。。你可以在第二天同时建造
using System;
using System.Collections;
using System.Linq;
class SomeType
{
public int SomeData = 5;
public override string ToString()
{
return SomeData.ToString();
}
}
class Program
{
static void Main(string[] args)
{
var blah = new Dictionary<string, SomeType>();
blah.Add("test", new SomeType() { SomeData = 6 });
// Build an enumeration of just matches:
var entriesThatMatchValue = blah
.Where(e => e.Value.SomeData == 6);
foreach (KeyValuePair<string, SomeType> item in entriesThatMatchValue)
{
Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}
// or: ...
// Build a sub-enumeration of just keys from matches:
var keysThatMatchValue = entriesThatMatchValue.Select(e => e.Key);
// Build a list of keys from matches in-line, using method chaining:
List<string> matchingKeys = blah
.Where(e => e.Value.SomeData == 6)
.Select(e => e.Key)
.ToList();
}
}