可以说我有分配给它们的标签的项目,例如“蓝色”、“大”、“灵活”。可以说我还有一本包含所有可能标签的字典。
现在的问题是:如何将所有标签压缩为单个小签名,比如说一个浮点数。要求是具有相似标签的项目具有相似的签名。
所有的标签都是永远已知的。签名应该相对较小,例如浮点数,或一组少数整数。
可以说我有分配给它们的标签的项目,例如“蓝色”、“大”、“灵活”。可以说我还有一本包含所有可能标签的字典。
现在的问题是:如何将所有标签压缩为单个小签名,比如说一个浮点数。要求是具有相似标签的项目具有相似的签名。
所有的标签都是永远已知的。签名应该相对较小,例如浮点数,或一组少数整数。
坦率地说,我认为将其归结为一个数字的计划是不值得的。只需使用 16 位 int 或 32 位 int 来表示标签。并为要应用于项目的每个标签使用其中一个字段。您对节省空间的追求只会不必要地增加复杂性。
为每个标签分配一个 ID 号。您可能希望将标签到 ID 的映射存储在单独的表中。将标签总数称为 N 和给定项目可以具有的标签数 M。标签签名将是作为 M 位基数 N 数的 ID。
所以如果 N = 50k 并且 M = 3
标签 1 = 49,999 标签 2 = 1 标签 3 = 2
标签签名 = 49,999 + 1 * 50,000 ^ 1 + 2 * 50,000 ^ 2 = 5,000,099,999
您需要超过 64 位来表示这一点。使用足够大的整数类型来表示这个值。如有必要,请使用多个整数。不要使用浮点数,你会失去精度。