如何有效地匹配大型集合

时间:2011-10-25 03:42:24

标签: algorithm

我有一大堆foo类型的对象。类型foo的每个对象都说100个属性(所有字符串)加上一个id。类型bar的对象也具有这100个属性。

我想从集合中找到类型为foo的匹配对象,其中所有这些属性都与bar的属性匹配。

除了蛮力方法之外,还有一个优雅的算法,我们可以计算foo个对象的签名一次,并为bar对象做同样的事情并更有效地匹配吗?

foo成千上万,bar成千上万。

3 个答案:

答案 0 :(得分:2)

如果您拥有所有匹配的属性。这意味着它们实际上是相同的对象。那是对的吗?

在任何情况下,您都希望使用具有良好散列算法的Map / Dictionary / Table来查找匹配对象。

无论您使用哪种语言,都应该覆盖gethashcode并使用equals方法来实现它。

如果你有一个好的哈希算法,你的访问时间将是O(1)。否则它可以达到O(n)。

根据您的内存限制,您希望在地图中存储foos,存储条可能会占用您可能没有的大量空间。

答案 1 :(得分:2)

达斯维德在那里有一个观点...我从没想过我会站在黑暗的一面!

我会回顾一下我认为最适合交易的工具:

嵌入式数据库

使用嵌入式数据库的目标是,您将获得的性能将超过您可能遇到的大多数数据库解决方案。我们可以谈谈LevelDB的速度,但plenty of other people have already talked about it quite a bit所以我不会浪费时间。嵌入式数据库允许您存储键/值对,并在数据库中快速找到它们。

哈希功能

良好的散列函数将很快并且它将提供非可重复散列的良好分布。 CityHash速度非常快,而且分布非常好,但同样:我不会浪费时间lot of other people have already talked about the performance of CityHash。您可以使用散列函数来散列对象,然后使用唯一键在数据库中查找它们。

JSON序列化

JSON序列化是我上面所示的对立面:它非常慢,它会降低你使用CityHash获得的任何性能提升,但它为你提供了一种非常简单的方法来散列整个对象。您将对象序列化为JSON字符串,然后使用CityHash对字符串进行散列。尽管您已经失去了CityHash的性能提升,因为您花了很多时间将对象序列化为JSON,但您仍然可以获得具有非常好的散列函数的好处。

结论

  • 您可以在LevelDB中存储数十亿条记录,只需为其提供哈希,您就可以快速检索所需的确切值。
  • 为了生成密钥,您可以使用JSON序列化和CityHash来散列JSON字符串。
  • 使用键找到匹配的对象!

享受!

答案 2 :(得分:0)

Hash非常好用且易于实现..但我想建议你那个算法:

  1. 将100个字符串属性映射到一个大字符串(例如,每个属性具有固定长度的连接),该字符串应该是此对象的唯一ID。所以我们在第一组中有1000个字符串,在第二组中有1个字符串。
  2. 如果第一组包含第二组中的每个字符串,问题就会减少。
  3. 在第一套
  4. 上设置trie数据结构
  5. 检查trie中的字符串S是否为O(| S |)的同谋。 | S | - S的长度。
  6. 所以......算法的共性是-O(Sum(| Ai |)+ Sum(| Bi |))= O(max(Sum(| Ai |),Sum(| Bi |))= O( Sum(| Bi |))用于您的问题.Ai - 第一组的字符串唯一ID,第二组的Bi - 字符串唯一ID。

    <强>更新 Trie在最坏的情况下占用O(Sum(| Ai |)* | Alphabet |)空间。