我想将时间戳t
和标识符id
映射到对象的特定状态。我可以通过映射元组(t,id)
-> state_of_id_in_t
来实现。我可以使用此映射来访问一个特定的(t,id)
组合。
但是,有时我想知道特定t
(即id
)的所有状态(具有匹配的时间戳记id -> a set of (t, state_of_id_in_t)
),有时还想知道所有状态(具有匹配的标识符{{1}) })的特定时间戳记id
(即t
)。问题是我不能将所有这些都放在一个大矩阵中并根据需要进行线性搜索。我具有状态的t -> a set of (id, state_of_id_in_t)
元组的数量非常大(1m +)并且非常稀疏(某些时间戳具有许多状态,而其他时间戳则没有等)。我该如何做一个字典,该字典可以处理通过部分键访问其内容的问题?
我创建了两个不同的字典(t,id)
和dict_by_time
,它们是字典的字典。 dict_by_id
将时间戳dict_by_time
映射到ID字典,每个ID都指向一个状态。类似地,t
将ID映射到时间戳的字典,每个时间戳都指向一个状态。这样我就可以访问一个状态或一组状态。请注意,两个字典(dict_by_id
和dict_by_time
)的“叶子”都指向相同的对象,所以这只是我访问不同状态的方式,但是状态本身是相同的python对象。
dict_by_id
同样,请注意,两个字典都共享叶子。
我认为最好不要使用两个命令,这是因为在添加新的时间戳或标识符时同时维护两个命令会导致重复工作,并且当我做错事情时很容易导致不一致。有没有更好的方法来解决这个问题?复杂性非常重要,这就是为什么我不能只做手动搜索而需要使用某种HashMap魔术的原因。
答案 0 :(得分:1)
您始终可以将添加复杂度与查找复杂度进行交易。您可以使用add
方法和lookup
方法创建类,而不用使用单个字典。在内部,您可以使用3个不同的字典来跟踪数据。一个使用(t,id)
元组作为键,一个使用t
作为键,一个使用id
作为键。根据提供给lookup
的参数,您可以从其中一个字典中返回结果。