分治算法在子列表中找到两个匹配的元素

Posted

技术标签:

【中文标题】分治算法在子列表中找到两个匹配的元素【英文标题】:Divide and conquer algorithm to find two matching elements in a sublist 【发布时间】:2021-10-18 13:45:47 【问题描述】:

我正在尝试实现以下图片。

这说明的逻辑如下:比较一个块的第一个实体和最后一个实体,如果它们不同,则将其分成两个块。然后,比较分割块的第一个和最后一个实体。重复它,直到我们找到两个相同的实体。

我刚开始编程,刚刚学习了递归逻辑、堆栈和队列。我正在尝试使用 DFS 来实现它,但我不确定如何将它分成两部分并重复。你能帮我找到一个关键字去谷歌吗?或者我可以使用任何匹配的数据结构?

我写了这段代码,但这似乎不起作用。

def getBln(idx1, idx2):
  pass 

#DFS
def videoRcsv():
  if getBln(idx1, idx2) == True:
    break
  else:
    videoRcsv(idx1, idx2/2),videoRcsv(idx2/2, idx2)

def main():
  pass

main():

【问题讨论】:

我认为您不需要为此使用显式堆栈或队列。您可能希望使用递归,这将利用语言的调用堆栈。 是的,我知道我需要以递归方式使用 DFS。但我不确定如何制作树节点 目前还不清楚这个算法到底应该完成什么。我觉得推车(解决方案)放在马前(明确的问题描述/规范)。如果你试图在一个列表中找到两个相等的元素,这将不起作用,因为这些元素可能位于主列表的不同部分。整体分治范式通常用于搜索和排序,但不清楚在这种情况下要搜索什么。一些具有预期输出的输入示例可能有助于解释目标。 实际预期的输出是什么?您的代码在任何地方都没有return,也没有任何尝试打印任何内容...您可以编辑您的问题并提供创建初始树的代码,然后添加预期的输出(不是图像,而是 Python 语法)用于该示例树? 【参考方案1】:

这里不涉及DFS,使用递归来实现图片。考虑最简单的情况(函数返回答案的条件 - 2 个相等或不相等的实体)并从该点继续。

【讨论】:

你能检查我的修改吗?我走对了吗? 看起来不错,但您需要一个边缘情况,其中没有第一个和最后一个实体相似。【参考方案2】:

你为什么不使用循环?

    int l = 0; // first block
    
    int r = idx2; // index of last block
       
    while( l < r )
          if( blocks[l++] == blocks[r--] )
              // do smth
          
    

【讨论】:

这将如何处理两个独立子树上的递归调用?换句话说,这会将数组blocks 拆分为blocks'blocks''lr 对应哪些子块?它将如何处理这些子块的子块?

以上是关于分治算法在子列表中找到两个匹配的元素的主要内容,如果未能解决你的问题,请参考以下文章

分治算法解最大子序列和问题

基础算法 分治法求最大最小元

(学习6)特殊的分治策略算法——BFPTR

创建两个不均匀子问题的分治算法的时间复杂度。

分治算法的完美使用----归并排序

数据结构 8 基础排序算法详解快速排序的实现了解分治法