【发布时间】:2021-09-14 17:02:38
【问题描述】:
我是自学算法。众所周知,分而治之是算法设计范式之一。我研究了mergeSort、QuickSort、Karatsuba Multiplication,将数组的反转计数作为这种特定设计模式的示例。虽然听起来很简单,将问题划分为子问题,递归地解决每个子问题,并合并每个子问题的结果,但我发现很难形成如何将这种逻辑应用于新问题的想法。据我了解,所有上述规范示例都提出了一个非常聪明的技巧来解决问题。例如,我正在尝试解决以下问题:
给定一个由 n 个数字组成的序列,使得两个连续数字之间的差是恒定的,以对数时间找出缺失的项。
Example: [5, 7, 9, 11, 15]
Answer: 13
首先,我想到了可以使用分而治之的方法来解决它的想法,因为天真的方法需要 O(n) 时间。根据我对分而治之的理解,我是这样处理的: 原问题可以分为两个独立的子问题。我可以递归地搜索两个子问题中的缺失项。所以,我先分问题。
leftArray = [5,7,9]
rightArray = [11, 15]
现在它说,我需要递归地解决子问题,直到它变得微不足道。在这种情况下,子问题的大小变为 1。如果只有一个元素,则缺少 0 个元素。现在合并结果。但我不知道该怎么做或它会如何解决我原来的问题。
当然,我在这里遗漏了一些重要的东西。我的问题是如何解决这种分而治之的问题。我应该想出一个像 mergeSort 或 QuickSort 这样的技巧吗?我越是看到这类问题的解决方案,感觉我是在记住解决方法,而不是理解,每个问题的解决方法都不一样。任何关于解决分而治之的心态的帮助或建议将不胜感激。我已经尝试了很长时间来发展我的算法技能,但我几乎没有进步。提前致谢。
【问题讨论】:
标签: algorithm divide-and-conquer