week03学习总结

算法训练营第三周 学习笔记

问题

  1. 难度开始加大了,好反复看好几遍,基础太差,练习不够。

第7课 | 泛型递归、树的递归

1.递归的实现、特性以及思维要点

  • 树的面试题解法一般都是递归
    -递归 Recursion
    • 递归 - 循环
    • 通过函数体来进行的循环
    • 类似于栈的形式一层一层进去,栈本身就是递归调用时,系统给我们做的调用栈

Python 代码模板

// python
def recursion(level, param1, param2, ...):
	# recursion terminator 递归终止条件
	if level > MAX_LEVEL:
		process_result
		return
		
	# process logic in current level 处理当前层逻辑
	process(level, data...)
	
	# drill down 下探到下一层
	self.recursion(level+1, p1, ...)
	
	# reverse the current level status if needed 清理当前层
	

Java 代码模板

// Java
public void recur(int level, int param) { 
  // terminator 
  if (level > MAX_LEVEL) { 
    // process result 
    return; 
  }
  // process current logic 
  process(level, param); 
  // drill down 
  recur( level: level + 1, newParam); 
  // restore current status 
 
}

1.不要进行人肉递归
2.找最近重复性。找到最近最简方法,将其拆解成可重复解决的问题(重复子问题)
3.数学归纳法思维

第8课 | 分治、回溯

1.分治、回溯的实现和特性

  • 分治 Divide & Conquer
  • 分治和回溯是一种特殊的递归

分治代码模板

# Python
def divide_conquer(problem, param1, param2, ...): 
  # recursion terminator  递归终止条件
  if problem is None: 
	print_result 
	return 
  # prepare data 处理当前逻辑
  data = prepare_data(problem) 
  subproblems = split_problem(problem, data) 
  # conquer subproblems  下探到下一层
  subresult1 = self.divide_conquer(subproblems[0], p1, ...) 
  subresult2 = self.divide_conquer(subproblems[1], p1, ...) 
  subresult3 = self.divide_conquer(subproblems[2], p1, ...) 
  …
  # process and generate the final result 将最终结果合并
  result = process_result(subresult1, subresult2, subresult3, …)
	
  # revert the current level states 清理当前层
  • 回溯 Backtrcking
  • 回溯法采用试错的思想,它尝试分步的去解决一个问题,在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。
  • 回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
    • 找到一个可能存在的正确的答案
    • 在尝试了所有可能的分步方法后宣告该问题没有答案。
  • 在最坏的情况下,回溯法会导致一次复杂度为指数时间的计算。
  • 典型例题:八皇后,位运算

你可能感兴趣的:(算法与数据结构)