高效的过滤算法

时间:2012-04-27 21:01:29

标签: java algorithm data-structures

我正在开发一个服务应用程序。我收到一个请求对象,我需要通过一组过滤器传递此对象并返回响应。我需要大约10个过滤器来传递对象。

目前,该应用程序正在对每个过滤器执行顺序搜索,如下所示:

public List<Element) FilterA(Request request){
  for(Element element in items)
  {
     // compare element to request object elements   
     // there are different field checking per object
  }
}

所以有FilterB,FilterC等,它们都以类似的方式完成,在for循环中不同的字段进行比较。

这可以通过hashset完成吗?还是二元搜索?

还是有一种有效的算法。基本上我想将O(n)改进为更少的东西。

1 个答案:

答案 0 :(得分:1)

如果您有 n 列表和 f 过滤器,则基本上只有两种方法:遍历列表并将每个过滤器应用于每个单独的元素(如果它通过则保留它)所有这些,否则将其删除);或者做你现在正在做的事情,让每个过滤器遍历整个列表。两者都具有O(n * f)的最坏情况复杂度,假设O(1)元素被移除(我建议使用LinkedList来实现这一点,如果需要,将内容复制到一个)。

您只能通过利用输入属性来提高这种复杂性。也许你可以将多个过滤器组合成一个(例如,当它们进行范围检查时),或者从列表中取出一个元素也会导致其他过滤器被删除。此外,如果您可以猜测哪些过滤器可能会删除更多元素,那么首先运行它们将会有所回报。

所以是的,这实际上取决于您过滤的内容以及过滤器的外观。在最常见的情况下,你不会赢得太多(只要你已经使用了可以在O(1)时间内删除元素的列表)但是如果你了解你的输入,你可能会获得一些东西考虑到了。