注:此文主要用于《算法图解》一书各章节知识点概述。
第一章:
二分查找算法O(logn)
算法程序:
简单查找算法O(n)
大O运行时间:
O(logn) < O(n) < O(nlogn) < O(n²) < O(n!)
先排序,再查找
第二章:
数组:适用于读取很多
读取O(1) 插入O(n) 删除O(n)
链表:适用于插入很多
读取O(n) 插入O(1) 删除O(1)
数组与链表是所有复杂数据结构的基石
链表数组
散列表
数据库
选择排序:O(n²)
每一次都遍历,找出最大,次大,次小,最小
第三章:
递归
每个递归函数包含两部分:
基线条件:让函数不再自己调用自己,避免无限循环
递归条件:让函数自己调用自己
调用栈 用于存储多个函数的变量
递归函数调用栈
第四章:
快速排序
采用了分而治之的思想
平均时间,最佳时间 O(nlogn)
最糟时间 O(n²)
算法
分而治之
1、找出简单的基线条件
2、确定如何缩小问题的规模,使其符合基线条件
编写涉及数组的递归函数时,基线条件通常是数组为空或者只包含一个元素。
第五章:
散列表(散列映射、映射、字典、关联数组)
散列表通过散列函数来确定元素的存储位置,是一种包含额外逻辑的数据结构
数组和链表都是直接映射到内存
散列表由键和值组成
DNS解析就是一个字典过程,将网址转换成IP地址
散列表具有数组的查找速度和链接的删除插入速度
第六章:
广度优先搜索(BFS)
一种图算法
可以用来计算最短距离
图由节点(node)和边(edge)组成
邻居
有向图,关系为单向的,有箭头
无向图,关系为双向的,无箭头
广度优先搜索可解决两类问题:
1、从节点A出发,有前往节点B的路径么?
2、从节点A出发,前往节点B的哪条路径最短?
算法时间:
O(V+E)
V:顶点数
E:边数
树是一种特殊的图,其中没有往后指的边
队列
入队与出队
先进先出结构 队列
先进后出结构 栈
第七章:
迪克斯特拉算法:
可以找出加权图中前往目标的最短路径
只适用于有向无环图
步骤:
1、找出最便宜的节点,即可在最短时间内前往的节点
2、对于该节点的邻居,检查是否有前往他们的更短路径,如果有,就更新其开销
3、重复这个过程,直到对图中的每个节点都这样做了
4、计算最终路径
加权图:
提高或降低某些边的权重
图中的环
不能将迪克斯特拉算法用于包含负权边的图
在包含负权边的图中,要找出最短路径,可采用 贝尔曼-福德算法
第八章:
贪婪算法:
每一步都选择局部最优解,最终企图得到的就是全局最优解
此算法有bug
有可能只解出近似解,而不是最优解
但执行很简单
贪婪算法是一种近似算法
判断近似算法的优劣标准:
1、速度有多快
2、得到的近似解与最优解的接近程度
NP完全问题
NP完全问题不用寻找完美解决方案,一般采用近似算法
一般涉及组合,集合,序列问题,都很有可能是NP完全问题。
比如旅行商问题和集合覆盖问题
第九章:
动态规划:
需要在给定约束条件下优化某种指标时,动态规划很管用。
原理:先解决子问题,再逐步解决大问题
将问题进行网格化划分。
单元格中的值通常就是你要优化的值。
每个单元格都是一个子问题。
仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用
最长公共子串
最长公共子序列
第十章:
K最近邻算法:
分类
可以用来创建分类系统
特征提取,进行数字化衡量
采用毕达哥拉斯公式进行距离相似度衡量
注意可以缩放数据尺寸,进行统一标准
或者进行权重分配,有所偏重
回归
回归就是预测结果
首先采用KNN找出最接近的几个邻居
邻居数量选择:一般总用户为n个,则选择sqrt(n)个
再对它们取平均值进行预测
余弦相似度,比较角度,而不是距离,可能更合理