【问题标题】:Is there a way to retrieve the index of an item stored within C#s' OrderedDictionary DS in O(1)~ complexity有没有办法在 O(1)~ 复杂度中检索存储在 C#s 的 OrderedDictionary DS 中的项目的索引
【发布时间】:2020-11-26 16:07:00
【问题描述】:

换句话说 - 我如何在不迭代“GetEnumerator()”的值 (O(n)) 的情况下获得它?

例如,假设我创建了以下有序字典(名为 aOrdDict),其中包含以下对:

   INDEX      KEY                       VALUE
   0          testKey1                  testValue1
   1          testKey2                  testValue2
   2          keyToDelete               valueToDelete
   3          testKey3                  testValue3

我如何在 aOrdDict.GetEnumerator() 中显示“testKey3”的索引为 3,而无需执行以下排序:

int i = 0;
var ListedPairs = aOrdDict.GetEnumerator();
string wantedKey = "testKey3";

for(; i < aOrdDict.Keys.Count; i++)
{
    if (ListedPairs.key == wantedKey)
        break;
    listedPairs.MoveNext();
}

编辑 - 临时解决方案和一些上下文


对导致我的问题的风景进行了一些详细说明,并附有我实施的临时解决方案(类似于 Martin Liversage 在 cmets 上提出的建议):

我主要从事一些双向客户端服务器中介。 在服务器->客户端消息进入调解器并处理后, 在将其转发给客户端后,它的主体和 DateTime.Now() 值(低至毫秒)都在那个时刻 应该相互关联地存储在中介器中,打包,然后发送给客户端。

稍后,客户端向服务器发送请求,每个请求都带有特定的时间戳。

它期望接收一些存储值的范围,这些值是相邻且按时间顺序优先的 到输入时间戳。在那个阶段,订购的字典应该会派上用场 通过允许我通过键来处理存储在“timeStamp”的值(因此 - 需要一个字典),然后迭代 向后,逐个值,以与插入它们的顺序相反的顺序。 (因此 - 需要一个列表)

最终 - 我使用了:

ConcurrentDictionary<string, int> aIndicesDict

对于一对 {timeStamp, index} 对和一个

List<Tuple<string, someObject>> aSomeObjectsList

对于(时间戳,messageBody)对,

每次收到新消息时都将传入的值存储在两个集合中 从服务器发送到客户端。

然后,根据从客户端到服务器的传入请求,我们获得与输入时间戳相关的索引(来自 aIndicesDict - O(1)),允许我们从元组列表的相关索引开始向后迭代(在 aSomeObjectsList - O(1) 内直接进入相关的列表条目)。

正如我在 cmets 中所写的 - 我仍然想找到一个更有效的解决方案(内存方面)。

【问题讨论】:

    标签: c# time-complexity ordereddictionary


    【解决方案1】:

    OrderedDictionary 没有提供您想要的功能。在内部,没有从键到索引的映射。相反,您可以从键或索引映射到实际值。

    您可以构建自己的有序字典,在其中内部保存一个列表和一个数组:列表从索引映射到键,字典从键映射到值。这将提供一种从 O(1) 中的键获取索引的方法,但是由于额外的间接性,按索引读取值(并按顺序迭代)会更昂贵。如果您建立自己的集合,您还可以使用古老的OrderedDictionary 不使用的泛型。

    但是,为什么需要从键中获取索引呢?如果您使用键来查找值并且索引确实是一个顺序,那么您也许可以在值中包含“索引”(实际上是顺序)?

    【讨论】:

    • 是的,我实际上已将您建议的方法用作临时方法。但不妨保留它,看它是你自然推荐的。如果有较低的内存复杂度方法,仍然会喜欢它。我会将它添加到我的帖子中,并让这个问题引起更多共鸣,以防万一。但感谢您彻底了解:)。至于您的问题,我将在原帖中添加对手头任务/环境的详尽解释。
    猜你喜欢
    • 2020-11-01
    • 2020-11-18
    • 2021-03-23
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多