【问题标题】:Queue reduction algorithm?队列减少算法?
【发布时间】:2012-05-31 21:59:59
【问题描述】:

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

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

可以完全从队列中移除。

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

有什么想法吗?

【问题讨论】:

    标签: algorithm optimization queue


    【解决方案1】:

    我不知道有任何库或框架可以为您做到这一点。另一方面,您必须自己指定其背后的逻辑,而在我看来,这将是大部分工作。

    这是我将采取的方法:

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

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

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

    【讨论】:

    • 我并不是真的在寻找图书馆,但如果有的话我会很高兴的。你能澄清一下“倒塌树木”的确切含义吗?
    【解决方案2】:

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

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:
      1. 定义所有操作(创建、重命名、移动)
      2. 定义一个包含您的操作 + 操作参数的 Command 类。
      3. 实现一些可以告诉您是否可以组合两个命令以及组合的结果是什么的东西。

      我必须假设您只能组合紧随其后的命令,否则您可能会引入不必要的副作用。因此,当您从 yoru 队列中执行命令时,请开始查看/弹出/构建命令,直到遇到无法组合到其中的命令。

      【讨论】:

      • 感谢您的好意,但我认为您不了解问题所在。首先,实现细节不相关,我只是在寻找一种算法。其次,命令可能不一定是相邻的,因此您建议的内容要么不起作用,要么需要 n*n 搜索。如果我愿意,有更好的明显解决方案。
      • 如果你找到一种 O(n) 或 O(1) 的方式来匹配 n 个元素的操作结果,我会感到非常惊讶(其中 op = areTheyCombinable?)至于第一个作为您回复的一部分,您可以将算法从我的实现细节中取出。我提供了代码快照以帮助您。祝你好运,希望你能找到这个神奇的解决方案,我也很想看到它。
      • 另外请说明您认为如何重新排列队列中的项目而不会引入不必要的副作用。例如:1=CreateFile(A, "嘿你!"), 2=SendEmail(someone@example.com, ContentsOf(A)), 3=DeleteFile(A)。如果您真的希望将 #1 和 #3 组合在一起(根据定义它们可以),那么您将破坏 #2。
      • 很高兴您愿意提供帮助,但您的回答没有帮助。对不起。接受针对您的想法的个人批评对网站和社区没有帮助,因此也不会因此而否决问题。
      • 我不是个人,我想知道这些问题的答案。老实说,我认为您无法重新排列队列,我想知道您打算如何处理副作用。
      猜你喜欢
      • 2017-12-27
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 1970-01-01
      相关资源
      最近更新 更多