算法设计小结

【算法建模】
算法设计 + 数据结构

【解题思路】
实际问题分析(提取算法模型)
算法模型求解(突破暴力求解)
构造测试用例(检验设计缺陷)

【考题方向】
字符串解析(扫描,统计符号流)
数据集处理(重构,搜索最优解)
二叉树建模(建树,网络拓扑图)

【常用数据结构】:8大数据结构
string, array
hash, stack, queue
linked-list, binary-tree, graph

【常用算法思想】:9大经典算法
经典搜索,深搜法,广搜法,并查集
线性优化,哈希表,前缀和,双指针
策略优化,分治法,贪心法,动态规划

【字符串处理类】
字符串过滤,贪心搜索,token检索,类似于编译器行为字符串匹配,
双指针滑窗,KMP算法字符串去重,双指针滑窗,
哈希表统计字典序排列,求解下一个字典序,最小字典序字符串拆分和合并,贪心收集,sprintf(str, …)/strncat合并

【线性表搜索类】
前缀和,
通过记录数组前i个元素和sum[i],用于求解满足特定条件的子数组问题。fun(sum[i] - sum[j]) = 0典型应用,最小子数组和,被K整除子数组和。

双指针,
设置窗口的左右两个边界指针start, end通过前后滑窗,求解特定条件下窗口问题。典型应用,快排算法找基的过程,最小长度子数组和。

哈希表,
使用哈希表快速统计数据频次。简单哈希可用字符集和数组来实现。复杂哈希可用uthash库函数来实现。

【非线性搜索类】
线性表搜索,直接使用库函数,qsort/bsearch非线性表搜索,使用回溯+剪枝,以递归和栈来实现。使用分层+剪枝,以循环和队列来实现。使用合并+分组,以循环和集合来实现。

DFS,
深度优先搜索逐步深入,用于搜索目标和全部解问题。通用模板:stack //记录递归过程每一层的信息path[] //用于记录每条路径的元素,可复用if(找到目标,到达边界)收集结果while(可选列表):剪枝处理做出选择,深入递归,撤销选择

BFS,
广度优先搜索逐层遍历,用于求解最短路径问题。通用模板:queue[] //存放每一层元素,从上至下mark[] //记录每个元素所属层级根节点入队while(队列非空):队头元素出队,判断是否满足while(下一层可选列表)剪枝处理,符合条件者放入队尾

UFS,
并查集查找合并,用于求解集合数和连通图问题。通用模板:prev[] //记录元素和集合代表的关系hash[] //统计每个集合中元素的个数init/find/union //初始化,查找,合并扩展并查集,题目中给出的是敌对关系时,需要使用扩展并查集,前半部记录朋友圈,后半部记录敌对圈。

【策略搜索类】
分而治之,
将复杂问题分解为小问题,逐个求解。典型应用,二分查找,快速排序和归并排序。

贪心算法,
各个子问题相互独立。前后无关,局部最优解构成全局最优解。典型应用,钱币找零问题字符串解析过程,字符串提取token符号流

动态规划,
各个子问题相互依赖,有重叠。前后关联,前级最优解推演后级最优解。典型应用,01背包问题,最短路劲问题。最长递增子序列,最长公共子序列。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值