独特的键值对集合

Pat*_*ski 9 .net c# collections big-o

有没有允许任何结构BOTH这些操作:

  • collection.TryGetValue(TKey, out TValue)
  • collection.TryGetKey(TValue, out TKey)

在比O(n)更好的时间?

我的问题:

我基本上需要能够非常快速地检索密钥的值值的密钥,而不会重复内存(因此两个字典是不可能的).

非常重要的说明:所有键都是唯一的,所有值都是唯一的.有了这些信息,我觉得应该可以在比O(1)for .TryGetValue和O(n)更好的时间内完成这项任务.TryGetKey.

编辑:

就我而言,我strings和之间有一个映射ints.有大约650,000个键值对的文本及其ID.所以我基本上想要获取具有特定ID的字符串,但也要获取某个字符串的ID.

Ktt*_*Ktt -2

你可以做这样的事;

Dictionary<string, string> types = new Dictionary<string, string>()
            {
                        {"1", "one"},
                        {"2", "two"},
                        {"3", "three"}
            };

            var myValue = types.FirstOrDefault(x => x.Value == "one").Key;
Run Code Online (Sandbox Code Playgroud)

  • `Dictionary&lt;TKey, TValue&gt;.FirstOrDefault()` 是 `O(n)`,而不是 `O(1)`。 (3认同)
  • 不,这不取决于有多少项目。这正是大 O 表示法的作用。“O(1)”意味着您始终可以以 1 的时间复杂度查找某个项目,无论集合中有多少个项目,而使用“O(n)”,一个项目的查找会随着项目数量的增加而线性扩展。列表中的项目。您的代码显示了后者(“FirstOrDefault()”将在最坏的情况下迭代集合中的所有项目),这显然是 OP 没有要求的。 (3认同)
  • @Ktt:如果有答案,他就会发布。我认为应该可以创建这样的集合,但框架中没有。它需要额外的内存,但不会像两个字典那样加倍。但如果这不是问题我会使用后者,这是最简单的方法。 (3认同)
  • 我不怪你:)你关于 O(n) 的说法是对的。这就是为什么我想看到你的答案。我猜@TimSchmelter 有一个观点,也许实现你自己的集合是一个更好的主意 (2认同)