0

我想将时间戳t和标识符映射id到对象的某个状态。我可以通过映射一个元组(t,id)->来做到这一点state_of_id_in_t。我可以使用这个映射来访问一个特定的(t,id)组合。

但是,有时我想知道t特定id(即)的所有状态(具有匹配的时间戳),有时我想知道特定时间戳(即)的id -> a set of (t, state_of_id_in_t)所有状态(具有匹配的标识符)。问题是我不能将所有这些都放在一个大矩阵中并根据我想要的进行线性搜索。我拥有状态的元组数量非常大(1m +)并且非常稀疏(一些时间戳有很多状态,其他没有等等)。我怎样才能制作这样一个可以处理通过部分键访问其内容的字典?idtt -> a set of (id, state_of_id_in_t)(t,id)

我创建了两个不同的字典dict_by_timean dict_by_id,它们是字典的字典。dict_by_time将时间戳映射t到 id 的字典,每个 id 都指向一个状态。类似地,dict_by_id将一个 id 映射到一个时间戳字典,每个时间戳都指向一个状态。这样我就可以访问我喜欢的一个状态或一组状态。请注意,两个 dicts ( dict_by_timean dict_by_id) 的“叶子”都指向相同的对象,所以这只是我访问不同状态的方式,但状态本身是相同的 python 对象。

dict_by_time = {'t_1': {'id_1': 'some_state_object_1',
                        'id_2': 'some_state_object_2'},
                't_2': {'id_1': 'some_state_object_3',
                        'id_2': 'some_state_object_4'}


dict_by_id = {'id_1': {'t_1': 'some_state_object_1',
                       't_2': 'some_state_object_3'},
              'id_2': {'t_1': 'some_state_object_2',
                       't_2': 'some_state_object_4'}

同样,请注意叶子在两个字典之间共享。

我不认为使用两个 dict 来做这件事很好,因为在添加新的时间戳或标识符时维护它们会导致双重工作,并且当我做错事时很容易导致不一致。有没有更好的方法来解决这个问题?复杂性非常重要,这就是为什么我不能只进行手动搜索而需要使用某种 HashMap 魔法。

4

1 回答 1

1

您总是可以用查找复杂性来交换添加复杂性。add您可以使用方法和方法创建一个类,而不是使用单个 dict lookup。在内部,您可以使用 3 个不同的字典来跟踪数据。一个使用(t,id)元组作为键,一个t作为键,一个id作为键。根据给定的参数lookup,您可以从其中一个字典返回结果。

于 2019-11-07T05:42:49.877 回答