【问题标题】: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 语法)用于该示例树?

标签: python algorithm recursion divide-and-conquer


【解决方案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 对应哪些子块?它将如何处理这些子块的子块?
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2021-05-19
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多