我有一个包含^ j值的哈希表。 j是键,^ j是值。 我现在正在计算另一个值a ^ m。我基本上想看看^ m是否在哈希表中。 我使用了ContainsValue fn。找到价值。我如何找到价值的关键?
以下是我想要实现搜索值的小片段。
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****
}
这会改变什么吗?我在for循环中搜索的事实?
答案 0 :(得分:1)
最快的方法可能是遍历哈希表的DictionaryEntry
项以查找值,从而为您提供密钥。我不知道怎么做。
答案 1 :(得分:1)
首先,您绝对应该使用Dictionary<TKey, TValue>
而不是Hashtable
- 如果您在.NET 4中使用BigInteger
,则没有理由不在任何地方使用通用集合 你可以。大多数情况下,您可能会发现它的使用方式没有区别 - 只需创建它:
Dictionary<BigInteger, BigInteger> map =
new Dictionary<BigInteger, BigInteger>();
开头。需要注意的一点是,如果地图中没有键,索引器将抛出异常 - 使用TryGetValue
获取值(如果存在)和bool
来表示是否存在确实存在。
至于按值查找密钥 - 从Dictionary
无法有效地 。您可以使用LINQ搜索所有条目,这是最容易完成的:
var key = map.Where(pair => pair.Value == value)
.Select(pair => pair.Key)
.First();
但是这将迭代整个字典,直到找到匹配,因此它是一个O(n)操作。
如果您想有效地执行此操作,则应保留两个词典 - 一个从a
到a^j
,一个从a^j
到a
。添加条目时,可以双向添加。 Stack Overflow上的某个地方我有一些类的示例代码可以为你做这个,但我怀疑我能够轻松找到它。编辑:有一个处理多个映射here; “单一映射”版本在该答案之下。
无论如何,一旦你有两个字典,每个方向一个,这很容易 - 显然你只需要在第二个字典中查找a^m
作为键来找到创建它的原始值。
请注意,您需要考虑两个原始密钥是否有可能以相同的值结束 - 此时您显然无法在一个反向中同时拥有两个映射字典(除非它是Dictionary<BigInteger, List<BigInteger>>
或类似的东西)。
答案 2 :(得分:0)
private object GetKeyByValue(object searchValue)
{
foreach (DictionaryEntry entry in myHashTable)
{
if (entry.Value.Equals(searchValue))
{
return entry.Key;
}
}
return null;
}
答案 3 :(得分:0)
修改 已更改为使用Dictionary<TKey, TValue>
Dictionary<TKey, TValue>
是IEnumerable<KeyValuePair<TKey, TValue>>
。如果直接对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);
}
}
,则可以获得每个条目的键和值。
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();
}
}
如果您有更新版本的.Net框架,可以使用Linq查找匹配项,并将它们放在自己的集合中。这是一个显示Linq语法的代码示例:
{{1}}