算法图解(摘抄笔记)

·  阅读 245

算法简介

算法的速度指的并非时间,而是操作数的增速

操作 数组 链表 散列表(平均) 最糟 二叉查找树
读取 O(1) O(n) O(1) O(n) O(logn)
插入 O(n) O(1) O(1) O(n) O(logn)
删除 O(n) O(1) O(1) O(n) O(logn)

选择排序

O(n^2),本来是,但通常忽略常数

递归

  1. 基线条件(使其不再调用自己)
  2. 递归条件

调用栈(用于存储多个函数的)-所用函数调用都进入调用栈

栈操作:压入和弹出

二分查找的递归条件:binary_search_basic(list,target,low,high)

基线条件:low > high

快速排序

分而治之(D&C)将问题逐步分解,处理列表的基线条件可能为空数组或仅一元素

quicksort(less) + [pivot] + quicksort(greater)

less:[i for i in array[1:] if i <= pivot]

基线:len(array) < 2

散列表

散列函数(将输入映射到数字),如果两个键映射到了同一个位置,就在这个位置存储一个链表

散列表(hash table)-缓存

一旦装填因子超过0.7,就该调整散列表的长度

广度优先搜索

BFS:找到两样东西之间的最短距离

总时长O(V+E),V是顶点,E是边数

图由节点和边组成

队列操作:入队和出队

队列是FIFO:先进先出,而栈是LIFO:后进先出

狄克斯特拉算法

找出最快的路径,边引入权重(非负),仅适用于有向无环图

流程:首先找到最低节点更新其邻居,其次找次低节点,直到结束

贪婪算法

每步都采取最优的做法,找到近似解

寻找局部最优解,企图以此获得全局最优解

动态规划

从小问题(需离散,互不依赖)着手,逐步解决大问题

CELL[i][j] = 两者中较大的哪个

  1. 上一个单元格的值(即CELL[i-1][j]的值)
  2. 当前商品的价值 + 剩余空间的价值(CELL[i-1][j-当前商品重量])

K最邻近算法

分类和回归,毕达哥拉斯公式

接下来如何做

二叉查找树,对于其中的每个节点,左子节点的值都比它小,而右子节点的值都比它大

分类:
阅读
标签:
分类:
阅读
标签:
收藏成功!
已添加到「」, 点击更改