【问题标题】:Is there a built in type for a lookup/reverse lookup table? [duplicate]是否有用于查找/反向查找表的内置类型? [复制]
【发布时间】:2014-03-21 18:32:56
【问题描述】:

我正在尝试实现 Baudot 字符编码。现在,我正在使用两个字典,它们只是彼此的镜像:

Dictionary<char, int> Lookup = new Dictionary<char, int> {
    { ' ', 0x100100 },
    { '-', 0x011000 },
    { '/', 0x010111 },
    { '0', 0x001101 },
    { '1', 0x011101 },
    ...
};

Dictionary<int, char> Reverse = new Dictionary<int, char> {
    { 0x100100, ' ' },
    { 0x011000, '-' },
    { 0x010111, '/' },
    { 0x001101, '0' },
    { 0x011101, '1' },
    ...
};

是否已经有一个内置类型可以处理这个问题?比如:

var lookup = new Lookup<int, char>();
lookup.GetByKey(0x100100);
lookup.GetByValue('c');

当我搜索“反向查找”或“查找表”时,我找不到任何东西,一切似乎都与 DNS 或 LinqToSql 有关。

(我正在使用Baudot,因为它对于某些Cospas Sarsat 设备是必需的)

【问题讨论】:

  • 对于介于 0 和您拥有的最大 int 值之间的每个 int 值,您的 Dictionary 中是否有一个 char 值(即关于 int 键,它们是稀疏的还是完全填充的)?跨度>
  • 你说的是这么少的字符,我认为一个简单的单个数组就足够了。使用 int 键直接索引来获取 char 会比任何东西都快,并且从 char 到 int(即 indexOf)的简单线性搜索可能不会比小数组的累积 Dictionary 开销慢多少。其他解决方案似乎有点矫枉过正。
  • @hatchet Baudot 是六位编码,所以不存在每个可能的 int 的值。我还没有真正想出在这种情况下该怎么做。
  • 只需使用不在 Baudot 字符集中的 sentinel char 值来指示未使用的位置。映射到 Baudot 字符的最小和最大 int 值是多少?我们不是在谈论一个非常小的系列吗?
  • 哎呀,你甚至不需要一个数组,只需使用一个由 Baudot 字符组成的字符串常量,其中标记字符占据序列中的任何空位。

标签: c# .net data-structures


【解决方案1】:

我认为您需要Bi-Directional 字典。有许多这样的实现可用。我喜欢这个链接中的那个:

http://blogs.microsoft.co.il/blogs/ranw/BDirectional.txt

唯一的先决条件是键和值不应属于同一类型,这在您的情况下适用。

【讨论】:

    【解决方案2】:

    我认为没有这样的事情...... 一些扩展方法怎么样? 使用以下方法创建第一个字典,然后创建第二个字典。通过拥有两个字典,您将拥有两个哈希表,并且您的访问权限始终为 O(1)。

    public static class DictionaryExtensions
    {
        public static IDictionary<U, T> Reverse<T, U>(this IDictionary<T, U> dictionary)
        {
            var result = new Dictionary<U, T>();
            foreach(var x in dictionary)
            {
                result[x.Value] = x.Key;
            }
    
            return result;
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果是我,我只会有一个配对列表。

      class WhateverPair
      {
          int Binary {get;private set;}
          char TheChar {get;private set;}
          public WhateverPair(int b, char c) { Binary = b; TheChar = c; }
      }
      

      然后就像填写第一本字典一样填写您的列表。

      List<WhateverPair> encodingtable;
      char result = encodingtable.First(x=>x.binary == 0x010010).thechar;
      int reverse = encodingtable.FirsT(x=>x.thechar == '1').binary;
      

      【讨论】:

      • 是的,它会起作用,但效率会降低。我更喜欢有两个字典(两个哈希表)。
      猜你喜欢
      • 2015-11-26
      • 2021-10-25
      • 2018-03-24
      • 2015-05-26
      • 1970-01-01
      • 2014-02-17
      • 2012-02-28
      • 2020-12-01
      • 2021-01-24
      相关资源
      最近更新 更多