深度搜素——搜索嵌套

深度搜索与回溯算法 他的基本思想是:为了求得问题的解,先选择某一种可能情况向前搜索,在搜索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直到得到解或证明无解。可以从矩阵的特点上找到规律,同行行号相同,同列列号相同,同斜线行列值之和相同(行列值之差相同)。第⼀次取1,集合变为2,3,4,因为k为2,我们只需要再取⼀个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。可以看出这个棵树,⼀开始集合是1,2,3,4,从左向右取数,取过的数,不在重复取。 阅读详情

搜索问题,扩展节点的时候会iterate一个link集合,一般就是一个for 循环,但有的时候,这个集合并不能直接得到,而是另一个搜索问题,比如n个数分k组问题的一种解法是:问题分成k个步骤,每个步骤确定一个组,具体一个组可分的方案的candidate集合就不是直接可以用for来iterate的,而是另一个搜索问题——子集问题。这就引出一个重点,iterate不光可以额用for,也可以用搜索,搜索本来就是在枚举,只不过枚举出一个解不是print输出,而是用来作为外层搜索的一个扩展节点,另外一点,搜索的结果体现在哪?side effect,搜索一般是通过side effect体现状态、结果的。

更新:

嵌套搜索的思路只是一个看问题的角度,把维度拆开来一个一个看。也可以有另一种更general的角度:二元(多元)搜索。每一次递归就是一次状态转移,一般的,这个状态是一个变量,其他的变量都是伴随状态;多元搜索的意思是状态是一个组合(x, y),类似二维平面上的搜索,看下面终极版搜索。

 

def group(A, k):
    groups, n, used = [[] for _ in xrange(k)], len(A), set()

    def grouping(t, start):
        if t == k:
            if len(used) == n: print groups
            return
        if start == n: return
        if start in used: grouping(t, start + 1)
        else:
            groups[t].append(A[start])
            used.add(start)

            def select(i, startIndex):
                grouping(t + 1, start + 1)
                for j in xrange(startIndex, n):
                    if j in used: continue
                    used.add(j)
                    groups[t].append(A[j])
                    select(i + 1, j + 1)
                    used.remove(j)
                    groups[t].pop()

            select(start + 1, start + 1)
            groups[t].pop()
            used.remove(start)
    grouping(0, 0)

 第二个版本

def group(A, k):
    groups, n, used = [[] for _ in xrange(k)], len(A), set()
    def grouping(t, start):
        if t == k:
            if len(used) == n: print groups
            return
        if start == n: return
        if start in used: grouping(t, start + 1)
        else:
            def select(i, startIndex):
                grouping(t + 1, start + 1)
                for j in xrange(startIndex, n):
                    if j in used: continue
                    used.add(j)
                    groups[t].append(A[j])
                    select(i + 1, j + 1)
                    used.remove(j)
                    groups[t].pop()
            select(start, start)
    grouping(0, 0)

递归问题法:

def group(A, k):
    if k == 1:return [[A[:]]]
    if k == len(A): return [map(lambda x: [x], A)]
    last = A.pop()
    groupings = group(A, k - 1)
    for grouping in groupings: grouping.append([last])
    for grouping in group(A, k):
        for g in grouping:
            g.append(last)
            groupings.append(deepcopy(grouping))
            g.pop()
    A.append(last)
    return groupings

终极版本:

def group(A, k):
    groups, used = [[] for _ in xrange(k)], set()
    def grouping(g, start):
        if g == k:
            if len(used) == len(A): print groups
        else:
            if len(groups[g]) > 0: grouping(g + 1, g + 1)
            for i in xrange(start, len(A)):
                if i in used: continue
                groups[g].append(A[i])
                used.add(i)
                grouping(g, i + 1)
                groups[g].pop()
                used.remove(i)
    grouping(0, 0)

 

还有一个例子:leetcode 282 expression add operators,给一串数字加操作符凑一个给定的值。问题的划分:每一步取若干数字作为一个数,参与计算,下一步取剩下的,取完为止。每一步按取几个数字作为数又分多种情况,同时确定了一个数之后按进行什么运算分又有4种情况。这里扩展节点是一个双重循环,先枚举取几个数字作为操作数,再枚举4种运算。

 

 

vector<string> addOperators(string num, int target) {
	vector<string> ans;
	function<void(int, long long, long long, string)> dfs = [&](int i, long long eval, long long pre, string s)->void {
		if (i == num.size())  {
			if (target == eval) ans.push_back(s);
		}
		else {
			for (int j = i; j < num.size(); ++j) {
				if (num[i] == '0' && j > i) break;
				string cur = num.substr(i, j - i + 1);
				long long value = stol(cur);
				if (i == 0) {
					dfs(j + 1, value, value, cur);
				}
				else {
					dfs(j + 1, eval + value, value, s + "+" + cur);
					dfs(j + 1, eval - value, -value, s + "-" + cur);
					dfs(j + 1, eval - pre + value * pre, value * pre, s + "*" + cur);
				}
			}
		}
	};
	dfs(0, 0, 0, "");
	return ans;
}

 

 

 

 

 

 

递归算法深入浅出五:深度搜索寻找图最短路径 本文讲述的是一个基于无向图为基础的图搜索,用二位数组组成的图。深度搜索、深搜。简单地说深搜就是一种**【不撞南墙不回头】** 的 **暴力算法**,基本上该算法常用递归作为设计基础,当然也有使用for循环嵌套的,本文是以递归为讲解方向的。 至于更深一层的理论在这里就不详细说明了,详细可以去搜索更多相关知识。 阅读详情

相关推荐

Python 机器学习 基础 之 模型评估与改进 【网格搜素】的简单说明

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。Python 机器学习是利用 Python 编程语言中的各种工具和库来实现机器学习算法和技术的过程。

仙魁XAN 1034

简单深度搜素入门

深度搜索dfs 我们先从一个简单的例子上切入 有一块油田,地底下存在分布不均的石油。 我们用一个字符矩阵来表示这一块油田,‘*’代表无石油,‘@’代表有油石 而且我们规定如果两个‘@’是相邻的,那么他们是同一块石油。让你来计算这块地上一共有多少块石油 例如下图: ****@ *@@*@ *@**@ @@@*@ @@**@ 我们可以看出一共有2块(我们规定上下左右以及对角线方向相邻都属于一...

qq_41268947的博客 654

hi3519dv500 os04a10输入调试

因该sensor接在soc端的iic6,在驱动中(Hi3519DV500_SDK_V2.0.1.1\smp\a55_linux\source\mpp\cbb\isp\user\sensor\hi3519dv500\omnivision_os04a10\os04a10_sensor_ctl.c)注意总线的选择。mem_process_isolation=1 改为 mem_process_isolation=0。2、OT_MIPI_SET_HS_MODE配置为LANE_DIVIDE_MODE_1。

linus 3169

深度优先搜素(dfs)

深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。它沿着树的深度遍历树的节点,尽可能深地搜索树的分支。

2301_78018480的博客 352

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1148

从零到一:Admin.NET中Swagger与Knife4jUI的深度集成实践

本文详细介绍了在Admin.NET框架中深度集成Swagger与Knife4jUI的实践方法,从基础配置到高级定制,包括认证配置、安全增强、界面主题定制等。通过Furion框架简化配置,开发者可以快速构建专业且友好的API文档界面,提升团队协作效率。

defi6farmer的博客 408

DFS复习

1.括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的括号组合。 例如,给出 n = 3,生成结果为: [ "((()))", "(()())", "(())()", "()(())", "()()()" ] 思路: 有效括号的条件:每个左括号都有一个右括号与之匹配 (1)通过dfs每次插入一个括号,并记录剩余左右括号的个数 (2)当剩余左括号比剩余右括...

aeipyuan 197

YOLOv12涨点改进 | 全网独家首发Conv改进篇 | Arxiv 2025 | 引入一种新的WConv加权卷积改进YOLOv12,显著提升其特征提取能力和目标检测精度

本文提出了一种新型加权卷积(WConv)模块,通过引入最优密度函数动态调整邻域像素权重,显著提升了YOLOv12目标检测性能。WConv在保持参数数量不变的情况下,提高了模型精度(VGG准确率提升10%)、增强了小目标检测能力,并改善了多尺度特征提取。文中详细介绍了模块原理、网络结构改进方法,并提供了核心代码实现和yaml配置文件。实验表明,该方法在图像任务中最高可降低53%的损失,虽然会带来11%的时间开销,但具有优异的鲁棒性。该技术可广泛应用于2D/3D图像处理领域。

Ai缝合怪、助力小伙伴高效发论文 216

【消息传递】解题报告

3.消息传递 【问题描述】 巴蜀国的社会等级森严,除了国王之外,每个人均有且只有一个直接上级,当然国王没有上级。如果A是B的上级,B是C的上级,那么A就是C的上级。绝对不会出现这样的关系:A是B的上级,B也是A的上级。   最开始的时刻是0,你要做的就是用1单位的时间把一个消息告诉某一个人,让他们自行散布消息。在任意一个时间单位中,任何一个已经接到消息的人,都可以把消息告诉他的一个直接上级

wu_yihao的专栏 904

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数,比较通用,包含所有对象类型,可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数。

qq_39541524的博客 827

YOLOv8进阶:SEAM注意力与Repulsion Loss双剑合璧,突破遮挡检测瓶颈

做目标检测时,最头疼的莫过于目标被遮挡的场景——行人被树木挡住一半、车辆被广告牌遮挡部分轮廓……这些情况往往让模型“犯迷糊”。但现在,有了SEAM注意力模块和Repulsion Loss排斥损失,我们就能让YOLOv8在遮挡场景下也能“拨开迷雾见真章”。这篇教程会带你一步步理解这两个技术,并亲手把它们融入YOLOv8,让你的检测模型在复杂场景下也能稳如泰山。

FJN110的博客 233

深度搜索(DFS),一种用于遍历和搜索的算法

先上百度对深度搜索的定义: 如果上边的定义没有理解,那么可以这样认为:深度搜索就是一种试探性的算法,例如你在一个十字路口想要去到某地,但是你又不认识具体的路(并且你不善言辞,万事不求人),那么你只能先选一个方向走,一直走下去直到发现此路不通,这时你又会掉头回到起始的十字路口,在往另一个方向试试,直到找到你要去的那个地方。这个不断试探的方式,套用的是递归的基本思想...

qq_41842588的博客 9239

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

这种方法通过迭代地将一个需要较多步骤的模型(称为教师模型)蒸馏成一个需要较少步骤的学生模型,每次迭代都将采样步骤减半,直到达到所需的采样步骤数量。通过渐进式蒸馏,论文将原始需要8192步采样的模型成功蒸馏为只需4步采样就能取得接近的生成质量的新模型,大幅提高了扩散模型的推理效率。这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。

q742971636的博客 1788

浅谈深搜广搜

深搜广搜深度优先搜索 Depth First Search(DFS)简介:基本思想:回溯法:深搜优缺点优点缺点分析算法的实际实现流程:算法举例例一: 深度优先搜索 Depth First Search(DFS) 简介: 深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。 基本思想: 为了求得问题的解,会将每一结点所有可能路径都走一遍,先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点(可认为是上一结点)重新选择另一结点,继续向前探索,如此反复进行,直

qq_52332769的博客 2919

PyTorch深度学习实战(7)——批大小对神经网络训练的影响

在神经网络中,批( batch )是指一次输入网络进行训练或推断的一组样本。批处理( batch processing )是指将这一组样本同时输入网络进行计算的操作。本节中首先介绍批( Batch )的基本概念,并且介绍批大小在神经网络训练过程中的影响。

盼小辉丶的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【基础算法训练】—— 深度优先搜索

被DFS强行欺负

weixin_52621323的博客 1051

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

嵌套矩形 DAG上的dp(深搜+dp)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。

liwei的专栏 1347

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度优先搜索(暴力搜算)初步感悟

到倒数第二层次,对该层次的要素进行检查,然后立马再次深入到最深层次。为了求出最长子数列,一般会定义一个全局变量数组ans,用以接收搜索出的符合题意的子数列,然后迭代出最长子数列。1.在这个栈帧中,发现该栈帧接收的前一个排列数的在数列中的索引已经大于该数列的最大索引。此时说明该子数列结束。,然后枚举所有符合题意的子数列,再对当前的最长子数列进行迭代。2.程序在遍历了整个for循环后,仍没有找到符合题意的排列数,说明,该子数列的有序排列。需要注意的是,利用暴搜解这种题型时,一定是元素可以任意排列组合的题目。

2302_79278527的博客 1311

嵌套函数 概率 记忆化搜索

嵌套函数(利用step by step解题) 题目描述 考虑函数: randomInt(N),函数随机均匀地返回一个0到N-1的整数。如果嵌套该函数,如randomInt(randomInt(N)),则概率分布发生变化,某些数字比其他数字更可能发生变化。 现在给出N, 再给出嵌套的层数times,问得到整数Y的概率是多少。 输入格式 多组测试数据。 第一行,一个整数G,表示有G组测试数据。 1 ...

Bell的博客 420

深度优先搜索_LeetCode进阶339-深度优先搜索(DFS)

概念深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。属于盲目搜...

weixin_39686353的博客 309

LeetCode 每日一题 1111. 有效括号的嵌套深度

LeetCode 每日一题 1111. 有效括号的嵌套深度 2020.4.1 难度 中等 有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。 嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。 给你一个「有效括号字符串」 seq,请你将其分成两个不相...

一起加油 6085

Elasticsearch索引之嵌套类型:深度剖析与实战应用

在Elasticsearch的实际应用中,嵌套文档是一个常见的需求,尤其是当我们需要对对象数组进行独立索引和查询时。在Elasticsearch中,这类嵌套结构被称为父子文档,它们能够“彼此独立地进行查询”。父子文档关系在Elasticsearch 5.x版本中,这种关系是通过parent-child父子type来实现的,允许一个索引对应多个type。但从6.x版本开始,由于Elasticsearch不再支持单个索引对应多个type,因此父子索引的实现方式转变为使用Join数据类型。

码到三十五 2万+

KeepHQ项目中嵌套字段搜索功能的技术解析

在复杂的分布式系统中,告警数据往往包含大量嵌套结构的信息。传统的扁平化搜索方式难以满足对深层嵌套字段的精确查询需求。KeepHQ作为开源AIOps和告警管理平台,其嵌套字段搜索功能为运维团队提供了强大的数据检索能力,本文将深入解析其技术实现。 ## 嵌套字段搜索的核心架构 ### 搜索引擎双模式设计 KeepHQ采用灵活的搜索架构,支持两种搜索模式: ```mermaid flowchar...

gitblog_07521的博客 376

力扣341. 扁平化嵌套列表迭代器(深度优先搜索)

力扣341. 扁平化嵌套列表迭代器(深度优先搜索) https://leetcode-cn.com/problems/flatten-nested-list-iterator/ 深度优先搜索 思路 在构造函数中直接解析所有元素(用数组保存),然后在遍历时依次输出即可 其实要解析一个扁平化嵌套列表,思路与dfs非常类似,将vector<NestedInteger>当作一个非连通图,每个NestedInteger是一个连通图,里面存了各个节点及其所有的邻接点。 然后在遍历每个图时,只要

小麦China的博客 204

深搜 排列数字

一道简单的OJ题目,引出的深搜三问

MythCoffee的博客 407

LeetCode刷题记189-Depth First Search(深度优先搜素)

980. 不同路径 III class Solution { int[][] g; boolean[][] v; int n, m; int ans; int[] startPoint; int total; int[][] direction = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; public boolean isAvailable(int i, int j) { if (i <

weixin_44013557的博客 139
上一篇: 表达式生成问题
下一篇: 问题划分之二,乘法原理,笛卡儿积
binling
博客等级 码龄25年 21粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值