分治算法在子列表中找到两个匹配的元素
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''
。 l
和 r
对应哪些子块?它将如何处理这些子块的子块?以上是关于分治算法在子列表中找到两个匹配的元素的主要内容,如果未能解决你的问题,请参考以下文章