这个Prolog谓词如何变得比指数更快?

时间:2015-12-04 20:26:06

标签: prolog

我有一个谓词,用于检查某个房间是否在给定的时间表内可用(包括事件)。

检查房间是否可用且未被其他事件占用,目前正以指数方式工作。我想优化它。

我目前正在做的是:

我参加第一个事件,确认它与任何其他事件都没有重叠。然后我接受第二个事件,我确认它不会与任何其他剩余事件重叠。依此类推,直到列表为空。

我一直在考虑这个问题,但是我认为只有通过使用断言才能使其更加高效。

我想知道除了使用断言之外还有其他方法可以提高效率吗?

1 个答案:

答案 0 :(得分:2)

最佳调度肯定是一个指数问题。它类似于最佳的装箱包装。这是一个完整的研究领域。

在我看来,你正在做的事情就是O(n 2 ):你要将列表中的每个元素与列表中的每个其他元素进行比较。但是,您只需执行一次,因为您需要在列表中的该元素之后与中的每个元素进行比较。因此,元素1与N-1个其他元素进行比较,但元素N-1仅与另一个元素进行比较。对于您的问题,这不是一个荒谬的时间复杂性。

interval tree方法可能是一项重大改进,因为您实际上并不会将每个元素与每个其他元素进行比较。这会将您的最坏情况时间复杂度降低到O(N log N),这被认为是一个相当大的改进,假设您的事件集足够大,可以减轻使用平衡树的常数因子成本。

我怀疑这并不是你的性能问题所在。你可能不想要你可以建立的第一个时间表,你可能想看看你可以制作哪个具有最少冲突的时间表,这将意味着尝试不同的排列。这就是你的算法遇到麻烦的地方,不幸的是,这是我的知识枯竭的地方;我不知道如何进一步优化这一过程。但我知道有很多关于过程理论和调度理论的文章可以帮助你寻找它。 :)

我不认为您的问题归结为需要更好地使用某些Prolog技术,例如动态存储。但是,您可以随时分析您的代码,看看它花费的时间在哪里,也许我们可以解决这些问题。

为了更进一步,我认为我们需要更多地了解您的问题。