队列减少算法?

时间:2012-05-31 21:59:59

标签: algorithm optimization queue

我有一个在客户端之间共享的活动队列,捕获用户活动并由另一个站点上的机器人执行。活动的一个例子可能是:

CREATE FOLDER  /docs
CREATE FILE    /docs/journal.txt
DELETE FILE    /docs/blog.txt
MOVE   FOLDER  /docs/images /docs/photos
...

通常有活动可以减少到一个或没有。例如:

CREATE FOLDER /docs
RENAME FOLDER /docs /documents

可以简单地改为:

CREATE FOLDER /documents

等等:

CREATE FOLDER /docs
RENAME FOLDER /documents
DELETE FOLDER /documents

可以从队列中完全删除。

这种减少/优化似乎是一个非常普遍的问题,在攻击它之前,我想尝试一些通用的解决方案。它看起来像一个寻路优化问题。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我不知道任何可以为您执行此操作的库或框架。另一方面,你必须自己指定它背后的逻辑,而且正如我所看到的那样,无论如何,这将是大部分工作。

以下是我采取的方法:

  1. 执行拓扑排序操作(重命名文件夹“取决于”创建文件夹等等)

  2. 每个没有依赖关系的命令都代表依赖关系树中的“root”。

  3. 从每个根开始递归折叠这些树。

答案 1 :(得分:1)

一个选项(尽管有点重量级)将遍历队列记录并模拟在程序内创建的树表示上对文件系统执行的操作。对于引用的每个目录,您可以跟踪最终对其执行的网络操作。完成后,您可以遍历修改后的树结构并输出一系列命令,表示应用于每个目录和子目录的网络转换。

希望这有帮助!

答案 2 :(得分:0)

  1. 定义所有操作(创建,重命名,移动)
  2. 定义一个Command类,其中包含操作的操作+参数。
  3. 实施一些可以告诉您是否可以组合两个命令以及该组合的结果的东西。
  4. 我必须假设您只能组合紧随其后的命令,否则您可能会引入不必要的副作用。因此,当您从yoru队列执行命令时,请开始窥视/弹出/构建命令,直到遇到无法合并到其中的命令。