C# 高效的标签数据结构?

C# 高效的标签数据结构?,c#,data-structures,bitarray,C#,Data Structures,Bitarray,假设您希望序列化和反序列化stackoverflow帖子,包括它们的标签,并尽可能节省空间(以二进制形式),但在进行标签查找时也要考虑性能。这种情况下有好的数据结构吗 Stackoverflow有大约28532个不同的标记,您可以创建一个包含所有标记的表并为它们分配一个整数,此外,您还可以按频率对它们进行排序,以便最常见的标记具有最低的数字。从搜索和存储的角度来看,仍然像字符串一样以“13245”格式存储它们似乎有点低效 另一个想法是将标记保存为变量位数组,这从查找和序列化的角度来看很有吸引力。

假设您希望序列化和反序列化stackoverflow帖子,包括它们的标签,并尽可能节省空间(以二进制形式),但在进行标签查找时也要考虑性能。这种情况下有好的数据结构吗

Stackoverflow有大约28532个不同的标记,您可以创建一个包含所有标记的表并为它们分配一个整数,此外,您还可以按频率对它们进行排序,以便最常见的标记具有最低的数字。从搜索和存储的角度来看,仍然像字符串一样以“13245”格式存储它们似乎有点低效

另一个想法是将标记保存为变量位数组,这从查找和序列化的角度来看很有吸引力。因为最常见的标签是第一个,所以您可以将标签放入少量内存中

问题当然是不常见的标记会产生巨大的位数组。对于0的大跨度,是否有“压缩”位数组的标准?还是应该完全使用其他结构

编辑


我不是在寻找一个DB解决方案,也不是一个需要在内存中保存整个表的解决方案,而是一个用于过滤单个项的结构

您需要第二个表,其中包含两个字段:tag\u id question\u id


就这样。然后在tag_id、question_id和question_id、tag_id上创建索引,这将覆盖索引,因此所有查询都将非常快。

不破坏您的问题,但28k记录实际上并不多。您是否过早地进行了优化? 我首先坚持在DB表上使用“常规”索引。他们使用的苛刻的启发法通常是非常有效的,而且不是微不足道的(或者如果你可以的话,是否真的值得及时付出努力,并且收益是否足够大?)

另外,根据您实际执行标记查询的位置,用户是否真的注意到您优化的200毫秒时间增益

先测量再优化:-)

编辑

如果没有DB,我可能会有一个主表,其中包含所有标签和一个ID(如果可能的话,将其保存在内存中)。将定期分类的ID列表与每篇文章放在一起

不确定有多少基于公共性的存储会有所帮助。一个排序的列表,你可以在其中进行常规的二进制搜索,这可能证明足够快;措施:-)

在这里,您需要迭代每个标记查询的所有帖子

如果最终速度变慢,您可以求助于为每个标记存储一袋post标识符。但是,此数据结构可能会变得有些大,并且可能需要查找和读取文件


对于较小的表,可以根据散列值(包含重复项)构建一个表。这样,你就可以用它快速找到一个较小的候选帖子列表,需要进一步检查这些帖子是否匹配。

我感觉你把问题抽象得太多了;您没有详细说明如何访问数据结构,这一点非常重要


也就是说,我建议计算每个标签的发生次数,然后使用最短的编码,可以用于标签。这并不完全完美,但我会坚持下去,直到你证明这是不合适的。然后,您可以将代码与每个问题相关联。

如果您想有效地查找特定标记中的问题,则需要某种索引。也许,所有标记对象都可以有一个引用数组(引用、指针、numeric id等),指向使用此特定标记标记的所有问题。这样,您只需找到标记对象,就有一个数组指向该标记的所有问题。

在这个场景中没有DB,问题是关于结构的,假设该场景是正确的;)