当前位置: 首页 > 编程日记 > 正文

DFS template and summary

最近一直在学习Deep Frist Search,也在leetcode上练习了不少题目。从最开始的懵懂,到现在遇到问题基本有了思路。依然清晰的记得今年2月份刚开始刷题的时做subsets的那个吃力劲,脑子就是转不过来到底该如何的递归,甚至试过使用debugger一步步的来看看堆栈到底是如何调用和返回的。经过了几个月的训练后,答题有了一些心得,记录下来,作为总结。

递归函数的整体结构:

返回值。进入入递归函数的第一件事就是写出递归终止的条件。通常递归终止的条件分为两类:

(1)有一个深度的标准,例如N-Queen问题,当我们递归的检测完第N个皇后,就到达来递归返回的条件,此时,将此次递归的结果作为一个解决方案存储。

(2)到达一个序列(数组/字符串)vector/string.size()的位置,例如subsets,permutation和word break ii的问题,当传递的参数已经无法索引数组/字符串的值时退出递归。

是否进行prune的操作。这个操作并不是一定会存在的。当需要prune的时候,通常是遇到了效率问题。当输入问题的规模非常大,存储之前已经做过检测或者得出结果的递归位置会大大降低递归的工作量。这个时候我们通常会利用一些数据结构。最简单的就是一个数组,复杂一点的会是一个hash table(word break ii in leetcode)。

本层的递归处理以及下一层次的递归调用。这一部分是递归的核心,如果这一部分模型处理正确,递归的调用就成功了90%(很像如果能写出动态规划的状态方程的感觉)。

返回值。最后的return,连同递归的处理和调用,具体内容会这下面详细阐述。

递归函数的类型:

总的来说DFS的函数分为两种类型,有返回值和没有返回值。递归的层次都是通过一个参数传递到函数内部,这两种函数的编写有区别,虽然都是DFS,但思维方式却是不一样。

对于无返回值的DFS函数,通常我们是将需要获取的值作为引用类型的参数传递到函数内部,当到达DFS函数终止的条件时我们获取想要得到的值,例如N-Queen,subsets, permutations等经典的问题。这是一种从上向下的思维模式。这种函数适用于求所有可能的解的问题。通常是先对该层的问题进行处理,然后再进入下一个层次的递归。当到达递归终止的条件时存储结果。然后再逐层的返回,通常会恢复该层这遍历之前的状态,为的是下一个递归。

以下为这种递归的模板:

void DFS_no_return(vector<TYPE>& solution_set, TYPE& solution, int idx){// DFS terminate condition// Normally there are two major categories// One is for some number, already reach this depth according to the question, stop// get to the end of an array, stopif(idx == n || idx == (vector/string).size()){solution_set.push_back(solution);return;}// very seldom only when our program met some efficiency problem// do prune to reduce the workload// no need do DFS if we already get the value of current element, just returnif(hash_table[input] != hash_table.end()){return;}for(int i = 0; i < n; i++){if(visited[i] == 0){// do something for current level processvisited[i] = 1;// for next level DFSDFS_no_return(solution_set, solution, idx + 1);// return from lower level DFS and restore the status for next DFSvisited[i] = 0;}}return;
}

对于有返回值的DFS来说,我们需要获得的值是递归函数的返回值。与无返回值的递归函数相比,最大的一个区别是该类递归函数在递归调用返回之后处理该层的递归值。将从低层次递归返回的值结合本层的值处理,然后再返回给上一层递归函数调用。这种问题的思路是由上到下,再由下向上。通常是将一个复杂的问题逐层的分解成小问题,等到无法再分则返回,再将小问题拼装,然后逐层向上,返回大问题作为问题的解。通常在使用分治的思想时会使用有返回值的深度递归函数,这个应用在树中非常普遍。

以下为有返回值的递归函数的模板:

TYPE DFS_with_return(int idx){// DFS terminate condition// Normally there are two major categories// One is for some number, already reach this depth according to the question, stop// get to the end of an array, stopif(idx == n || idx == (vector/string).size()){return 1/0/"";}// very seldom only when our program met some efficiency problem// do prune to reduce the workload// no need do DFS if we already get the value of current element, just returnif(hash_table[input] != hash_table.end()){return hash_table[input];}TYPE ans;for(int i = 0; i < n; i++){if(visited[i] == 0){// normally, here should to add/concatenate the value in current level with the value returned from lower levelans += DFS_no_return(idx + 1);}}// if we need prune// keep current value herehash_table[input] = ans;return ans;
}

总结:

  1. 递归函数的整体构造:
  2. 递归函数的分类:
    • 无返回值:适用于求所有可能的解。
      • 是一种由上而下,将大问题分解,在每一层提取出需要处理的小问题,然后向下递归,遇到递归终止的条件时,就得到一个问题的解,此时返回。
    • 有返回值:使用与求个数/数量的问题。
      • 是一种从上向下,将大问题分解到无法再分,然后再将分解后的小问题返回,逐层进行加工处理,然后再返回给上一层调用。

转载于:https://www.cnblogs.com/wdw828/p/6840317.html

相关文章:

linux gcc安装

2004年4月20日最新版本的GCC编译器3.4.0发布了。目前&#xff0c;GCC可以用来编译C/C、FORTRAN、java、OBJC、ADA等语言的程序&#xff0c;可根据需要选择安装支持的语言。GCC 3.4.0比以前版本更好地支持了C标准。本文以在Redhatlinux上安装GCC3.4.0为例&#xff0c;介绍了GCC的…

js中 let var const 的差异和使用场景

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文&#xff1a; 建议使用的优先级&#xff1a;const > let > var ES6 提出了两个新的声明变量的命令&#xff1a;let和const。其中&#xff0c;let完全可以取代var&#xff0c;因为两…

bulma.css_如何建立一个? 具有Bulma CSS的特斯拉响应页面

bulma.cssby ZAYDEK由ZAYDEK 0-60 in 1.9s&#xff1f; (0-60 in 1.9s ?) 如何建立一个&#xff1f; 具有Bulma CSS的特斯拉响应页面 (How To Build A ? Responsive Tesla Launch Page With Bulma CSS) 加速可持续网页设计的到来 (To accelerate the advent of sustainable …

hdu 5099 Comparison of Android versions 枚举题意

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5099 卡读题&#xff0c;实际上题目中表述的题意并不完整&#xff0c;所以要认真读并且加上一些现实的“常识” 关于枚举题意&#xff0c;感觉应该三个人分别看&#xff0c;然后讨论出最有可能的题意是什么 为了…

去除按钮的样式

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文&#xff1a; 去除按钮默认点击效果&#xff1a; 在button标签里面添加属性&#xff1a; hover-class"none"&#xff1b; 为了方便大家&#xff0c;下面列出微信请求服务器常用的几种方…

移动应用程序和网页应用程序_您的移动应用程序运行缓慢的主要原因以及如何修复它...

移动应用程序和网页应用程序by Rajput Mehul通过拉杰普特梅胡尔(Rajput Mehul) 您的移动应用程序运行缓慢的主要原因以及如何修复它 (Top Reasons Why Your Mobile App is Slow and How to Fix it) At a time when technology is moving ahead at an express pace and people …

邮箱验证功能原理 语法 属性

邮箱验证功能原理 1 [已解决问题] 浏览: 3508次 很多地方都在注册账号的时候使用邮箱验证功能。注册后发送一封邮件到注册邮箱里面。然后点击 邮箱里面的链接 激活邮箱。 还有手机验证 这些的原理是 怎么样的。忘指点 .NET技术 ASP.NETyzy | 菜鸟二级 | 园豆&#xff1a;295 提…

直接通过OptionalAttribute, DefaultParameterValueAttribute定义缺省参数

转载于:https://www.cnblogs.com/liuxiaoji/p/4519266.html

微信小程序学习做动画效果

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 微信扫码学习&#xff0c;在线指导微信小程序动画效果的实现

rails 添加外键_如何在Rails后端中添加功能强大的搜索引擎

rails 添加外键by Domenico Angilletta通过多梅尼科安吉列塔(Domenico Angilletta) In my experience as a Ruby on Rails Developer, I often had to deal with adding search functionality to web applications. In fact, almost all applications I worked on at some poi…

基础总结篇之一:Activity生命周期

子曰&#xff1a;溫故而知新&#xff0c;可以為師矣。《論語》 学习技术也一样&#xff0c;对于技术文档或者经典的技术书籍来说&#xff0c;指望看一遍就完全掌握&#xff0c;那基本不大可能&#xff0c;所以我们需要经常回过头再仔细研读几遍&#xff0c;以领悟到作者的思想精…

spring mvc 关键接口 HandlerMapping HandlerAdapter

HandlerMapping Spring mvc 使用HandlerMapping来找到并保存url请求和处理函数间的mapping关系。 以DefaultAnnotationHandlerMapping为例来具体看HandlerMapping的作用 DefaultAnnotationHandlerMapping将扫描当前所有已经注册的spring beans中的requestmapping标注以找出…

js 微信小程序日期 时间转时间戳

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 微信小程序开发交流qq群 173683895 日期转换成时间戳&#xff1a;new Date(2018-09-03 15:46:13).getTime() 示例代码&#xff1a; console.log(new Date(2018-09-03 15:46:13)) 这个打印结果应该是…

小狗钱钱_✅每次构建待办事项列表应用程序时,都会有一只小狗? 死了?

小狗钱钱by Hrishi Mittal由Hrishi Mittal ✅每次构建待办事项列表应用程序时&#xff0c;都会有一只小狗 &#xff1f; 死了&#xff1f; (✅ Every time you build a to-do list app, a puppy ? dies ?) You know when you’re trying to learn something new, but get re…

[Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

http://blog.csdn.net/candycat1992/article/details/21617741 实现 以OpenCV的JavaCameraView为例&#xff0c;首先需要定制自己的Camera&#xff0c;主要代码如下&#xff1a;[java] view plaincopy print?import java.util.ArrayList; import java.util.List; import o…

create-react-app my-app 报错解决方法

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 第一个原因&#xff1a;可能是没安装镜像&#xff0c; 解决方法&#xff1a; $ npm install -g cnpm --registryhttps://registry.npm.taobao.org 第二个原因&#xff1a; 报错日志&#xff1a; h…

越南一难倒博士的趣味数学题

越南有一道难倒博士的趣味数学题&#xff0c;见下图&#xff1a; 在空格中填入1...9&#xff0c;可以重复&#xff0c;求使等式成立的一个组合 我吐槽一下&#xff0c;这题在NOIP中肯定算水题了&#xff0c;爆搜都能过。O(9n),n9 我就不具体代码实现了。 据说有人跟我一样的想…

学习使用React和Electron一次构建自己的桌面聊天应用程序

by Alex Booker通过亚历克斯布克 学习使用React和Electron一次构建自己的桌面聊天应用程序 (Learn to build your own desktop chat app with React and Electron, one step at a time) This tutorial was written in collaboration with the awesome Christian Nwamba.本教程…

数据库删除,存储

布局主要分两个 其中主布局是 <?xml version"1.0" encoding"utf-8"?> <EditText android:id"id/yf_input" android:layout_width"wrap_content" android:layout_height"wrap_content" android:hint"" …

【Ant Design Pro 一】 环境搭建,创建一个demo

技术交流qq群 173683895 搭建 Ant Design Pro 的前期准备&#xff1a;你的本地环境需要安装 cnpm、node。 注&#xff1a;代码块中的 $ 代表&#xff1a; $后面是在命令行输入的命令&#xff0c;举例 $ npm start 解&#xff1a;实际上是应该打开命令行输入 npm start 下…

JOptionPane

JOptionPane类 1、属于javax.swing 包。 2、功能&#xff1a;定制四种不同种类的标准对话框。 ConfirmDialog 确认对话框。提出问题&#xff0c;然后由用户自己来确认&#xff08;按"Yes"或"No"按钮&#xff09; InputDialog 提示输入文本 MessageDialog …

react 错误边界_React with GraphQL和错误边界中的自定义错误页面

react 错误边界by Abi Noda通过Abi Noda React with GraphQL和错误边界中的自定义错误页面 (Custom error pages in React with GraphQL and Error Boundaries) If you like this article please support me by checking out Pull Reminders, a Slack bot that sends your tea…

UITextField 限制用户输入小数点后位数的方法

UITextField 限制用户输入小数点后位数的方法 位数限制: limited 在UITextField的代理方法中添加类似如下代码 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {NSMutableString * futureStr…

[BZOJ 1002] [FJOI 2007] 轮状病毒

1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3045 Solved: 1687[Submit][Status][Discuss]Description 给定n(N<100)&#xff0c;编程计算有多少个不同的n轮状病毒。 Input 第一行有1个正整数n。 Output 将编程计算出的不同的n轮状病毒数输出…

微信小程序左上角返回按钮跳转到指定页面

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 在当前页面的 onUnload 执行页面跳转 onUnload: function () {wx.reLaunch({url: ../logs/logs})}, 代码讲解&#xff1a;监听页面卸载的函数&#xff0c;把页面重定向到指定的 页面&#xff1b;

过度沉思_从沉思到演出:我如何开始我的自由职业

过度沉思by Ashley MacWhirter作者&#xff1a;Ashley MacWhirter 从沉思到演出&#xff1a;我如何开始我的自由职业 (From grit to gigs: how I started my freelancing business) In less than one year, I went from a Georgia Tech Coding Bootcamp graduate to a busines…

拾人牙慧篇之———QQ微信的第三方登录实现

一、写在前面 关于qq微信登录的原理之流我就不一一赘述了&#xff0c;对应的官网都有&#xff0c;在这里主要是展示我是怎么实现出来的&#xff0c;看了好几个博客&#xff0c;有的是直接复制官网的&#xff0c;有的不知道为什么实现不了。我只能保证我的这个是我实现后才贴出来…

win7旗舰版下配置IIS服务器

选择上述的插件后&#xff0c;Windows 需要更新一段时间&#xff0c;并重启电脑 测试是否安装成功&#xff1a;http://localhost 注意&#xff1a;默认端口号是 80&#xff0c;不能和tomcat 的 80 端口同时重启 常见问题&#xff1a; 1.默认页面或者新添加的网站一直出现…

微信小程序 加载中 动画效果

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 效果图&#xff1a; 代码&#xff1a; <view class"line"><image src"../../img/line.png"></image></view>.line {height:1px;position:absolute;animat…

java开放源码_开放源码的第一周:我是如何参与的,以及我学到的东西

java开放源码by Chak Shun Yu泽顺宇 开放源码的第一周&#xff1a;我是如何参与的&#xff0c;以及我学到的东西 (My first week of open source: how I got involved, and what I’ve learned) When I started to write this post, I had finished my first serious week of …