我需要存储键(字符串)-索引(数字)-值(字符串)的组合,以便能够:
- 有一个索引 - 选择值(很多时候,直接访问是可取的)
- 有一个索引 - 选择一个键(经常)
- 有一个键 - 选择一个值(很少)
所有键-键对都是唯一的。索引是单调的(例如从 0 到 10,000)。数据到达时未排序。排序并不重要。
当前的实现 - 2 个对称字典 + 列表:
TKMLibraryKey = string;
TKMLibraryLine = string;
fText: TList<TKMLibraryLine>;
fDictionaryKeyIndex: TDictionary<TKMLibraryKey, Word>;
fDictionaryIndexKey: TDictionary<Word, TKMLibraryKey>;
内存占用 -(V, K + I, I + K) * n
如何才能让这变得更容易呢?也许有某种带有对称对的字典,比如键-键?这样你就可以将自己限制在两个集合中:
fText: TList<TKMLibraryLine>;
TBiDiDictionary<TKMLibraryKey, Word>;
仅基于标准类,无需任何外部库。
我通过其后继者 TDictionary 看到了它的实现,如下所示:
上面的代码是记事本的示例,我尚未对其功能进行测试。这仅意味着通过索引添加和删除元素,但不更改现有元素。
@Alekcvp 给了我一个想法。
首先,当然,你可以稍微优化一下:
此外,根据 @Alekcvp 的建议(仅不重复行):
总的来说,两个常用脚本的访问时间复杂度为 O(1),而一个罕见脚本则通过字典进行访问。
内存占用 -
(V, K, K + I) * n