我正在构建一个xlsx构建器,并且我有一系列字符串要保存在电子表格(xml文件)中。可能存在重复,因此我希望将字符串存储在地图中并增加其计数。然后,我可以存储它们在地图中的索引,而不是存储字符串,并将字符串存储在另一个xml文件中。但是检索给定字符串的索引是带有std :: map的O(n)。是否有可以更快完成此任务的数据结构?
答案 0 :(得分:2)
除非您的“单独文件”需要按字典顺序排列,否则请勿使用地图中的索引,请明确存储索引。
例如map<string, gubbins>
,struct gubbins { size_t count; size_t index; }
。
每当您向地图插入新密钥时,请为其索引指定递增计数器的“下一个”值。
使用的索引值范围是连续的,除非稍后出现并递减引用计数,然后在它到达零时从地图中删除条目。在这种情况下,您可以对索引进行“碎片整理”,但当然,如果您已经使用索引来识别其他位置的字符串,那么当然不会。
编写字符串文件的操作需要先按索引排序。你可以在线性时间内做到这一点 - 创建一个足够大的数组,然后运行地图,将每个字符串存储在正确的索引中。或者你可以随时构建字符串文件,在添加到地图时添加每个字符串。
可能使用正确的boost:multi_index
完成整个事情。
答案 1 :(得分:0)
如果您需要按排序顺序存储字符串,您可能需要查看order statistic tree数据结构,这是一个平衡的二进制搜索树,增加了额外的信息,可以确定第n个元素。树有效(在O(log n)时间内)。这为您提供了std::map
的所有原始功能,以及随机访问。
C ++标准库中没有标准的订单统计树实现,但快速的谷歌搜索应该可以解决一些问题。
希望这有帮助!