【问题标题】:Iterative Divide and Conquer algorithms迭代分治算法
【发布时间】:2017-04-07 20:02:00
【问题描述】:

我正在尝试使用分治法创建算法使用迭代算法(即无递归)。

我对如何处理循环感到困惑。

我需要将我的问题分解为更小的子问题,直到我遇到基本情况。我认为这仍然是正确的,但是我不确定如何(不使用递归)使用较小的子问题来解决更大的问题。

例如,我正在尝试提出一种算法来找到最接近的点对(在一维空间中 - 尽管我打算自己将其推广到更高维度)。如果我有一个函数 nearest_pair(L),其中 L 是 中的整数坐标列表,我怎么能想出一个分而治之的迭代算法来解决这个问题?

(不失一般性,我使用的是 Python)

【问题讨论】:

  • 您不(不能?)使用递归有什么特别的原因吗?
  • 我必须为课堂上的作业设计一个迭代算法。我确实知道递归的解决方案(使用 D&C),我相信我可以将其转换为迭代代码,并利用 D&C 方法在 O(nlogn) 时间而不是 O(n^2) 时间的事实。
  • 这就是我所担心的。特别是在课堂作业的上下文中,在展示您已经尝试过的代码之前,您不会在这里获得帮助,即使我理解您的问题更多是关于一般编程而不是特定语言。唉,你将不得不在某些时候编码,这会影响具体的答案......虽然似乎有人确实回复了!你似乎很幸运!
  • 好吧,我不是在寻找解决这个特定问题的方法。我正在寻找一般的“如何处理迭代 D&C 算法”。一个例子是更具体地针对我正在学习的内容(但不是我想要解决的内容)。

标签: python algorithm computer-science


【解决方案1】:

将任何递归算法转换为迭代算法的廉价方法是获取递归函数,将其放入循环中,然后使用您自己的堆栈。这消除了函数调用开销和在堆栈上保存任何不需要的数据。但是,这通常不是“最佳”方法(“最佳”取决于问题和上下文。)

他们以您的方式表达您的问题,听起来想法是将列表分解为子列表,在每个子列表中找到最接近的对,然后从这两个结果中取出最接近的对。要迭代地执行此操作,我认为比上面提到的通用方法更好的方法是从另一种方式开始:查看大小为 3 的列表(有三对要查看),然后从那里开始。请注意,大小为 2 的列表是微不足道的。

最后,如果您的坐标是整数,它们在 Z(R 的一个小得多的子集)中。

【讨论】:

  • 是的,你是对的。我的意思是 Z. :-)。我曾想过 Stack 的想法,但因为我试图分析这个算法并证明它的正确性,所以我想避免这个想法。如果我理解您的意思,您是否建议采用自下而上的方法?
  • @TimelordViktorious 是的;从算法的角度来看,您也可以使用不同的顺序,但我发现自下而上的迭代版本更有意义(这往往会具有更好的缓存性能,因为您会花费更多时间处理内存中彼此靠近的元素)
  • 为此,我应该对列表 L 进行线性扫描,一次(或 2 个)查看 3 个元素的分区,直到到达列表末尾。我这样做的方式是否正确?
  • @TimelordViktorious 这是第一关。请记住,D&C 将首先划分为子列表(其中最小的将是 2,这是微不足道的,然后是 3)并在每个列表中找到最近的对。然后你必须通过比较较大的列表并从这些列表中取出最近的一对,并在除法链上进行征服。自底向上迭代方法的除法步骤是隐式的。
  • 啊,对。我明白发生了什么。在第一遍中,我将采用大小为 2 或 3 的分区 L1、L2、...、Ln。然后在第二遍中,我采用 (L1+L2)、(L3+L4)、...、(Ln-1 + Ln) 作为我的大小为 (5-6) 的分区,依此类推,使用我所知道的“上一步”。
猜你喜欢
  • 2020-08-10
  • 2013-02-12
  • 2022-01-01
  • 2013-02-20
  • 2019-06-12
  • 2021-05-06
  • 2012-10-28
  • 1970-01-01
  • 2013-02-02
相关资源
最近更新 更多