数据结构(十)-算法设计与技巧
分而治之
分而治之是算法设计中的一种方法,它将问题分为多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题。
算法步骤:
1.分解原问题为多个子问题
2.解决子问题,用返回解决子问题的方式的递归算法
3.组合这些子问题的解决方式,得到原问题的解
1 | |
动态规划(dynamic programming, DP)
也是一种将复杂问题分解成更小的子问题来解决的优化技术。在大型公司的编程题中非常常见。
算法步骤:
1.定义子问题
2.实现要反复执行来解决的子问题部分
3.识别并求出基线条件
背包问题
给出一组项,各自有值和容量,目标是找出总值最大的项的集合。这个问题的限制是,总容量必须小于等于“背包”的容量。
最长公共子序列
给出一组项,各自有值和容量,目标是找出总值最大的项的集合。这个问题的限制是,总容量必须小于等于“背包”的容量。
矩阵链相乘
给出一系列矩阵,目标是找到这些矩阵相乘的最高效办法(计算次数尽可能少)。相乘运算不会进行,解决方案是找到这些矩阵各自相乘的顺序。
硬币找零
给出面额为d1, …, dn的一定数量的硬币和要找零的钱数,找出有多少种找零的方法。
图的全源最短路径
给出面额为d1, …, dn的一定数量的硬币和要找零的钱数,找出有多少种找零的方法。
分而治之和动态规划的区别
分而治之:把问题分解成互相独立的子问题,然后组合起来
动态规划:将问题分解成互相依赖的子问题
贪心算法
回溯算法
函数式编程(FP)
比如打印一个数组中的值,以下是命令式编程和函数式编程的区别
- 命令式编程
1
2
3
4
5
6const printArray = function (array) {
for (var i = 0; i < array.length; i++) {
console.log(array[i])
}
}
printArray([1,2,3,4,5]) - 函数式编程函数式编程需要注意的几点
1
2
3
4
5
6
7
8
9
10
11// 一个负责迭代,一个负责打印
const forEach = (array, action) => {
for (var i = 0; i < array.length; i++) {
action(array[i])
}
}
const logItem = (item) => {
console.log(item)
}
forEach([1,2,3,4,5],logItem) - 函数和数据集合是函数式编程得核心
- 函数式编程可以滥用函数,命令式编程中,使用循环,赋值,条件和函数
- 函数式编程中避免副作用和可变数据,不会修改传入函数得数据,如果需要修改也会拷贝一个副本再修改
寻找数组中的最小值
1 | |
大O表示法
- O(1)-常数级
- O(log(n))-对数级别
- O(log(n)c)-对数多项式
- O(n)-线性的
- O(n²)-二次的
- O(n的c次方)-多项式的
- O(c的n次方)-指数级别

衡量算法效率一般是考虑CPU时间占用,内存占用,硬盘占用,网络占用。当讨论大O表示法时候,说的是CPU的时间占用
O(1)
1 | |
O(n)
1 | |
O(n²)
1 | |
排序算法时间复杂度

数据结构时间复杂度

本文标题:数据结构(十)-算法设计与技巧
文章作者:Niuhk
发布时间:2022-02-26
最后更新:2022-03-22
原始链接:https://www.niuhk.cn/2022/02/26/数据结构(十)-算法设计与技巧/
版权声明:转载请注明出处!
分享