Во-первых, вы должны абсолютно использовать Dictionary<TKey, TValue>
вместо Hashtable
- если вы используете BigInteger
из .NET 4, нет никаких причин, чтобы не использовать общие коллекции везде вы можете. Скорее всего, по большей части, вы не увидели бы никакой разницы в том, как он используется - просто создайте его с:
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 (п) операции.
Если вы хотите сделать это эффективно, вы должны иметь два словаря - один из a
к a^j
и один из a^j
в a
. Когда вы добавляете запись, добавьте ее в оба конца. Где-то в переполнении стека У меня есть образец кода класса, который делает это для вас, но я сомневаюсь, что смогу найти его легко. EDIT: есть один, который справляется с несколькими сопоставлениями here; версия «единого сопоставления» находится в ответе ниже этого.
В любом случае, если у вас есть два словаря, по одному в каждом направлении, это легко - очевидно, вы просто найдете a^m
как ключ во втором словаре, чтобы найти исходное значение, которое его создало.
Обратите внимание, что вам нужно будет рассмотреть, возможно ли, чтобы два оригинальных ключа оказались в одном и том же значении, - в этой точке вы, очевидно, не сможете иметь и сопоставления в одном обратном словаре был Dictionary<BigInteger, List<BigInteger>>
или что-то подобное).
Y u no use 'Dictionary'? – NullUserException
Я не знаю, как использовать словарь, и я уже понял, как делать то, что мне нужно, с хэш-таблицей, по крайней мере, по большей части. было бы легко преобразовать мою хеш-таблицу BigIntegers в словарь? – Nook
И если ваши ключи являются показателями, почему бы вам просто не проверить, есть ли ключ 'm' [присутствует] (http://msdn.microsoft.com/en-us/library/system.collections.hashtable.containskey .aspx)? – NullUserException