一、数值列表
- 顺序存储数据
- 连续存储
- 任意顺序访问,可变大小的列表数据结构允许增加、删除元素
- 例如: 酒店空置房间的列表、城市的列表和书单
操作
- 创建一个空列表
- 确定此列表是否为空
- 确定列表中项目个数
- 在列表中给定位置添加项目
- 在列表中给定位置删除元素
- 删除列表中所有元素
- 获取列表中给定位置的项目
二、递归
基本思想:
- 可以把要解决的问题转化为一个子问题,而这个子问题的解决方法仍与原来的解决方法 相同,只是问题的规模变小了。
- 原问题可以通过子问题解决而组合解决。
- 基础案例:存在一种简单的情境,是问题在简单情境下退出。
- 如果你对程序逻辑不够小心,你可能会错过一个基本的例子并进入无限递归 编码时要非常小心,因为它很难调试
三、搜索与排序
- 顺序查找
- 折半搜索
- 二分搜索
冒泡排序
- 重复列表进行排序,比较每对相邻的项目,如果它 们的顺序错误,则交换它们
- 在每次通过时,未排序的最大元素已被“冒泡 ”到阵列末端的合适位置
- 重复列表直到不需要交换,这表明列表已被排序
属性:
- 稳定
- O(1)额外的空间
- O(n2)比较和交换
- 适应性:O(n)接近排序时
选择排序
- 列表上的2个线性传递
- 在每次通过时,它会选择最小的值
- 用最后一个未分类元素交换它
属性
- 不稳定
- O(1)额外的空间
- O(n2)对比
- O(n)互换
- 费适应性
插入排序
- 在每次通过时,当前项目被插入列表的排序部分
- 它从排序列表的最后一个位置开始,向后移动直到找到当前 项目的正确位置
- 然后将该项插入该位置,之后所有项目都被拖曳到左边以适 应它
折半插入排序
- 不是每次对正确的位置进行线性搜索,而是进行二进制搜索,这是O(log n)而不是O(n)
- 这带来了最佳铸造成本为O(n log n)
- 唯一的问题是,即使项目处于当前位置,它也必须执 行二分搜索
- 由于有可能将所有其他元素从每一道传递到列表中,所以最坏情况下的运行时间保持在O(n2)
希尔排序
- 插入排序的简单扩展,通过允许相隔很远的元素交换来获得速度
- 逐步缩小要比较的元素之间的差距
- 从相距甚远的元素开始,可以将一些不适合的元素移动到比简单的最近邻居交换更快的位 置
- 希尔排序的运行时间很大程度上取决于它使用的间隙顺序
- 对于许多实际的变量,确定它们的时间复杂度仍然是一个公开的问题
还有计数排序、归并排序、分治排序、快速排序,分治法。。。。
四、链表
- 数据成员
- 操作
- 哈希
关键词有:循环链表、双向链表、哨兵节点、遍历链表、插入、删除、反转等
五、堆栈和队列
基本思想
堆栈:后进先出(LIFO)
- 将项添加到堆栈的顶部,隐藏堆栈上已经存在的任何项
- Pop:从堆栈顶部移除一个项目,并将此值返回给调用者
- 堆栈通常用更多的操作来实现
- 大小:返回堆栈中当前的项目数量
- Peek:返回堆栈的当前顶层元素而不删除它
- 堆栈可以通过数组或链表轻松实现
队列:先进先出(FIFO)
- 将一个项目添加到队列的末尾
- 从队列前面移除一个项目
- 堆栈通常用更多的操作来实现
- 大小:返回队列中当前的项目数量
- 返回队列的当前顶层元素而不删除它
- 返回堆栈的当前顶层元素而不删除它
- 队列可以通过(循环)数组或链表轻松实现
六、哈希表
关联数组、映射、特征表、字典
- 加入一对
- 删除一对
- 修改现存对当中的值
- 查找特定关键字对应的值
七、树
- 在计算机科学中,树是分层结构的抽象模型
- 一棵树由具有父子关系的节点组成:经常为时间牺牲空间-所有“洞”都浪费空间,依赖于元素的排序,这意味着内存块的排序
应用:
- 组织结构图
- 文件系统
- 编程环境
八、堆
- 集合(Collections)插入删除项;删除哪一项?
- 数组列表(Array List) 通过给定索引删除项
- 链表(Linked List) 通过迭代列表删除项
- 栈(Stack) 只能删除最近添加的项
- 队列(Queue) 删除最开始添加的项
- 哈希表(Hash Table) 根据给定关键值删除项
- 堆(Heap, or Priority queue) 删除最大/最小项
堆的应用
- 事件驱动模拟
- 图搜索
- 操作系统
- 计算机网络
- 任何需要得到最小值/最大值/优先级
关键词:完全二叉树、上浮、下沉、添加、删除最大值、下溢、上溢、最小堆、改变优先级等等
九、图论
- 图形操作
- 有多少顶点?
- 有多少个边缘?
- 添加一个新的顶点
- 添加一个新的边缘
- 获取所有邻居? (进出)
- U,V连接吗?
- 反转所有边缘?
- 获取2跳邻居
邻接矩阵图表示法:
邻接列表图表示法:
迷宫:
连通图:
- 在无向图中,若从顶点v到顶点w之间存在路径,则顶点v和w是连通的。
- 在有向图中,连接顶点v和顶点w的路径中所有的变都必须同向。
- 如果图中任意两点都是连通的,那么图被称作连通图。
还有深度优先搜索、广度优先搜索、最短路径、负循环等
十、双指针、滑动窗口
十一、动态规划
- 拆分:将一个复杂问题拆分成一系列的简单子问题,每一次解决一个子问题并将其结果存储起来。理想情况下用基于内存的数据结构。
- 查找:在下一次遇到相同的子问题的时候,直接查找之前计算过的结果而不是重新计算。理想情况下,使用这种方法可以以适当的增大内存占用为代价节省计算时间。
- 存储子问题的答案以避免从新计算的技术叫做记忆化
- 分治法:把问题拆分成若干独立子问题,解决每个子问题之后合并子问题的结果作为原始问题的结果。Top --- Down
- 动态规划:将问题拆分成一些列重复的子问题以得到越来越大的子问题的答案。Bottom -- Up
十二、贪心算法
在对问题求解时,总是做出在当前看来是最好的选择
基本思路:
- 建立数学模型来描述问题。
- 把求解的问题分成若干个子问题。
- 对每一子问题求解,得到子问题的局部最优解。
- 把子问题的解局部最优解合成原来解问题的一个解。
贪心策略适用的前提是:局部最优策略能导致产生全局最优解。
基本要素:
- 贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择 (贪心算法与动态规划算法的主要区 别,动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的 方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。)
- 当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该 问题可用动态规划算法或贪心算法求解的关键特征。
十三、位操作
- 按位操作是在单个字节的层面上对一个或多个位模式或二进制数字符号进行的操作。处理器支持这种快速简单的操作,而且可以用来比较和计算数值。
- 按位操作比除法快得多,是乘法的几倍速度,有时候也比加法快得多。