我有一大堆foo
类型的对象。类型foo
的每个对象都说100个属性(所有字符串)加上一个id。类型bar
的对象也具有这100个属性。
我想从集合中找到类型为foo的匹配对象,其中所有这些属性都与bar的属性匹配。
除了蛮力方法之外,还有一个优雅的算法,我们可以计算foo
个对象的签名一次,并为bar
对象做同样的事情并更有效地匹配吗?
foo
成千上万,bar
成千上万。
答案 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,但您仍然可以获得具有非常好的散列函数的好处。
结论
享受!
答案 2 :(得分:0)
Hash非常好用且易于实现..但我想建议你那个算法:
所以......算法的共性是-O(Sum(| Ai |)+ Sum(| Bi |))= O(max(Sum(| Ai |),Sum(| Bi |))= O( Sum(| Bi |))用于您的问题.Ai - 第一组的字符串唯一ID,第二组的Bi - 字符串唯一ID。
<强>更新强> Trie在最坏的情况下占用O(Sum(| Ai |)* | Alphabet |)空间。